From e7b997e58468fcf499da580170409bc32d06c182 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 29 Sep 2025 18:25:43 +0900 Subject: [PATCH 1/9] devup ui eslint plugin --- apps/landing/package.json | 8 +- apps/next/package.json | 2 +- apps/rsbuild/package.json | 4 +- apps/vite-lib/package.json | 4 +- apps/vite/package.json | 4 +- benchmark/next-chakra-ui/package.json | 2 +- benchmark/next-devup-ui-single/package.json | 2 +- benchmark/next-devup-ui/package.json | 2 +- benchmark/next-kuma-ui/package.json | 2 +- benchmark/next-mui/package.json | 2 +- benchmark/next-panda-css/package.json | 4 +- benchmark/next-stylex/package.json | 12 +- benchmark/next-tailwind/package.json | 2 +- benchmark/next-vanilla-extract/package.json | 2 +- package.json | 8 +- packages/components/package.json | 14 +- packages/eslint-plugin/README.md | 0 packages/eslint-plugin/package.json | 42 + .../eslint-plugin/src/__tests__/index.test.ts | 11 + .../__snapshots__/recommended.test.ts.snap | 14466 ++++++++++++++++ .../src/configs/__tests__/recommended.test.ts | 6 + .../eslint-plugin/src/configs/recommended.ts | 33 + packages/eslint-plugin/src/index.ts | 6 + .../src/rules/__tests__/index.test.ts | 8 + .../rules/css-utils-literal-only/README.md | 0 .../__tests__/index.test.ts | 88 + .../src/rules/css-utils-literal-only/index.ts | 25 + packages/eslint-plugin/src/rules/index.ts | 1 + .../src/rules/no-useless-responsive/README.md | 0 .../__tests__/index.test.ts | 56 + .../src/rules/no-useless-responsive/index.ts | 25 + .../rules/no-useless-tailing-nulls/README.md | 0 .../__tests__/index.test.ts | 64 + .../rules/no-useless-tailing-nulls/index.ts | 25 + packages/eslint-plugin/tsconfig.json | 26 + packages/eslint-plugin/vite.config.ts | 63 + packages/next-plugin/package.json | 2 +- packages/react/package.json | 2 +- packages/reset-css/package.json | 2 +- packages/rsbuild-plugin/package.json | 4 +- packages/webpack-plugin/package.json | 2 +- pnpm-lock.yaml | 1307 +- 42 files changed, 15807 insertions(+), 531 deletions(-) create mode 100644 packages/eslint-plugin/README.md create mode 100644 packages/eslint-plugin/package.json create mode 100644 packages/eslint-plugin/src/__tests__/index.test.ts create mode 100644 packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap create mode 100644 packages/eslint-plugin/src/configs/__tests__/recommended.test.ts create mode 100644 packages/eslint-plugin/src/configs/recommended.ts create mode 100644 packages/eslint-plugin/src/index.ts create mode 100644 packages/eslint-plugin/src/rules/__tests__/index.test.ts create mode 100644 packages/eslint-plugin/src/rules/css-utils-literal-only/README.md create mode 100644 packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts create mode 100644 packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts create mode 100644 packages/eslint-plugin/src/rules/index.ts create mode 100644 packages/eslint-plugin/src/rules/no-useless-responsive/README.md create mode 100644 packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts create mode 100644 packages/eslint-plugin/src/rules/no-useless-responsive/index.ts create mode 100644 packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md create mode 100644 packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts create mode 100644 packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts create mode 100644 packages/eslint-plugin/tsconfig.json create mode 100644 packages/eslint-plugin/vite.config.ts diff --git a/apps/landing/package.json b/apps/landing/package.json index 809833d6..a31d0981 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -16,17 +16,17 @@ "@devup-ui/reset-css": "workspace:*", "@mdx-js/loader": "^3.1.1", "@mdx-js/react": "^3.1.1", - "@next/mdx": "^15.5.3", + "@next/mdx": "^15.5.4", "@types/mdx": "^2.0.13", "body-scroll-lock": "3.1.5", "clsx": "^2.1.1", - "next": "^15.5.3", + "next": "^15.5.4", "react": "^19.1.1", "react-dom": "^19.1.1", "react-markdown": "^10.1.0", "react-syntax-highlighter": "^15.6.6", "remark-gfm": "^4.0.1", - "lenis": "1.3.11" + "lenis": "1.3.11" }, "devDependencies": { "@devup-ui/next-plugin": "workspace:*", @@ -39,4 +39,4 @@ "remark": "^15.0.1", "typescript": "^5" } -} \ No newline at end of file +} diff --git a/apps/next/package.json b/apps/next/package.json index 3da1fccf..9c1af65a 100644 --- a/apps/next/package.json +++ b/apps/next/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", - "next": "^15.5.3", + "next": "^15.5.4", "@devup-ui/react": "workspace:*" }, "devDependencies": { diff --git a/apps/rsbuild/package.json b/apps/rsbuild/package.json index 21ee119d..74760dd1 100644 --- a/apps/rsbuild/package.json +++ b/apps/rsbuild/package.json @@ -16,8 +16,8 @@ "@devup-ui/react": "workspace:*" }, "devDependencies": { - "@rsbuild/core": "^1.5.10", - "@rsbuild/plugin-react": "^1.4.0", + "@rsbuild/core": "^1.5.12", + "@rsbuild/plugin-react": "^1.4.1", "@devup-ui/rsbuild-plugin": "workspace:*" } } diff --git a/apps/vite-lib/package.json b/apps/vite-lib/package.json index 7154e899..75ec93b0 100644 --- a/apps/vite-lib/package.json +++ b/apps/vite-lib/package.json @@ -18,8 +18,8 @@ "devDependencies": { "vite-plugin-dts": "^4.5.4", "@devup-ui/vite-plugin": "workspace:*", - "@vitejs/plugin-react": "^5.0.3", - "vite": "^7.1.6", + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.7", "typescript": "^5", "@types/node": "^24", "@types/react": "^19" diff --git a/apps/vite/package.json b/apps/vite/package.json index 9900ac12..ac3fb35f 100644 --- a/apps/vite/package.json +++ b/apps/vite/package.json @@ -17,8 +17,8 @@ }, "devDependencies": { "@devup-ui/vite-plugin": "workspace:*", - "vite": "^7.1.6", - "@vitejs/plugin-react": "^5.0.3", + "vite": "^7.1.7", + "@vitejs/plugin-react": "^5.0.4", "typescript": "^5", "@types/node": "^24", "@types/react": "^19", diff --git a/benchmark/next-chakra-ui/package.json b/benchmark/next-chakra-ui/package.json index 7862ceb7..9b978a6e 100644 --- a/benchmark/next-chakra-ui/package.json +++ b/benchmark/next-chakra-ui/package.json @@ -12,7 +12,7 @@ "dependencies": { "@chakra-ui/react": "^3.27.0", "@emotion/react": "^11.14.0", - "next": "^15.5.3", + "next": "^15.5.4", "next-themes": "^0.4.6", "react": "^19.1.1", "react-dom": "^19.1.1", diff --git a/benchmark/next-devup-ui-single/package.json b/benchmark/next-devup-ui-single/package.json index 64f8711c..3490f43a 100644 --- a/benchmark/next-devup-ui-single/package.json +++ b/benchmark/next-devup-ui-single/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", - "next": "^15.5.3", + "next": "^15.5.4", "@devup-ui/react": "workspace:*" }, "devDependencies": { diff --git a/benchmark/next-devup-ui/package.json b/benchmark/next-devup-ui/package.json index 884eb5c8..cdcaddb4 100644 --- a/benchmark/next-devup-ui/package.json +++ b/benchmark/next-devup-ui/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", - "next": "^15.5.3", + "next": "^15.5.4", "@devup-ui/react": "workspace:*" }, "devDependencies": { diff --git a/benchmark/next-kuma-ui/package.json b/benchmark/next-kuma-ui/package.json index c398cc6e..207b6618 100644 --- a/benchmark/next-kuma-ui/package.json +++ b/benchmark/next-kuma-ui/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", - "next": "^15.5.3", + "next": "^15.5.4", "@kuma-ui/core": "^1.5.9" }, "devDependencies": { diff --git a/benchmark/next-mui/package.json b/benchmark/next-mui/package.json index b35d0c8f..f8fa0f9d 100644 --- a/benchmark/next-mui/package.json +++ b/benchmark/next-mui/package.json @@ -13,7 +13,7 @@ "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/material": "7.3.2", - "next": "^15.5.3", + "next": "^15.5.4", "react": "^19.1.1", "react-dom": "^19.1.1", "react-icons": "^5.5.0" diff --git a/benchmark/next-panda-css/package.json b/benchmark/next-panda-css/package.json index 686950a8..10a7e38c 100644 --- a/benchmark/next-panda-css/package.json +++ b/benchmark/next-panda-css/package.json @@ -13,10 +13,10 @@ "dependencies": { "react": "^19.1.1", "react-dom": "^19.1.1", - "next": "^15.5.3" + "next": "^15.5.4" }, "devDependencies": { - "@pandacss/dev": "^1.3", + "@pandacss/dev": "^1.4", "typescript": "^5", "@types/node": "^24", "@types/react": "^19", diff --git a/benchmark/next-stylex/package.json b/benchmark/next-stylex/package.json index 0e284970..be3cd1b8 100644 --- a/benchmark/next-stylex/package.json +++ b/benchmark/next-stylex/package.json @@ -12,9 +12,9 @@ }, "dependencies": { "@stylexjs/open-props": "^0.11.1", - "@stylexjs/stylex": "^0.15.4", + "@stylexjs/stylex": "^0.16.0", "bright": "^1.0.0", - "next": "15.5.3", + "next": "15.5.4", "react": "19.1.1", "react-dom": "19.1.1" }, @@ -23,15 +23,15 @@ "@babel/plugin-syntax-flow": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", - "@stylexjs/babel-plugin": "^0.15.4", - "@stylexjs/eslint-plugin": "^0.15.4", + "@stylexjs/babel-plugin": "^0.16.0", + "@stylexjs/eslint-plugin": "^0.16.0", "@stylexjs/nextjs-plugin": "^0.11.1", "@types/node": "24.5.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "@types/react-test-renderer": "^19.1.0", "eslint": "9.36.0", - "eslint-config-next": "15.5.3", + "eslint-config-next": "15.5.4", "prettier": "^3.6.2", "react-test-renderer": "^19.1.1", "rimraf": "^6.0.1", diff --git a/benchmark/next-tailwind/package.json b/benchmark/next-tailwind/package.json index ec87a173..e932b4f4 100644 --- a/benchmark/next-tailwind/package.json +++ b/benchmark/next-tailwind/package.json @@ -10,7 +10,7 @@ "lint": "next lint" }, "dependencies": { - "next": "^15.5.3", + "next": "^15.5.4", "react": "^19.1.1", "react-dom": "^19.1.1", "react-icons": "^5.5.0" diff --git a/benchmark/next-vanilla-extract/package.json b/benchmark/next-vanilla-extract/package.json index e42d317a..304834ea 100644 --- a/benchmark/next-vanilla-extract/package.json +++ b/benchmark/next-vanilla-extract/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@vanilla-extract/css": "^1.17.4", - "next": "^15.5.3", + "next": "^15.5.4", "react": "^19.1.1", "react-dom": "^19.1.1", "react-icons": "^5.5.0" diff --git a/package.json b/package.json index b96bea0d..eedcf8ad 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,18 @@ "@testing-library/user-event": "14.6.1", "@types/node": "^24.5.2", "@vitest/coverage-v8": "^3.2.4", - "eslint": "^9.35.0", + "eslint": "^9.36.0", "eslint-plugin-devup": "^2.0.5", "eslint-plugin-jsonc": "^2.20.1", "eslint-plugin-mdx": "^3.6.2", "globals": "^16.4.0", - "happy-dom": "^18.0.1", + "happy-dom": "^19.0.1", "husky": "^9.1.7", - "lint-staged": "^16.1.6", + "lint-staged": "^16.2.3", "vitest": "^3.2.4" }, "author": "devfive", - "packageManager": "pnpm@10.17.0", + "packageManager": "pnpm@10.17.1", "resolutions": { "vite": "^6" } diff --git a/packages/components/package.json b/packages/components/package.json index 9a54dbeb..acd704bd 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -49,15 +49,15 @@ }, "devDependencies": { "@devup-ui/vite-plugin": "workspace:*", - "@storybook/addon-docs": "^9.1.7", - "@storybook/addon-onboarding": "^9.1.7", - "@storybook/react-vite": "^9.1.7", - "@types/react": "^19.1.13", - "eslint-plugin-storybook": "^9.1.7", + "@storybook/addon-docs": "^9.1.8", + "@storybook/addon-onboarding": "^9.1.8", + "@storybook/react-vite": "^9.1.8", + "@types/react": "^19.1.15", + "eslint-plugin-storybook": "^9.1.8", "rollup-plugin-preserve-directives": "^0.4.0", - "storybook": "^9.1.7", + "storybook": "^9.1.8", "typescript": "^5.9.2", - "vite": "^7.1.6", + "vite": "^7.1.7", "vite-plugin-dts": "^4.5.4", "vitest": "^3.2.4" }, diff --git a/packages/eslint-plugin/README.md b/packages/eslint-plugin/README.md new file mode 100644 index 00000000..e69de29b diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json new file mode 100644 index 00000000..c314c37d --- /dev/null +++ b/packages/eslint-plugin/package.json @@ -0,0 +1,42 @@ +{ + "name": "@devup-ui/eslint-plugin", + "version": "0.1.0", + "description": "eslint plugin for devup-ui", + "main": "dist/index.cjs", + "type": "module", + "scripts": { + "test": "vitest run --coverage", + "test:s": "vitest run -u", + "lint": "eslint", + "build": "tsc && vite build" + }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "files": [ + "dist" + ], + "keywords": [ + "eslint" + ], + "author": "devfive", + "license": "ISC", + "dependencies": { + "typescript-eslint": "^8.44" + }, + "devDependencies": { + "@types/eslint": "^9.6", + "@types/eslint__js": "^9.14", + "@typescript-eslint/rule-tester": "^8.44", + "@typescript-eslint/utils": "^8.44", + "@vitest/coverage-v8": "3.2.4", + "eslint-plugin-eslint-plugin": "^7.0.0", + "typescript": "^5.9.2", + "vite": "^7.1.7", + "vite-plugin-dts": "^4.5.4", + "vitest": "^3.2.4" + } +} diff --git a/packages/eslint-plugin/src/__tests__/index.test.ts b/packages/eslint-plugin/src/__tests__/index.test.ts new file mode 100644 index 00000000..e163ea00 --- /dev/null +++ b/packages/eslint-plugin/src/__tests__/index.test.ts @@ -0,0 +1,11 @@ +import * as index from '../index' +describe('export index', () => { + it('export', () => { + expect({ ...index }).toEqual({ + rules: expect.any(Object), + configs: { + recommended: expect.any(Object), + }, + }) + }) +}) diff --git a/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap b/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap new file mode 100644 index 00000000..f1ac655a --- /dev/null +++ b/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap @@ -0,0 +1,14466 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`recommended > export recommended config 1`] = ` +[ + { + "ignores": [ + "**/node_modules/", + "**/build/", + "**/__snapshots__/", + "!**/src/**", + "!vite.config.ts", + "!**/.storybook/**", + "**/storybook-static/", + "**/dist/", + "**/next-env.d.ts", + "**/out/", + "**/.next/", + "**/public/", + "**/.df/", + ], + }, + { + "languageOptions": { + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + }, + }, + }, + "plugins": { + "react": { + "configs": { + "all": { + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + }, + }, + "plugins": [ + "react", + ], + "rules": { + "react/boolean-prop-naming": 2, + "react/button-has-type": 2, + "react/checked-requires-onchange-or-readonly": 2, + "react/default-props-match-prop-types": 2, + "react/destructuring-assignment": 2, + "react/display-name": 2, + "react/forbid-component-props": 2, + "react/forbid-dom-props": 2, + "react/forbid-elements": 2, + "react/forbid-foreign-prop-types": 2, + "react/forbid-prop-types": 2, + "react/forward-ref-uses-ref": 2, + "react/function-component-definition": 2, + "react/hook-use-state": 2, + "react/iframe-missing-sandbox": 2, + "react/jsx-boolean-value": 2, + "react/jsx-child-element-spacing": 2, + "react/jsx-closing-bracket-location": 2, + "react/jsx-closing-tag-location": 2, + "react/jsx-curly-brace-presence": 2, + "react/jsx-curly-newline": 2, + "react/jsx-curly-spacing": 2, + "react/jsx-equals-spacing": 2, + "react/jsx-filename-extension": 2, + "react/jsx-first-prop-new-line": 2, + "react/jsx-fragments": 2, + "react/jsx-handler-names": 2, + "react/jsx-indent": 2, + "react/jsx-indent-props": 2, + "react/jsx-key": 2, + "react/jsx-max-depth": 2, + "react/jsx-max-props-per-line": 2, + "react/jsx-newline": 2, + "react/jsx-no-bind": 2, + "react/jsx-no-comment-textnodes": 2, + "react/jsx-no-constructed-context-values": 2, + "react/jsx-no-duplicate-props": 2, + "react/jsx-no-leaked-render": 2, + "react/jsx-no-literals": 2, + "react/jsx-no-script-url": 2, + "react/jsx-no-target-blank": 2, + "react/jsx-no-undef": 2, + "react/jsx-no-useless-fragment": 2, + "react/jsx-one-expression-per-line": 2, + "react/jsx-pascal-case": 2, + "react/jsx-props-no-multi-spaces": 2, + "react/jsx-props-no-spread-multi": 2, + "react/jsx-props-no-spreading": 2, + "react/jsx-sort-props": 2, + "react/jsx-tag-spacing": 2, + "react/jsx-uses-react": 2, + "react/jsx-uses-vars": 2, + "react/jsx-wrap-multilines": 2, + "react/no-access-state-in-setstate": 2, + "react/no-adjacent-inline-elements": 2, + "react/no-array-index-key": 2, + "react/no-arrow-function-lifecycle": 2, + "react/no-children-prop": 2, + "react/no-danger": 2, + "react/no-danger-with-children": 2, + "react/no-deprecated": 2, + "react/no-did-mount-set-state": 2, + "react/no-did-update-set-state": 2, + "react/no-direct-mutation-state": 2, + "react/no-find-dom-node": 2, + "react/no-invalid-html-attribute": 2, + "react/no-is-mounted": 2, + "react/no-multi-comp": 2, + "react/no-namespace": 2, + "react/no-object-type-as-default-prop": 2, + "react/no-redundant-should-component-update": 2, + "react/no-render-return-value": 2, + "react/no-set-state": 2, + "react/no-string-refs": 2, + "react/no-this-in-sfc": 2, + "react/no-typos": 2, + "react/no-unescaped-entities": 2, + "react/no-unknown-property": 2, + "react/no-unsafe": 2, + "react/no-unstable-nested-components": 2, + "react/no-unused-class-component-methods": 2, + "react/no-unused-prop-types": 2, + "react/no-unused-state": 2, + "react/no-will-update-set-state": 2, + "react/prefer-es6-class": 2, + "react/prefer-exact-props": 2, + "react/prefer-read-only-props": 2, + "react/prefer-stateless-function": 2, + "react/prop-types": 2, + "react/react-in-jsx-scope": 2, + "react/require-default-props": 2, + "react/require-optimization": 2, + "react/require-render-return": 2, + "react/self-closing-comp": 2, + "react/sort-comp": 2, + "react/sort-default-props": 2, + "react/sort-prop-types": 2, + "react/state-in-constructor": 2, + "react/static-property-placement": 2, + "react/style-prop-object": 2, + "react/void-dom-elements-no-children": 2, + }, + }, + "flat": { + "all": { + "languageOptions": { + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + }, + }, + }, + "plugins": { + "react": [Circular], + }, + "rules": { + "react/boolean-prop-naming": 2, + "react/button-has-type": 2, + "react/checked-requires-onchange-or-readonly": 2, + "react/default-props-match-prop-types": 2, + "react/destructuring-assignment": 2, + "react/display-name": 2, + "react/forbid-component-props": 2, + "react/forbid-dom-props": 2, + "react/forbid-elements": 2, + "react/forbid-foreign-prop-types": 2, + "react/forbid-prop-types": 2, + "react/forward-ref-uses-ref": 2, + "react/function-component-definition": 2, + "react/hook-use-state": 2, + "react/iframe-missing-sandbox": 2, + "react/jsx-boolean-value": 2, + "react/jsx-child-element-spacing": 2, + "react/jsx-closing-bracket-location": 2, + "react/jsx-closing-tag-location": 2, + "react/jsx-curly-brace-presence": 2, + "react/jsx-curly-newline": 2, + "react/jsx-curly-spacing": 2, + "react/jsx-equals-spacing": 2, + "react/jsx-filename-extension": 2, + "react/jsx-first-prop-new-line": 2, + "react/jsx-fragments": 2, + "react/jsx-handler-names": 2, + "react/jsx-indent": 2, + "react/jsx-indent-props": 2, + "react/jsx-key": 2, + "react/jsx-max-depth": 2, + "react/jsx-max-props-per-line": 2, + "react/jsx-newline": 2, + "react/jsx-no-bind": 2, + "react/jsx-no-comment-textnodes": 2, + "react/jsx-no-constructed-context-values": 2, + "react/jsx-no-duplicate-props": 2, + "react/jsx-no-leaked-render": 2, + "react/jsx-no-literals": 2, + "react/jsx-no-script-url": 2, + "react/jsx-no-target-blank": 2, + "react/jsx-no-undef": 2, + "react/jsx-no-useless-fragment": 2, + "react/jsx-one-expression-per-line": 2, + "react/jsx-pascal-case": 2, + "react/jsx-props-no-multi-spaces": 2, + "react/jsx-props-no-spread-multi": 2, + "react/jsx-props-no-spreading": 2, + "react/jsx-sort-props": 2, + "react/jsx-tag-spacing": 2, + "react/jsx-uses-react": 2, + "react/jsx-uses-vars": 2, + "react/jsx-wrap-multilines": 2, + "react/no-access-state-in-setstate": 2, + "react/no-adjacent-inline-elements": 2, + "react/no-array-index-key": 2, + "react/no-arrow-function-lifecycle": 2, + "react/no-children-prop": 2, + "react/no-danger": 2, + "react/no-danger-with-children": 2, + "react/no-deprecated": 2, + "react/no-did-mount-set-state": 2, + "react/no-did-update-set-state": 2, + "react/no-direct-mutation-state": 2, + "react/no-find-dom-node": 2, + "react/no-invalid-html-attribute": 2, + "react/no-is-mounted": 2, + "react/no-multi-comp": 2, + "react/no-namespace": 2, + "react/no-object-type-as-default-prop": 2, + "react/no-redundant-should-component-update": 2, + "react/no-render-return-value": 2, + "react/no-set-state": 2, + "react/no-string-refs": 2, + "react/no-this-in-sfc": 2, + "react/no-typos": 2, + "react/no-unescaped-entities": 2, + "react/no-unknown-property": 2, + "react/no-unsafe": 2, + "react/no-unstable-nested-components": 2, + "react/no-unused-class-component-methods": 2, + "react/no-unused-prop-types": 2, + "react/no-unused-state": 2, + "react/no-will-update-set-state": 2, + "react/prefer-es6-class": 2, + "react/prefer-exact-props": 2, + "react/prefer-read-only-props": 2, + "react/prefer-stateless-function": 2, + "react/prop-types": 2, + "react/react-in-jsx-scope": 2, + "react/require-default-props": 2, + "react/require-optimization": 2, + "react/require-render-return": 2, + "react/self-closing-comp": 2, + "react/sort-comp": 2, + "react/sort-default-props": 2, + "react/sort-prop-types": 2, + "react/state-in-constructor": 2, + "react/static-property-placement": 2, + "react/style-prop-object": 2, + "react/void-dom-elements-no-children": 2, + }, + }, + "jsx-runtime": { + "languageOptions": { + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + }, + "jsxPragma": null, + }, + }, + "plugins": { + "react": [Circular], + }, + "rules": { + "react/jsx-uses-react": 0, + "react/react-in-jsx-scope": 0, + }, + }, + "recommended": [Circular], + }, + "jsx-runtime": { + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + }, + "jsxPragma": null, + }, + "plugins": [ + "react", + ], + "rules": { + "react/jsx-uses-react": 0, + "react/react-in-jsx-scope": 0, + }, + }, + "recommended": { + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + }, + }, + "plugins": [ + "react", + ], + "rules": { + "react/display-name": 2, + "react/jsx-key": 2, + "react/jsx-no-comment-textnodes": 2, + "react/jsx-no-duplicate-props": 2, + "react/jsx-no-target-blank": 2, + "react/jsx-no-undef": 2, + "react/jsx-uses-react": 2, + "react/jsx-uses-vars": 2, + "react/no-children-prop": 2, + "react/no-danger-with-children": 2, + "react/no-deprecated": 2, + "react/no-direct-mutation-state": 2, + "react/no-find-dom-node": 2, + "react/no-is-mounted": 2, + "react/no-render-return-value": 2, + "react/no-string-refs": 2, + "react/no-unescaped-entities": 2, + "react/no-unknown-property": 2, + "react/no-unsafe": 0, + "react/prop-types": 2, + "react/react-in-jsx-scope": 2, + "react/require-render-return": 2, + }, + }, + }, + "deprecatedRules": { + "jsx-sort-default-props": { + "create": [Function], + "meta": { + "deprecated": true, + "docs": { + "category": "Stylistic Issues", + "description": "Enforce defaultProps declarations alphabetical sorting", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-sort-default-props.md", + }, + "messages": { + "propsNotSorted": "Default prop types declarations should be sorted alphabetically", + }, + "replacedBy": [ + "sort-default-props", + ], + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-space-before-closing": { + "create": [Function], + "meta": { + "deprecated": true, + "docs": { + "category": "Stylistic Issues", + "description": "Enforce spacing before closing bracket in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-space-before-closing.md", + }, + "fixable": "code", + "messages": { + "needSpaceBeforeClose": "A space is required before closing bracket", + "noSpaceBeforeClose": "A space is forbidden before closing bracket", + }, + "replacedBy": [ + "jsx-tag-spacing", + ], + "schema": [ + { + "enum": [ + "always", + "never", + ], + }, + ], + }, + }, + }, + "rules": { + "boolean-prop-naming": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforces consistent naming for boolean props", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/boolean-prop-naming.md", + }, + "messages": { + "patternMismatch": "Prop name \`{{propName}}\` doesn’t match rule \`{{pattern}}\`", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "message": { + "minLength": 1, + "type": "string", + }, + "propTypeNames": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "rule": { + "default": "^(is|has)[A-Z]([A-Za-z0-9]?)+", + "minLength": 1, + "type": "string", + }, + "validateNested": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "button-has-type": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow usage of \`button\` elements without an explicit \`type\` attribute", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/button-has-type.md", + }, + "messages": { + "complexType": "The button type attribute must be specified by a static string or a trivial ternary expression", + "forbiddenValue": ""{{value}}" is an invalid value for button type attribute", + "invalidValue": ""{{value}}" is an invalid value for button type attribute", + "missingType": "Missing an explicit type attribute for button", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "button": { + "default": true, + "type": "boolean", + }, + "reset": { + "default": true, + "type": "boolean", + }, + "submit": { + "default": true, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "checked-requires-onchange-or-readonly": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Enforce using \`onChange\` or \`readonly\` attribute when \`checked\` is used", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/checked-requires-onchange-or-readonly.md", + }, + "messages": { + "exclusiveCheckedAttribute": "Use either \`checked\` or \`defaultChecked\`, but not both.", + "missingProperty": "\`checked\` should be used with either \`onChange\` or \`readOnly\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreExclusiveCheckedAttribute": { + "type": "boolean", + }, + "ignoreMissingProperties": { + "type": "boolean", + }, + }, + }, + ], + }, + }, + "default-props-match-prop-types": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Enforce all defaultProps have a corresponding non-required PropType", + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/default-props-match-prop-types.md", + }, + "messages": { + "defaultHasNoType": "defaultProp "{{name}}" has no corresponding propTypes declaration.", + "requiredHasDefault": "defaultProp "{{name}}" defined for isRequired propType.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowRequiredDefaults": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "destructuring-assignment": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce consistent usage of destructuring assignment of props, state, and context", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/destructuring-assignment.md", + }, + "fixable": "code", + "messages": { + "destructureInSignature": "Must destructure props in the function signature.", + "noDestructAssignment": "Must never use destructuring {{type}} assignment", + "noDestructContextInSFCArg": "Must never use destructuring context assignment in SFC argument", + "noDestructPropsInSFCArg": "Must never use destructuring props assignment in SFC argument", + "useDestructAssignment": "Must use destructuring {{type}} assignment", + }, + "schema": [ + { + "enum": [ + "always", + "never", + ], + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "destructureInSignature": { + "enum": [ + "always", + "ignore", + ], + "type": "string", + }, + "ignoreClassFields": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "display-name": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow missing displayName in a React component definition", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/display-name.md", + }, + "messages": { + "noContextDisplayName": "Context definition is missing display name", + "noDisplayName": "Component definition is missing display name", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "checkContextObjects": { + "type": "boolean", + }, + "ignoreTranspilerName": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "forbid-component-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow certain props on components", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-component-props.md", + }, + "messages": { + "propIsForbidden": "Prop "{{prop}}" is forbidden on Components", + }, + "schema": [ + { + "properties": { + "forbid": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "allowedFor": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "allowedForPatterns": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "message": { + "type": "string", + }, + "propName": { + "type": "string", + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "disallowedFor", + ], + }, + { + "required": [ + "disallowedForPatterns", + ], + }, + ], + "properties": { + "disallowedFor": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "disallowedForPatterns": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "message": { + "type": "string", + }, + "propName": { + "type": "string", + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "allowedFor": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "allowedForPatterns": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "message": { + "type": "string", + }, + "propNamePattern": { + "type": "string", + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "disallowedFor", + ], + }, + { + "required": [ + "disallowedForPatterns", + ], + }, + ], + "properties": { + "disallowedFor": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "disallowedForPatterns": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "message": { + "type": "string", + }, + "propNamePattern": { + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "forbid-dom-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow certain props on DOM Nodes", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-dom-props.md", + }, + "messages": { + "propIsForbidden": "Prop "{{prop}}" is forbidden on DOM Nodes", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "forbid": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "properties": { + "disallowedFor": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "message": { + "type": "string", + }, + "propName": { + "type": "string", + }, + }, + "type": "object", + }, + ], + "minLength": 1, + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + }, + }, + "forbid-elements": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow certain elements", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-elements.md", + }, + "messages": { + "forbiddenElement": "<{{element}}> is forbidden", + "forbiddenElement_message": "<{{element}}> is forbidden, {{message}}", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "forbid": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "element": { + "type": "string", + }, + "message": { + "type": "string", + }, + }, + "required": [ + "element", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "forbid-foreign-prop-types": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow using another component's propTypes", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-foreign-prop-types.md", + }, + "messages": { + "forbiddenPropType": "Using propTypes from another component is not safe because they may be removed in production builds", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowInPropTypes": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "forbid-prop-types": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow certain propTypes", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-prop-types.md", + }, + "messages": { + "forbiddenPropType": "Prop type "{{target}}" is forbidden", + }, + "schema": [ + { + "additionalProperties": true, + "properties": { + "checkChildContextTypes": { + "type": "boolean", + }, + "checkContextTypes": { + "type": "boolean", + }, + "forbid": { + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "forward-ref-uses-ref": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Require all forwardRef components include a ref parameter", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forward-ref-uses-ref.md", + }, + "hasSuggestions": true, + "messages": { + "addRefParameter": "Add a ref parameter", + "missingRefParameter": "forwardRef is used with this component but no ref parameter is set", + "removeForwardRef": "Remove forwardRef wrapper", + }, + "schema": [], + "type": "suggestion", + }, + }, + "function-component-definition": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce a specific function type for function components", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/function-component-definition.md", + }, + "fixable": "code", + "messages": { + "arrow-function": "Function component is not an arrow function", + "function-declaration": "Function component is not a function declaration", + "function-expression": "Function component is not a function expression", + }, + "schema": [ + { + "properties": { + "namedComponents": { + "anyOf": [ + { + "enum": [ + "function-declaration", + "arrow-function", + "function-expression", + ], + }, + { + "items": { + "enum": [ + "function-declaration", + "arrow-function", + "function-expression", + ], + "type": "string", + }, + "type": "array", + }, + ], + }, + "unnamedComponents": { + "anyOf": [ + { + "enum": [ + "arrow-function", + "function-expression", + ], + }, + { + "items": { + "enum": [ + "arrow-function", + "function-expression", + ], + "type": "string", + }, + "type": "array", + }, + ], + }, + }, + "type": "object", + }, + ], + }, + }, + "hook-use-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Ensure destructuring and symmetric naming of useState hook value and setter variables", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/hook-use-state.md", + }, + "hasSuggestions": true, + "messages": { + "suggestMemo": "Replace useState call with useMemo", + "suggestPair": "Destructure useState call into value + setter pair", + "useStateErrorMessage": "useState call is not destructured into value + setter pair", + "useStateErrorMessageOrAddOption": "useState call is not destructured into value + setter pair (you can allow destructuring by enabling "allowDestructuredState" option)", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowDestructuredState": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "iframe-missing-sandbox": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Enforce sandbox attribute on iframe elements", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/iframe-missing-sandbox.md", + }, + "messages": { + "attributeMissing": "An iframe element is missing a sandbox attribute", + "invalidCombination": "An iframe element defines a sandbox attribute with both allow-scripts and allow-same-origin which is invalid", + "invalidValue": "An iframe element defines a sandbox attribute with invalid value "{{ value }}"", + }, + "schema": [], + }, + }, + "jsx-boolean-value": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce boolean attributes notation in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-boolean-value.md", + }, + "fixable": "code", + "messages": { + "omitBoolean": "Value must be omitted for boolean attribute \`{{propName}}\`", + "omitPropAndBoolean": "Value must be omitted for \`false\` attribute: \`{{propName}}\`", + "setBoolean": "Value must be set for boolean attribute \`{{propName}}\`", + }, + "schema": { + "anyOf": [ + { + "additionalItems": false, + "items": [ + { + "enum": [ + "always", + "never", + ], + }, + ], + "type": "array", + }, + { + "additionalItems": false, + "items": [ + { + "enum": [ + "always", + ], + }, + { + "additionalProperties": false, + "properties": { + "assumeUndefinedIsFalse": { + "type": "boolean", + }, + "never": { + "items": { + "minLength": 1, + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + { + "additionalItems": false, + "items": [ + { + "enum": [ + "never", + ], + }, + { + "additionalProperties": false, + "properties": { + "always": { + "items": { + "minLength": 1, + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "assumeUndefinedIsFalse": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + ], + }, + }, + }, + "jsx-child-element-spacing": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce or disallow spaces inside of curly braces in JSX attributes and expressions", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-child-element-spacing.md", + }, + "fixable": null, + "messages": { + "spacingAfterPrev": "Ambiguous spacing after previous element {{element}}", + "spacingBeforeNext": "Ambiguous spacing before next element {{element}}", + }, + "schema": [], + }, + }, + "jsx-closing-bracket-location": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce closing bracket location in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-closing-bracket-location.md", + }, + "fixable": "code", + "messages": { + "bracketLocation": "The closing bracket must be {{location}}{{details}}", + }, + "schema": [ + { + "anyOf": [ + { + "enum": [ + "after-props", + "props-aligned", + "tag-aligned", + "line-aligned", + ], + }, + { + "additionalProperties": false, + "properties": { + "location": { + "enum": [ + "after-props", + "props-aligned", + "tag-aligned", + "line-aligned", + ], + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "nonEmpty": { + "enum": [ + "after-props", + "props-aligned", + "tag-aligned", + "line-aligned", + false, + ], + }, + "selfClosing": { + "enum": [ + "after-props", + "props-aligned", + "tag-aligned", + "line-aligned", + false, + ], + }, + }, + "type": "object", + }, + ], + }, + ], + }, + }, + "jsx-closing-tag-location": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce closing tag location for multiline JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-closing-tag-location.md", + }, + "fixable": "whitespace", + "messages": { + "alignWithOpening": "Expected closing tag to be aligned with the line containing the opening tag", + "matchIndent": "Expected closing tag to match indentation of opening.", + "onOwnLine": "Closing tag of a multiline JSX expression must be on its own line.", + }, + "schema": [ + { + "anyOf": [ + { + "enum": [ + "tag-aligned", + "line-aligned", + ], + }, + { + "additionalProperties": false, + "properties": { + "location": { + "enum": [ + "tag-aligned", + "line-aligned", + ], + }, + }, + "type": "object", + }, + ], + }, + ], + }, + }, + "jsx-curly-brace-presence": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow unnecessary JSX expressions when literals alone are sufficient or enforce JSX expressions on literals in JSX children or attributes", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-curly-brace-presence.md", + }, + "fixable": "code", + "messages": { + "missingCurly": "Need to wrap this literal in a JSX expression.", + "unnecessaryCurly": "Curly braces are unnecessary here.", + }, + "schema": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "children": { + "enum": [ + "always", + "never", + "ignore", + ], + }, + "propElementValues": { + "enum": [ + "always", + "never", + "ignore", + ], + }, + "props": { + "enum": [ + "always", + "never", + "ignore", + ], + }, + }, + "type": "object", + }, + { + "enum": [ + "always", + "never", + "ignore", + ], + }, + ], + }, + ], + }, + }, + "jsx-curly-newline": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce consistent linebreaks in curly braces in JSX attributes and expressions", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-curly-newline.md", + }, + "fixable": "whitespace", + "messages": { + "expectedAfter": "Expected newline after '{'.", + "expectedBefore": "Expected newline before '}'.", + "unexpectedAfter": "Unexpected newline after '{'.", + "unexpectedBefore": "Unexpected newline before '}'.", + }, + "schema": [ + { + "anyOf": [ + { + "enum": [ + "consistent", + "never", + ], + }, + { + "additionalProperties": false, + "properties": { + "multiline": { + "enum": [ + "consistent", + "require", + "forbid", + ], + }, + "singleline": { + "enum": [ + "consistent", + "require", + "forbid", + ], + }, + }, + "type": "object", + }, + ], + }, + ], + "type": "layout", + }, + }, + "jsx-curly-spacing": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce or disallow spaces inside of curly braces in JSX attributes and expressions", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-curly-spacing.md", + }, + "fixable": "code", + "messages": { + "noNewlineAfter": "There should be no newline after '{{token}}'", + "noNewlineBefore": "There should be no newline before '{{token}}'", + "noSpaceAfter": "There should be no space after '{{token}}'", + "noSpaceBefore": "There should be no space before '{{token}}'", + "spaceNeededAfter": "A space is required after '{{token}}'", + "spaceNeededBefore": "A space is required before '{{token}}'", + }, + "schema": { + "definitions": { + "basicConfig": { + "properties": { + "allowMultiline": { + "type": "boolean", + }, + "spacing": { + "properties": { + "objectLiterals": { + "enum": [ + "always", + "never", + ], + }, + }, + "type": "object", + }, + "when": { + "enum": [ + "always", + "never", + ], + }, + }, + "type": "object", + }, + "basicConfigOrBoolean": { + "anyOf": [ + { + "$ref": "#/definitions/basicConfig", + }, + { + "type": "boolean", + }, + ], + }, + }, + "items": [ + { + "anyOf": [ + { + "allOf": [ + { + "$ref": "#/definitions/basicConfig", + }, + { + "properties": { + "attributes": { + "$ref": "#/definitions/basicConfigOrBoolean", + }, + "children": { + "$ref": "#/definitions/basicConfigOrBoolean", + }, + }, + "type": "object", + }, + ], + }, + { + "enum": [ + "always", + "never", + ], + }, + ], + }, + { + "additionalProperties": false, + "properties": { + "allowMultiline": { + "type": "boolean", + }, + "spacing": { + "properties": { + "objectLiterals": { + "enum": [ + "always", + "never", + ], + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + }, + }, + "jsx-equals-spacing": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce or disallow spaces around equal signs in JSX attributes", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-equals-spacing.md", + }, + "fixable": "code", + "messages": { + "needSpaceAfter": "A space is required after '='", + "needSpaceBefore": "A space is required before '='", + "noSpaceAfter": "There should be no space after '='", + "noSpaceBefore": "There should be no space before '='", + }, + "schema": [ + { + "enum": [ + "always", + "never", + ], + }, + ], + }, + }, + "jsx-filename-extension": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow file extensions that may contain JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-filename-extension.md", + }, + "messages": { + "extensionOnlyForJSX": "Only files containing JSX may use the extension '{{ext}}'", + "noJSXWithExtension": "JSX not allowed in files with extension '{{ext}}'", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "enum": [ + "always", + "as-needed", + ], + }, + "extensions": { + "items": { + "type": "string", + }, + "type": "array", + }, + "ignoreFilesWithoutCode": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-first-prop-new-line": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce proper position of the first property in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-first-prop-new-line.md", + }, + "fixable": "code", + "messages": { + "propOnNewLine": "Property should be placed on a new line", + "propOnSameLine": "Property should be placed on the same line as the component declaration", + }, + "schema": [ + { + "enum": [ + "always", + "never", + "multiline", + "multiline-multiprop", + "multiprop", + ], + }, + ], + }, + }, + "jsx-fragments": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce shorthand or standard form for React fragments", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-fragments.md", + }, + "fixable": "code", + "messages": { + "fragmentsNotSupported": "Fragments are only supported starting from React v16.2. Please disable the \`react/jsx-fragments\` rule in \`eslint\` settings or upgrade your version of React.", + "preferFragment": "Prefer fragment shorthand over {{react}}.{{fragment}}", + "preferPragma": "Prefer {{react}}.{{fragment}} over fragment shorthand", + }, + "schema": [ + { + "enum": [ + "syntax", + "element", + ], + }, + ], + }, + }, + "jsx-handler-names": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce event handler naming conventions in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-handler-names.md", + }, + "messages": { + "badHandlerName": "Handler function for {{propKey}} prop key must be a camelCase name beginning with '{{handlerPrefix}}' only", + "badPropKey": "Prop key for {{propValue}} must begin with '{{handlerPropPrefix}}'", + }, + "schema": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "checkInlineFunction": { + "type": "boolean", + }, + "checkLocalVariables": { + "type": "boolean", + }, + "eventHandlerPrefix": { + "type": "string", + }, + "eventHandlerPropPrefix": { + "type": "string", + }, + "ignoreComponentNames": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "checkInlineFunction": { + "type": "boolean", + }, + "checkLocalVariables": { + "type": "boolean", + }, + "eventHandlerPrefix": { + "type": "string", + }, + "eventHandlerPropPrefix": { + "enum": [ + false, + ], + "type": "boolean", + }, + "ignoreComponentNames": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "checkInlineFunction": { + "type": "boolean", + }, + "checkLocalVariables": { + "type": "boolean", + }, + "eventHandlerPrefix": { + "enum": [ + false, + ], + "type": "boolean", + }, + "eventHandlerPropPrefix": { + "type": "string", + }, + "ignoreComponentNames": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "checkLocalVariables": { + "type": "boolean", + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "checkInlineFunction": { + "type": "boolean", + }, + }, + "type": "object", + }, + { + "properties": { + "ignoreComponentNames": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + }, + ], + }, + }, + "jsx-indent": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce JSX indentation", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-indent.md", + }, + "fixable": "whitespace", + "messages": { + "wrongIndent": "Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}.", + }, + "schema": [ + { + "anyOf": [ + { + "enum": [ + "tab", + ], + }, + { + "type": "integer", + }, + ], + }, + { + "additionalProperties": false, + "properties": { + "checkAttributes": { + "type": "boolean", + }, + "indentLogicalExpressions": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-indent-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce props indentation in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-indent-props.md", + }, + "fixable": "code", + "messages": { + "wrongIndent": "Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}.", + }, + "schema": [ + { + "anyOf": [ + { + "enum": [ + "tab", + "first", + ], + }, + { + "type": "integer", + }, + { + "properties": { + "ignoreTernaryOperator": { + "type": "boolean", + }, + "indentMode": { + "anyOf": [ + { + "enum": [ + "tab", + "first", + ], + }, + { + "type": "integer", + }, + ], + }, + }, + "type": "object", + }, + ], + }, + ], + }, + }, + "jsx-key": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow missing \`key\` props in iterators/collection literals", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-key.md", + }, + "messages": { + "keyBeforeSpread": "\`key\` prop must be placed before any \`{...spread}, to avoid conflicting with React’s new JSX transform: https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html\`", + "missingArrayKey": "Missing "key" prop for element in array", + "missingArrayKeyUsePrag": "Missing "key" prop for element in array. Shorthand fragment syntax does not support providing keys. Use {{reactPrag}}.{{fragPrag}} instead", + "missingIterKey": "Missing "key" prop for element in iterator", + "missingIterKeyUsePrag": "Missing "key" prop for element in iterator. Shorthand fragment syntax does not support providing keys. Use {{reactPrag}}.{{fragPrag}} instead", + "nonUniqueKeys": "\`key\` prop must be unique", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "checkFragmentShorthand": { + "default": false, + "type": "boolean", + }, + "checkKeyMustBeforeSpread": { + "default": false, + "type": "boolean", + }, + "warnOnDuplicates": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-max-depth": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce JSX maximum depth", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-max-depth.md", + }, + "messages": { + "wrongDepth": "Expected the depth of nested jsx elements to be <= {{needed}}, but found {{found}}.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "max": { + "minimum": 0, + "type": "integer", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-max-props-per-line": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce maximum of props on a single line in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-max-props-per-line.md", + }, + "fixable": "code", + "messages": { + "newLine": "Prop \`{{prop}}\` must be placed on a new line", + }, + "schema": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "maximum": { + "properties": { + "multi": { + "minimum": 1, + "type": "integer", + }, + "single": { + "minimum": 1, + "type": "integer", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "maximum": { + "minimum": 1, + "type": "number", + }, + "when": { + "enum": [ + "always", + "multiline", + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + ], + }, + }, + "jsx-newline": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Require or prevent a new line after jsx elements and expressions.", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-newline.md", + }, + "fixable": "code", + "messages": { + "allowMultilines": "Multiline JSX elements should start in a new line", + "prevent": "JSX element should not start in a new line", + "require": "JSX element should start in a new line", + }, + "schema": [ + { + "additionalProperties": false, + "if": { + "properties": { + "allowMultilines": { + "const": true, + }, + }, + }, + "properties": { + "allowMultilines": { + "default": false, + "type": "boolean", + }, + "prevent": { + "default": false, + "type": "boolean", + }, + }, + "then": { + "properties": { + "prevent": { + "const": true, + }, + }, + "required": [ + "prevent", + ], + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-bind": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow \`.bind()\` or arrow functions in JSX props", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-bind.md", + }, + "messages": { + "arrowFunc": "JSX props should not use arrow functions", + "bindCall": "JSX props should not use .bind()", + "bindExpression": "JSX props should not use ::", + "func": "JSX props should not use functions", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowArrowFunctions": { + "default": false, + "type": "boolean", + }, + "allowBind": { + "default": false, + "type": "boolean", + }, + "allowFunctions": { + "default": false, + "type": "boolean", + }, + "ignoreDOMComponents": { + "default": false, + "type": "boolean", + }, + "ignoreRefs": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-comment-textnodes": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow comments from being inserted as text nodes", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-comment-textnodes.md", + }, + "messages": { + "putCommentInBraces": "Comments inside children section of tag should be placed inside braces", + }, + "schema": [], + }, + }, + "jsx-no-constructed-context-values": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallows JSX context provider values from taking values that will cause needless rerenders", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-constructed-context-values.md", + }, + "messages": { + "defaultMsg": "The {{type}} passed as the value prop to the Context provider (at line {{nodeLine}}) changes every render. To fix this consider wrapping it in a useMemo hook.", + "defaultMsgFunc": "The {{type}} passed as the value prop to the Context provider (at line {{nodeLine}}) changes every render. To fix this consider wrapping it in a useCallback hook.", + "withIdentifierMsg": "The '{{variableName}}' {{type}} (at line {{nodeLine}}) passed as the value prop to the Context provider (at line {{usageLine}}) changes every render. To fix this consider wrapping it in a useMemo hook.", + "withIdentifierMsgFunc": "The '{{variableName}}' {{type}} (at line {{nodeLine}}) passed as the value prop to the Context provider (at line {{usageLine}}) changes every render. To fix this consider wrapping it in a useCallback hook.", + }, + "schema": false, + }, + }, + "jsx-no-duplicate-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow duplicate properties in JSX", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-duplicate-props.md", + }, + "messages": { + "noDuplicateProps": "No duplicate props allowed", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-leaked-render": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow problematic leaked values from being rendered", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-leaked-render.md", + }, + "fixable": "code", + "messages": { + "noPotentialLeakedRender": "Potential leaked value that might cause unintentionally rendered values or rendering crashes", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "validStrategies": { + "default": [ + "ternary", + "coerce", + ], + "items": { + "enum": [ + "ternary", + "coerce", + ], + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-literals": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow usage of string literals in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-literals.md", + }, + "messages": { + "invalidPropValue": "Invalid prop value: "{{text}}"", + "invalidPropValueInElement": "Invalid prop value: "{{text}}" in {{element}}", + "literalNotInJSXExpression": "Missing JSX expression container around literal string: "{{text}}"", + "literalNotInJSXExpressionInElement": "Missing JSX expression container around literal string: "{{text}}" in {{element}}", + "noStringsInAttributes": "Strings not allowed in attributes: "{{text}}"", + "noStringsInAttributesInElement": "Strings not allowed in attributes: "{{text}}" in {{element}}", + "noStringsInJSX": "Strings not allowed in JSX files: "{{text}}"", + "noStringsInJSXInElement": "Strings not allowed in JSX files: "{{text}}" in {{element}}", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowedStrings": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "elementOverrides": { + "patternProperties": { + "^[A-Z][\\w.]*$": { + "properties": { + "allowedStrings": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "applyToNestedElements": { + "type": "boolean", + }, + "ignoreProps": { + "type": "boolean", + }, + "noAttributeStrings": { + "type": "boolean", + }, + "noStrings": { + "type": "boolean", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + "ignoreProps": { + "type": "boolean", + }, + "noAttributeStrings": { + "type": "boolean", + }, + "noStrings": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-script-url": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of \`javascript:\` URLs", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-script-url.md", + }, + "messages": { + "noScriptURL": "A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML, try using dangerouslySetInnerHTML instead.", + }, + "schema": { + "anyOf": [ + { + "additionalItems": false, + "items": [ + { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + }, + "props": { + "items": { + "type": "string", + "uniqueItems": true, + }, + "type": "array", + }, + }, + "required": [ + "name", + "props", + ], + "type": "object", + }, + "type": "array", + "uniqueItems": true, + }, + { + "additionalItems": false, + "properties": { + "includeFromSettings": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + { + "additionalItems": false, + "items": [ + { + "additionalItems": false, + "properties": { + "includeFromSettings": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + ], + }, + }, + }, + "jsx-no-target-blank": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow \`target="_blank"\` attribute without \`rel="noreferrer"\`", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-target-blank.md", + }, + "fixable": "code", + "messages": { + "noTargetBlankWithoutNoopener": "Using target="_blank" without rel="noreferrer" or rel="noopener" (the former implies the latter and is preferred due to wider support) is a security risk: see https://mathiasbynens.github.io/rel-noopener/#recommendations", + "noTargetBlankWithoutNoreferrer": "Using target="_blank" without rel="noreferrer" (which implies rel="noopener") is a security risk in older browsers: see https://mathiasbynens.github.io/rel-noopener/#recommendations", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowReferrer": { + "type": "boolean", + }, + "enforceDynamicLinks": { + "enum": [ + "always", + "never", + ], + }, + "forms": { + "default": false, + "type": "boolean", + }, + "links": { + "default": true, + "type": "boolean", + }, + "warnOnSpreadAttributes": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-undef": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow undeclared variables in JSX", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-undef.md", + }, + "messages": { + "undefined": "'{{identifier}}' is not defined.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowGlobals": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-no-useless-fragment": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow unnecessary fragments", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-useless-fragment.md", + }, + "fixable": "code", + "messages": { + "ChildOfHtmlElement": "Passing a fragment to an HTML element is useless.", + "NeedsMoreChildren": "Fragments should contain more than one child - otherwise, there’s no need for a Fragment at all.", + }, + "schema": [ + { + "properties": { + "allowExpressions": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "jsx-one-expression-per-line": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Require one JSX element per line", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-one-expression-per-line.md", + }, + "fixable": "whitespace", + "messages": { + "moveToNewLine": "\`{{descriptor}}\` must be placed on a new line", + }, + "schema": [ + { + "additionalProperties": false, + "default": { + "allow": "none", + }, + "properties": { + "allow": { + "enum": [ + "none", + "literal", + "single-child", + "non-jsx", + ], + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-pascal-case": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce PascalCase for user-defined JSX components", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-pascal-case.md", + }, + "messages": { + "usePascalCase": "Imported JSX component {{name}} must be in PascalCase", + "usePascalOrSnakeCase": "Imported JSX component {{name}} must be in PascalCase or SCREAMING_SNAKE_CASE", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowAllCaps": { + "type": "boolean", + }, + "allowLeadingUnderscore": { + "type": "boolean", + }, + "allowNamespace": { + "type": "boolean", + }, + "ignore": { + "items": [ + { + "type": "string", + }, + ], + "minItems": 0, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-props-no-multi-spaces": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow multiple spaces between inline JSX props", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-props-no-multi-spaces.md", + }, + "fixable": "code", + "messages": { + "noLineGap": "Expected no line gap between “{{prop1}}” and “{{prop2}}”", + "onlyOneSpace": "Expected only one space between “{{prop1}}” and “{{prop2}}”", + }, + "schema": [], + }, + }, + "jsx-props-no-spread-multi": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow JSX prop spreading the same identifier multiple times", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-props-no-spread-multi.md", + }, + "messages": { + "noMultiSpreading": "Spreading the same expression multiple times is forbidden", + }, + }, + }, + "jsx-props-no-spreading": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow JSX prop spreading", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-props-no-spreading.md", + }, + "messages": { + "noSpreading": "Prop spreading is forbidden", + }, + "schema": [ + { + "allOf": [ + { + "properties": { + "custom": { + "enum": [ + "enforce", + "ignore", + ], + }, + "exceptions": { + "items": { + "type": "string", + "uniqueItems": true, + }, + "type": "array", + }, + "explicitSpread": { + "enum": [ + "enforce", + "ignore", + ], + }, + "html": { + "enum": [ + "enforce", + "ignore", + ], + }, + }, + "type": "object", + }, + { + "not": { + "properties": { + "custom": { + "enum": [ + "ignore", + ], + }, + "exceptions": { + "maxItems": 0, + "minItems": 0, + "type": "array", + }, + "html": { + "enum": [ + "ignore", + ], + }, + }, + "required": [ + "html", + "custom", + ], + "type": "object", + }, + }, + ], + }, + ], + }, + }, + "jsx-sort-default-props": { + "create": [Function], + "meta": { + "deprecated": true, + "docs": { + "category": "Stylistic Issues", + "description": "Enforce defaultProps declarations alphabetical sorting", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-sort-default-props.md", + }, + "messages": { + "propsNotSorted": "Default prop types declarations should be sorted alphabetically", + }, + "replacedBy": [ + "sort-default-props", + ], + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-sort-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce props alphabetical sorting", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-sort-props.md", + }, + "fixable": "code", + "messages": { + "listCallbacksLast": "Callbacks must be listed after all other props", + "listIsEmpty": "A customized reserved first list must not be empty", + "listMultilineFirst": "Multiline props must be listed before all other props", + "listMultilineLast": "Multiline props must be listed after all other props", + "listReservedPropsFirst": "Reserved props must be listed before all other props", + "listShorthandFirst": "Shorthand props must be listed before all other props", + "listShorthandLast": "Shorthand props must be listed after all other props", + "noUnreservedProps": "A customized reserved first list must only contain a subset of React reserved props. Remove: {{unreservedWords}}", + "sortPropsByAlpha": "Props should be sorted alphabetically", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "callbacksLast": { + "type": "boolean", + }, + "ignoreCase": { + "type": "boolean", + }, + "locale": { + "default": "auto", + "type": "string", + }, + "multiline": { + "default": "ignore", + "enum": [ + "ignore", + "first", + "last", + ], + }, + "noSortAlphabetically": { + "type": "boolean", + }, + "reservedFirst": { + "type": [ + "array", + "boolean", + ], + }, + "shorthandFirst": { + "type": "boolean", + }, + "shorthandLast": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-space-before-closing": { + "create": [Function], + "meta": { + "deprecated": true, + "docs": { + "category": "Stylistic Issues", + "description": "Enforce spacing before closing bracket in JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-space-before-closing.md", + }, + "fixable": "code", + "messages": { + "needSpaceBeforeClose": "A space is required before closing bracket", + "noSpaceBeforeClose": "A space is forbidden before closing bracket", + }, + "replacedBy": [ + "jsx-tag-spacing", + ], + "schema": [ + { + "enum": [ + "always", + "never", + ], + }, + ], + }, + }, + "jsx-tag-spacing": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce whitespace in and around the JSX opening and closing brackets", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-tag-spacing.md", + }, + "fixable": "whitespace", + "messages": { + "afterOpenNeedSpace": "A space is required after opening bracket", + "afterOpenNoSpace": "A space is forbidden after opening bracket", + "beforeCloseNeedNewline": "A newline is required before closing bracket", + "beforeCloseNeedSpace": "Whitespace is required before closing bracket", + "beforeCloseNoSpace": "A space is forbidden before closing bracket", + "beforeSelfCloseNeedNewline": "A newline is required before closing bracket", + "beforeSelfCloseNeedSpace": "A space is required before closing bracket", + "beforeSelfCloseNoSpace": "A space is forbidden before closing bracket", + "closeSlashNeedSpace": "Whitespace is required between \`<\` and \`/\`; write \`< /\`", + "closeSlashNoSpace": "Whitespace is forbidden between \`<\` and \`/\`; write \`\`; write \`/ >\`", + "selfCloseSlashNoSpace": "Whitespace is forbidden between \`/\` and \`>\`; write \`/>\`", + }, + "schema": [ + { + "additionalProperties": false, + "default": { + "afterOpening": "never", + "beforeClosing": "allow", + "beforeSelfClosing": "always", + "closingSlash": "never", + }, + "properties": { + "afterOpening": { + "enum": [ + "always", + "allow-multiline", + "never", + "allow", + ], + }, + "beforeClosing": { + "enum": [ + "always", + "proportional-always", + "never", + "allow", + ], + }, + "beforeSelfClosing": { + "enum": [ + "always", + "proportional-always", + "never", + "allow", + ], + }, + "closingSlash": { + "enum": [ + "always", + "never", + "allow", + ], + }, + }, + "type": "object", + }, + ], + }, + }, + "jsx-uses-react": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow React to be incorrectly marked as unused", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-uses-react.md", + }, + "schema": [], + }, + }, + "jsx-uses-vars": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow variables used in JSX to be incorrectly marked as unused", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-uses-vars.md", + }, + "schema": [], + }, + }, + "jsx-wrap-multilines": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow missing parentheses around multiline JSX", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-wrap-multilines.md", + }, + "fixable": "code", + "messages": { + "extraParens": "Expected no parentheses around multilines JSX", + "missingParens": "Missing parentheses around multilines JSX", + "parensOnNewLines": "Parentheses around JSX should be on separate lines", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "arrow": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + "assignment": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + "condition": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + "declaration": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + "logical": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + "prop": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + "return": { + "enum": [ + true, + false, + "ignore", + "parens", + "parens-new-line", + "never", + ], + }, + }, + "type": "object", + }, + ], + }, + }, + "no-access-state-in-setstate": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow when this.state is accessed within setState", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-access-state-in-setstate.md", + }, + "messages": { + "useCallback": "Use callback in setState when referencing the previous state.", + }, + }, + }, + "no-adjacent-inline-elements": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow adjacent inline elements not separated by whitespace.", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-adjacent-inline-elements.md", + }, + "messages": { + "inlineElement": "Child elements which render as inline HTML elements should be separated by a space or wrapped in block level elements.", + }, + "schema": [], + }, + }, + "no-array-index-key": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of Array index in keys", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-array-index-key.md", + }, + "messages": { + "noArrayIndex": "Do not use Array index in keys", + }, + "schema": [], + }, + }, + "no-arrow-function-lifecycle": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Lifecycle methods should be methods on the prototype, not class fields", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-arrow-function-lifecycle.md", + }, + "fixable": "code", + "messages": { + "lifecycle": "{{propertyName}} is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.", + }, + "schema": [], + }, + }, + "no-children-prop": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow passing of children as props", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-children-prop.md", + }, + "messages": { + "nestChildren": "Do not pass children as props. Instead, nest children between the opening and closing tags.", + "nestFunction": "Do not nest a function between the opening and closing tags. Instead, pass it as a prop.", + "passChildrenAsArgs": "Do not pass children as props. Instead, pass them as additional arguments to React.createElement.", + "passFunctionAsArgs": "Do not pass a function as an additional argument to React.createElement. Instead, pass it as a prop.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowFunctions": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-danger": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of dangerous JSX properties", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-danger.md", + }, + "messages": { + "dangerousProp": "Dangerous property '{{name}}' found", + }, + "schema": [ + { + "properties": { + "customComponentNames": { + "items": { + "type": "string", + }, + "minItems": 0, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + }, + }, + "no-danger-with-children": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow when a DOM element is using both children and dangerouslySetInnerHTML", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-danger-with-children.md", + }, + "messages": { + "dangerWithChildren": "Only set one of \`children\` or \`props.dangerouslySetInnerHTML\`", + }, + "schema": [], + }, + }, + "no-deprecated": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of deprecated methods", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-deprecated.md", + }, + "messages": { + "deprecated": "{{oldMethod}} is deprecated since React {{version}}{{newMethod}}{{refs}}", + }, + "schema": [], + }, + }, + "no-did-mount-set-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of setState in componentDidMount", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-did-mount-set-state.md", + }, + "messages": { + "noSetState": "Do not use setState in {{name}}", + }, + "schema": [ + { + "enum": [ + "disallow-in-func", + ], + }, + ], + }, + }, + "no-did-update-set-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of setState in componentDidUpdate", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-did-update-set-state.md", + }, + "messages": { + "noSetState": "Do not use setState in {{name}}", + }, + "schema": [ + { + "enum": [ + "disallow-in-func", + ], + }, + ], + }, + }, + "no-direct-mutation-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow direct mutation of this.state", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-direct-mutation-state.md", + }, + "messages": { + "noDirectMutation": "Do not mutate state directly. Use setState().", + }, + }, + }, + "no-find-dom-node": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of findDOMNode", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-find-dom-node.md", + }, + "messages": { + "noFindDOMNode": "Do not use findDOMNode. It doesn’t work with function components and is deprecated in StrictMode. See https://reactjs.org/docs/react-dom.html#finddomnode", + }, + "schema": [], + }, + }, + "no-invalid-html-attribute": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow usage of invalid attributes", + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-invalid-html-attribute.md", + }, + "hasSuggestions": true, + "messages": { + "emptyIsMeaningless": "An empty “{{attributeName}}” attribute is meaningless.", + "neverValid": "“{{reportingValue}}” is never a valid “{{attributeName}}” attribute value.", + "noEmpty": "An empty “{{attributeName}}” attribute is meaningless.", + "noMethod": "The ”{{attributeName}}“ attribute cannot be a method.", + "notAlone": "“{{reportingValue}}” must be directly followed by “{{missingValue}}”.", + "notPaired": "“{{reportingValue}}” can not be directly followed by “{{secondValue}}” without “{{missingValue}}”.", + "notValidFor": "“{{reportingValue}}” is not a valid “{{attributeName}}” attribute value for <{{elementName}}>.", + "onlyMeaningfulFor": "The ”{{attributeName}}“ attribute only has meaning on the tags: {{tagNames}}", + "onlyStrings": "“{{attributeName}}” attribute only supports strings.", + "spaceDelimited": "”{{attributeName}}“ attribute values should be space delimited.", + "suggestRemoveDefault": ""remove {{attributeName}}"", + "suggestRemoveEmpty": ""remove empty attribute {{attributeName}}"", + "suggestRemoveInvalid": "“remove invalid attribute {{reportingValue}}”", + "suggestRemoveNonString": "remove non-string value in “{{attributeName}}”", + "suggestRemoveWhitespaces": "remove whitespaces in “{{attributeName}}”", + }, + "schema": [ + { + "items": { + "enum": [ + "rel", + ], + }, + "type": "array", + "uniqueItems": true, + }, + ], + "type": "suggestion", + }, + }, + "no-is-mounted": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of isMounted", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-is-mounted.md", + }, + "messages": { + "noIsMounted": "Do not use isMounted", + }, + "schema": [], + }, + }, + "no-multi-comp": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow multiple component definition per file", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-multi-comp.md", + }, + "messages": { + "onlyOneComponent": "Declare only one React component per file", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreStateless": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-namespace": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Enforce that namespaces are not used in React elements", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-namespace.md", + }, + "messages": { + "noNamespace": "React component {{name}} must not be in a namespace, as React does not support them", + }, + "schema": [], + }, + }, + "no-object-type-as-default-prop": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of referential-type variables as default param in functional component", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-object-type-as-default-prop.md", + }, + "messages": { + "forbiddenTypeDefaultParam": "{{propName}} has a/an {{forbiddenType}} as default prop. This could lead to potential infinite render loop in React. Use a variable reference instead of {{forbiddenType}}.", + }, + }, + }, + "no-redundant-should-component-update": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow usage of shouldComponentUpdate when extending React.PureComponent", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-redundant-should-component-update.md", + }, + "messages": { + "noShouldCompUpdate": "{{component}} does not need shouldComponentUpdate when extending React.PureComponent.", + }, + "schema": [], + }, + }, + "no-render-return-value": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of the return value of ReactDOM.render", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-render-return-value.md", + }, + "messages": { + "noReturnValue": "Do not depend on the return value from {{node}}.render", + }, + "schema": [], + }, + }, + "no-set-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow usage of setState", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-set-state.md", + }, + "messages": { + "noSetState": "Do not use setState", + }, + "schema": [], + }, + }, + "no-string-refs": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow using string references", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-string-refs.md", + }, + "messages": { + "stringInRefDeprecated": "Using string literals in ref attributes is deprecated.", + "thisRefsDeprecated": "Using this.refs is deprecated.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "noTemplateLiterals": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-this-in-sfc": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow \`this\` from being used in stateless functional components", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-this-in-sfc.md", + }, + "messages": { + "noThisInSFC": "Stateless functional components should not use \`this\`", + }, + "schema": [], + }, + }, + "no-typos": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow common typos", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-typos.md", + }, + "messages": { + "noPropTypesBinding": "\`'prop-types'\` imported without a local \`PropTypes\` binding.", + "noReactBinding": "\`'react'\` imported without a local \`React\` binding.", + "staticLifecycleMethod": "Lifecycle method should be static: {{method}}", + "typoLifecycleMethod": "Typo in component lifecycle method declaration: {{actual}} should be {{expected}}", + "typoPropDeclaration": "Typo in property declaration", + "typoPropType": "Typo in declared prop type: {{name}}", + "typoPropTypeChain": "Typo in prop type chain qualifier: {{name}}", + "typoStaticClassProp": "Typo in static class property declaration", + }, + "schema": [], + }, + }, + "no-unescaped-entities": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow unescaped HTML entities from appearing in markup", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unescaped-entities.md", + }, + "hasSuggestions": true, + "messages": { + "replaceWithAlt": "Replace with \`{{alt}}\`.", + "unescapedEntity": "HTML entity, \`{{entity}}\` , must be escaped.", + "unescapedEntityAlts": "\`{{entity}}\` can be escaped with {{alts}}.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "forbid": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "properties": { + "alternatives": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "char": { + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-unknown-property": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow usage of unknown DOM property", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unknown-property.md", + }, + "fixable": "code", + "messages": { + "dataLowercaseRequired": "React does not recognize data-* props with uppercase characters on a DOM element. Found '{{name}}', use '{{lowerCaseName}}' instead", + "invalidPropOnTag": "Invalid property '{{name}}' found on tag '{{tagName}}', but it is only allowed on: {{allowedTags}}", + "unknownProp": "Unknown property '{{name}}' found", + "unknownPropWithStandardName": "Unknown property '{{name}}' found, use '{{standardName}}' instead", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignore": { + "items": { + "type": "string", + }, + "type": "array", + }, + "requireDataLowercase": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-unsafe": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of unsafe lifecycle methods", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unsafe.md", + }, + "messages": { + "unsafeMethod": "{{method}} is unsafe for use in async rendering. Update the component to use {{newMethod}} instead. {{details}}", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "checkAliases": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-unstable-nested-components": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow creating unstable components inside components", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unstable-nested-components.md", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowAsProps": { + "type": "boolean", + }, + "customValidators": { + "items": { + "type": "string", + }, + "type": "array", + }, + "propNamePattern": { + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-unused-class-component-methods": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow declaring unused methods of component class", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unused-class-component-methods.md", + }, + "messages": { + "unused": "Unused method or property "{{name}}"", + "unusedWithClass": "Unused method or property "{{name}}" of class "{{className}}"", + }, + "schema": [], + }, + }, + "no-unused-prop-types": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow definitions of unused propTypes", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unused-prop-types.md", + }, + "messages": { + "unusedPropType": "'{{name}}' PropType is defined but prop is never used", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "customValidators": { + "items": { + "type": "string", + }, + "type": "array", + }, + "ignore": { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + "skipShapeProps": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "no-unused-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow definitions of unused state", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unused-state.md", + }, + "messages": { + "unusedStateField": "Unused state field: '{{name}}'", + }, + "schema": [], + }, + }, + "no-will-update-set-state": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow usage of setState in componentWillUpdate", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-will-update-set-state.md", + }, + "messages": { + "noSetState": "Do not use setState in {{name}}", + }, + "schema": [ + { + "enum": [ + "disallow-in-func", + ], + }, + ], + }, + }, + "prefer-es6-class": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce ES5 or ES6 class for React Components", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-es6-class.md", + }, + "messages": { + "shouldUseCreateClass": "Component should use createClass instead of es6 class", + "shouldUseES6Class": "Component should use es6 class instead of createClass", + }, + "schema": [ + { + "enum": [ + "always", + "never", + ], + }, + ], + }, + }, + "prefer-exact-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Prefer exact proptype definitions", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-exact-props.md", + }, + "messages": { + "flow": "Component flow props should be set with exact objects.", + "propTypes": "Component propTypes should be exact by using {{exactPropWrappers}}.", + }, + "schema": [], + }, + }, + "prefer-read-only-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce that props are read-only", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-read-only-props.md", + }, + "fixable": "code", + "messages": { + "readOnlyProp": "Prop '{{name}}' should be read-only.", + }, + "schema": [], + }, + }, + "prefer-stateless-function": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce stateless components to be written as a pure function", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-stateless-function.md", + }, + "messages": { + "componentShouldBePure": "Component should be written as a pure function", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignorePureComponents": { + "default": false, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "prop-types": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow missing props validation in a React component definition", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prop-types.md", + }, + "messages": { + "missingPropType": "'{{name}}' is missing in props validation", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "customValidators": { + "items": { + "type": "string", + }, + "type": "array", + }, + "ignore": { + "items": { + "type": "string", + }, + "type": "array", + }, + "skipUndeclared": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "react-in-jsx-scope": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Disallow missing React when using JSX", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/react-in-jsx-scope.md", + }, + "messages": { + "notInScope": "'{{name}}' must be in scope when using JSX", + }, + "schema": [], + }, + }, + "require-default-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Enforce a defaultProps definition for every prop that is not a required prop", + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/require-default-props.md", + }, + "messages": { + "destructureInSignature": "Must destructure props in the function signature to initialize an optional prop.", + "noDefaultPropsWithFunction": "Don’t use defaultProps with function components.", + "noDefaultWithRequired": "propType "{{name}}" is required and should not have a defaultProps declaration.", + "shouldAssignObjectDefault": "propType "{{name}}" is not required, but has no corresponding default argument value.", + "shouldHaveDefault": "propType "{{name}}" is not required, but has no corresponding defaultProps declaration.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "classes": { + "enum": [ + "defaultProps", + "ignore", + ], + }, + "forbidDefaultForRequired": { + "type": "boolean", + }, + "functions": { + "enum": [ + "defaultArguments", + "defaultProps", + "ignore", + ], + }, + "ignoreFunctionalComponents": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "require-optimization": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Enforce React components to have a shouldComponentUpdate method", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/require-optimization.md", + }, + "messages": { + "noShouldComponentUpdate": "Component is not optimized. Please add a shouldComponentUpdate method.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowDecorators": { + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "require-render-return": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Enforce ES5 or ES6 class for returning value in render function", + "recommended": true, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/require-render-return.md", + }, + "messages": { + "noRenderReturn": "Your render method should have a return statement", + }, + "schema": [], + }, + }, + "self-closing-comp": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Disallow extra closing tags for components without children", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/self-closing-comp.md", + }, + "fixable": "code", + "messages": { + "notSelfClosing": "Empty components are self-closing", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "component": { + "default": true, + "type": "boolean", + }, + "html": { + "default": true, + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "sort-comp": { + "create": [Function], + "defaultConfig": { + "groups": { + "lifecycle": [ + "displayName", + "propTypes", + "contextTypes", + "childContextTypes", + "mixins", + "statics", + "defaultProps", + "constructor", + "getDefaultProps", + "state", + "getInitialState", + "getChildContext", + "getDerivedStateFromProps", + "componentWillMount", + "UNSAFE_componentWillMount", + "componentDidMount", + "componentWillReceiveProps", + "UNSAFE_componentWillReceiveProps", + "shouldComponentUpdate", + "componentWillUpdate", + "UNSAFE_componentWillUpdate", + "getSnapshotBeforeUpdate", + "componentDidUpdate", + "componentDidCatch", + "componentWillUnmount", + ], + }, + "order": [ + "static-methods", + "lifecycle", + "everything-else", + "render", + ], + }, + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce component methods order", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/sort-comp.md", + }, + "messages": { + "unsortedProps": "{{propA}} should be placed {{position}} {{propB}}", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "groups": { + "patternProperties": { + "^.*$": { + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + "order": { + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "sort-default-props": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce defaultProps declarations alphabetical sorting", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/sort-default-props.md", + }, + "messages": { + "propsNotSorted": "Default prop types declarations should be sorted alphabetically", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "sort-prop-types": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce propTypes declarations alphabetical sorting", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/sort-prop-types.md", + }, + "fixable": "code", + "messages": { + "callbackPropsLast": "Callback prop types must be listed after all other prop types", + "propsNotSorted": "Prop types declarations should be sorted alphabetically", + "requiredPropsFirst": "Required prop types must be listed before all other prop types", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "callbacksLast": { + "type": "boolean", + }, + "checkTypes": { + "type": "boolean", + }, + "ignoreCase": { + "type": "boolean", + }, + "noSortAlphabetically": { + "type": "boolean", + }, + "requiredFirst": { + "type": "boolean", + }, + "sortShapeProp": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "state-in-constructor": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforce class component state initialization style", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/state-in-constructor.md", + }, + "messages": { + "stateInitClassProp": "State initialization should be in a class property", + "stateInitConstructor": "State initialization should be in a constructor", + }, + "schema": [ + { + "enum": [ + "always", + "never", + ], + }, + ], + }, + }, + "static-property-placement": { + "create": [Function], + "meta": { + "docs": { + "category": "Stylistic Issues", + "description": "Enforces where React component static properties should be positioned.", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/static-property-placement.md", + }, + "fixable": null, + "messages": { + "declareOutsideClass": "'{{name}}' should be declared outside the class body.", + "notGetterClassFunc": "'{{name}}' should be declared as a static getter class function.", + "notStaticClassProp": "'{{name}}' should be declared as a static class property.", + }, + "schema": [ + { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + { + "additionalProperties": false, + "properties": { + "childContextTypes": { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + "contextType": { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + "contextTypes": { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + "defaultProps": { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + "displayName": { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + "propTypes": { + "enum": [ + "static public field", + "static getter", + "property assignment", + ], + }, + }, + "type": "object", + }, + ], + }, + }, + "style-prop-object": { + "create": [Function], + "meta": { + "docs": { + "category": "Possible Errors", + "description": "Enforce style prop value is an object", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/style-prop-object.md", + }, + "messages": { + "stylePropNotObject": "Style prop value must be an object", + }, + "schema": [ + { + "properties": { + "allow": { + "additionalItems": false, + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + }, + }, + "void-dom-elements-no-children": { + "create": [Function], + "meta": { + "docs": { + "category": "Best Practices", + "description": "Disallow void DOM elements (e.g. \`\`, \`
\`) from receiving children", + "recommended": false, + "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/void-dom-elements-no-children.md", + }, + "messages": { + "noChildrenInVoidEl": "Void DOM element <{{element}} /> cannot receive children.", + }, + "schema": [], + }, + }, + }, + }, + }, + "rules": { + "react/display-name": 2, + "react/jsx-key": 2, + "react/jsx-no-comment-textnodes": 2, + "react/jsx-no-duplicate-props": 2, + "react/jsx-no-target-blank": 2, + "react/jsx-no-undef": 2, + "react/jsx-uses-react": 2, + "react/jsx-uses-vars": 2, + "react/no-children-prop": 2, + "react/no-danger-with-children": 2, + "react/no-deprecated": 2, + "react/no-direct-mutation-state": 2, + "react/no-find-dom-node": 2, + "react/no-is-mounted": 2, + "react/no-render-return-value": 2, + "react/no-string-refs": 2, + "react/no-unescaped-entities": 2, + "react/no-unknown-property": 2, + "react/no-unsafe": 0, + "react/prop-types": 2, + "react/react-in-jsx-scope": 2, + "react/require-render-return": 2, + }, + }, + { + "rules": { + "constructor-super": "error", + "for-direction": "error", + "getter-return": "error", + "no-async-promise-executor": "error", + "no-case-declarations": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-binary-expression": "error", + "no-constant-condition": "error", + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-args": "error", + "no-dupe-class-members": "error", + "no-dupe-else-if": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty": "error", + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-empty-static-block": "error", + "no-ex-assign": "error", + "no-extra-boolean-cast": "error", + "no-fallthrough": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-import-assign": "error", + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-loss-of-precision": "error", + "no-misleading-character-class": "error", + "no-new-native-nonconstructor": "error", + "no-nonoctal-decimal-escape": "error", + "no-obj-calls": "error", + "no-octal": "error", + "no-prototype-builtins": "error", + "no-redeclare": "error", + "no-regex-spaces": "error", + "no-self-assign": "error", + "no-setter-return": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-this-before-super": "error", + "no-undef": "error", + "no-unexpected-multiline": "error", + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "no-unsafe-optional-chaining": "error", + "no-unused-labels": "error", + "no-unused-private-class-members": "error", + "no-unused-vars": "error", + "no-useless-backreference": "error", + "no-useless-catch": "error", + "no-useless-escape": "error", + "no-with": "error", + "require-yield": "error", + "use-isnan": "error", + "valid-typeof": "error", + }, + }, + { + "name": "eslint-plugin-prettier/recommended", + "plugins": { + "prettier": { + "configs": { + "recommended": { + "extends": [ + "prettier", + ], + "plugins": [ + "prettier", + ], + "rules": { + "arrow-body-style": "off", + "prefer-arrow-callback": "off", + "prettier/prettier": "error", + }, + }, + }, + "meta": { + "name": "eslint-plugin-prettier", + "version": "5.2.3", + }, + "rules": { + "prettier": { + "create": [Function], + "meta": { + "docs": { + "url": "https://github.com/prettier/eslint-plugin-prettier#options", + }, + "fixable": "code", + "messages": { + "delete": "Delete \`{{ deleteText }}\`", + "insert": "Insert \`{{ insertText }}\`", + "replace": "Replace \`{{ deleteText }}\` with \`{{ insertText }}\`", + }, + "schema": [ + { + "additionalProperties": true, + "properties": {}, + "type": "object", + }, + { + "additionalProperties": true, + "properties": { + "fileInfoOptions": { + "additionalProperties": true, + "properties": {}, + "type": "object", + }, + "usePrettierrc": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "layout", + }, + }, + }, + }, + }, + "rules": { + "@babel/object-curly-spacing": "off", + "@babel/semi": "off", + "@stylistic/array-bracket-newline": "off", + "@stylistic/array-bracket-spacing": "off", + "@stylistic/array-element-newline": "off", + "@stylistic/arrow-parens": "off", + "@stylistic/arrow-spacing": "off", + "@stylistic/block-spacing": "off", + "@stylistic/brace-style": "off", + "@stylistic/comma-dangle": "off", + "@stylistic/comma-spacing": "off", + "@stylistic/comma-style": "off", + "@stylistic/computed-property-spacing": "off", + "@stylistic/dot-location": "off", + "@stylistic/eol-last": "off", + "@stylistic/func-call-spacing": "off", + "@stylistic/function-call-argument-newline": "off", + "@stylistic/function-call-spacing": "off", + "@stylistic/function-paren-newline": "off", + "@stylistic/generator-star-spacing": "off", + "@stylistic/implicit-arrow-linebreak": "off", + "@stylistic/indent": "off", + "@stylistic/indent-binary-ops": "off", + "@stylistic/js/array-bracket-newline": "off", + "@stylistic/js/array-bracket-spacing": "off", + "@stylistic/js/array-element-newline": "off", + "@stylistic/js/arrow-parens": "off", + "@stylistic/js/arrow-spacing": "off", + "@stylistic/js/block-spacing": "off", + "@stylistic/js/brace-style": "off", + "@stylistic/js/comma-dangle": "off", + "@stylistic/js/comma-spacing": "off", + "@stylistic/js/comma-style": "off", + "@stylistic/js/computed-property-spacing": "off", + "@stylistic/js/dot-location": "off", + "@stylistic/js/eol-last": "off", + "@stylistic/js/func-call-spacing": "off", + "@stylistic/js/function-call-argument-newline": "off", + "@stylistic/js/function-call-spacing": "off", + "@stylistic/js/function-paren-newline": "off", + "@stylistic/js/generator-star-spacing": "off", + "@stylistic/js/implicit-arrow-linebreak": "off", + "@stylistic/js/indent": "off", + "@stylistic/js/jsx-quotes": "off", + "@stylistic/js/key-spacing": "off", + "@stylistic/js/keyword-spacing": "off", + "@stylistic/js/linebreak-style": "off", + "@stylistic/js/lines-around-comment": 0, + "@stylistic/js/max-len": 0, + "@stylistic/js/max-statements-per-line": "off", + "@stylistic/js/multiline-ternary": "off", + "@stylistic/js/new-parens": "off", + "@stylistic/js/newline-per-chained-call": "off", + "@stylistic/js/no-confusing-arrow": 0, + "@stylistic/js/no-extra-parens": "off", + "@stylistic/js/no-extra-semi": "off", + "@stylistic/js/no-floating-decimal": "off", + "@stylistic/js/no-mixed-operators": 0, + "@stylistic/js/no-mixed-spaces-and-tabs": "off", + "@stylistic/js/no-multi-spaces": "off", + "@stylistic/js/no-multiple-empty-lines": "off", + "@stylistic/js/no-tabs": 0, + "@stylistic/js/no-trailing-spaces": "off", + "@stylistic/js/no-whitespace-before-property": "off", + "@stylistic/js/nonblock-statement-body-position": "off", + "@stylistic/js/object-curly-newline": "off", + "@stylistic/js/object-curly-spacing": "off", + "@stylistic/js/object-property-newline": "off", + "@stylistic/js/one-var-declaration-per-line": "off", + "@stylistic/js/operator-linebreak": "off", + "@stylistic/js/padded-blocks": "off", + "@stylistic/js/quote-props": "off", + "@stylistic/js/quotes": 0, + "@stylistic/js/rest-spread-spacing": "off", + "@stylistic/js/semi": "off", + "@stylistic/js/semi-spacing": "off", + "@stylistic/js/semi-style": "off", + "@stylistic/js/space-before-blocks": "off", + "@stylistic/js/space-before-function-paren": "off", + "@stylistic/js/space-in-parens": "off", + "@stylistic/js/space-infix-ops": "off", + "@stylistic/js/space-unary-ops": "off", + "@stylistic/js/switch-colon-spacing": "off", + "@stylistic/js/template-curly-spacing": "off", + "@stylistic/js/template-tag-spacing": "off", + "@stylistic/js/wrap-iife": "off", + "@stylistic/js/wrap-regex": "off", + "@stylistic/js/yield-star-spacing": "off", + "@stylistic/jsx-child-element-spacing": "off", + "@stylistic/jsx-closing-bracket-location": "off", + "@stylistic/jsx-closing-tag-location": "off", + "@stylistic/jsx-curly-newline": "off", + "@stylistic/jsx-curly-spacing": "off", + "@stylistic/jsx-equals-spacing": "off", + "@stylistic/jsx-first-prop-new-line": "off", + "@stylistic/jsx-indent": "off", + "@stylistic/jsx-indent-props": "off", + "@stylistic/jsx-max-props-per-line": "off", + "@stylistic/jsx-newline": "off", + "@stylistic/jsx-one-expression-per-line": "off", + "@stylistic/jsx-props-no-multi-spaces": "off", + "@stylistic/jsx-quotes": "off", + "@stylistic/jsx-tag-spacing": "off", + "@stylistic/jsx-wrap-multilines": "off", + "@stylistic/jsx/jsx-child-element-spacing": "off", + "@stylistic/jsx/jsx-closing-bracket-location": "off", + "@stylistic/jsx/jsx-closing-tag-location": "off", + "@stylistic/jsx/jsx-curly-newline": "off", + "@stylistic/jsx/jsx-curly-spacing": "off", + "@stylistic/jsx/jsx-equals-spacing": "off", + "@stylistic/jsx/jsx-first-prop-new-line": "off", + "@stylistic/jsx/jsx-indent": "off", + "@stylistic/jsx/jsx-indent-props": "off", + "@stylistic/jsx/jsx-max-props-per-line": "off", + "@stylistic/key-spacing": "off", + "@stylistic/keyword-spacing": "off", + "@stylistic/linebreak-style": "off", + "@stylistic/lines-around-comment": 0, + "@stylistic/max-len": 0, + "@stylistic/max-statements-per-line": "off", + "@stylistic/member-delimiter-style": "off", + "@stylistic/multiline-ternary": "off", + "@stylistic/new-parens": "off", + "@stylistic/newline-per-chained-call": "off", + "@stylistic/no-confusing-arrow": 0, + "@stylistic/no-extra-parens": "off", + "@stylistic/no-extra-semi": "off", + "@stylistic/no-floating-decimal": "off", + "@stylistic/no-mixed-operators": 0, + "@stylistic/no-mixed-spaces-and-tabs": "off", + "@stylistic/no-multi-spaces": "off", + "@stylistic/no-multiple-empty-lines": "off", + "@stylistic/no-tabs": 0, + "@stylistic/no-trailing-spaces": "off", + "@stylistic/no-whitespace-before-property": "off", + "@stylistic/nonblock-statement-body-position": "off", + "@stylistic/object-curly-newline": "off", + "@stylistic/object-curly-spacing": "off", + "@stylistic/object-property-newline": "off", + "@stylistic/one-var-declaration-per-line": "off", + "@stylistic/operator-linebreak": "off", + "@stylistic/padded-blocks": "off", + "@stylistic/quote-props": "off", + "@stylistic/quotes": 0, + "@stylistic/rest-spread-spacing": "off", + "@stylistic/semi": "off", + "@stylistic/semi-spacing": "off", + "@stylistic/semi-style": "off", + "@stylistic/space-before-blocks": "off", + "@stylistic/space-before-function-paren": "off", + "@stylistic/space-in-parens": "off", + "@stylistic/space-infix-ops": "off", + "@stylistic/space-unary-ops": "off", + "@stylistic/switch-colon-spacing": "off", + "@stylistic/template-curly-spacing": "off", + "@stylistic/template-tag-spacing": "off", + "@stylistic/ts/block-spacing": "off", + "@stylistic/ts/brace-style": "off", + "@stylistic/ts/comma-dangle": "off", + "@stylistic/ts/comma-spacing": "off", + "@stylistic/ts/func-call-spacing": "off", + "@stylistic/ts/function-call-spacing": "off", + "@stylistic/ts/indent": "off", + "@stylistic/ts/key-spacing": "off", + "@stylistic/ts/keyword-spacing": "off", + "@stylistic/ts/lines-around-comment": 0, + "@stylistic/ts/member-delimiter-style": "off", + "@stylistic/ts/no-extra-parens": "off", + "@stylistic/ts/no-extra-semi": "off", + "@stylistic/ts/object-curly-spacing": "off", + "@stylistic/ts/quotes": 0, + "@stylistic/ts/semi": "off", + "@stylistic/ts/space-before-blocks": "off", + "@stylistic/ts/space-before-function-paren": "off", + "@stylistic/ts/space-infix-ops": "off", + "@stylistic/ts/type-annotation-spacing": "off", + "@stylistic/type-annotation-spacing": "off", + "@stylistic/type-generic-spacing": "off", + "@stylistic/type-named-tuple-spacing": "off", + "@stylistic/wrap-iife": "off", + "@stylistic/wrap-regex": "off", + "@stylistic/yield-star-spacing": "off", + "@typescript-eslint/block-spacing": "off", + "@typescript-eslint/brace-style": "off", + "@typescript-eslint/comma-dangle": "off", + "@typescript-eslint/comma-spacing": "off", + "@typescript-eslint/func-call-spacing": "off", + "@typescript-eslint/indent": "off", + "@typescript-eslint/key-spacing": "off", + "@typescript-eslint/keyword-spacing": "off", + "@typescript-eslint/lines-around-comment": 0, + "@typescript-eslint/member-delimiter-style": "off", + "@typescript-eslint/no-extra-parens": "off", + "@typescript-eslint/no-extra-semi": "off", + "@typescript-eslint/object-curly-spacing": "off", + "@typescript-eslint/quotes": 0, + "@typescript-eslint/semi": "off", + "@typescript-eslint/space-before-blocks": "off", + "@typescript-eslint/space-before-function-paren": "off", + "@typescript-eslint/space-infix-ops": "off", + "@typescript-eslint/type-annotation-spacing": "off", + "array-bracket-newline": "off", + "array-bracket-spacing": "off", + "array-element-newline": "off", + "arrow-body-style": "off", + "arrow-parens": "off", + "arrow-spacing": "off", + "babel/object-curly-spacing": "off", + "babel/quotes": 0, + "babel/semi": "off", + "block-spacing": "off", + "brace-style": "off", + "comma-dangle": "off", + "comma-spacing": "off", + "comma-style": "off", + "computed-property-spacing": "off", + "curly": 0, + "dot-location": "off", + "eol-last": "off", + "flowtype/boolean-style": "off", + "flowtype/delimiter-dangle": "off", + "flowtype/generic-spacing": "off", + "flowtype/object-type-curly-spacing": "off", + "flowtype/object-type-delimiter": "off", + "flowtype/quotes": "off", + "flowtype/semi": "off", + "flowtype/space-after-type-colon": "off", + "flowtype/space-before-generic-bracket": "off", + "flowtype/space-before-type-colon": "off", + "flowtype/union-intersection-spacing": "off", + "func-call-spacing": "off", + "function-call-argument-newline": "off", + "function-paren-newline": "off", + "generator-star": "off", + "generator-star-spacing": "off", + "implicit-arrow-linebreak": "off", + "indent": "off", + "indent-legacy": "off", + "jsx-quotes": "off", + "key-spacing": "off", + "keyword-spacing": "off", + "linebreak-style": "off", + "lines-around-comment": 0, + "max-len": 0, + "max-statements-per-line": "off", + "multiline-ternary": "off", + "new-parens": "off", + "newline-per-chained-call": "off", + "no-arrow-condition": "off", + "no-comma-dangle": "off", + "no-confusing-arrow": 0, + "no-extra-parens": "off", + "no-extra-semi": "off", + "no-floating-decimal": "off", + "no-mixed-operators": 0, + "no-mixed-spaces-and-tabs": "off", + "no-multi-spaces": "off", + "no-multiple-empty-lines": "off", + "no-reserved-keys": "off", + "no-space-before-semi": "off", + "no-spaced-func": "off", + "no-tabs": 0, + "no-trailing-spaces": "off", + "no-unexpected-multiline": 0, + "no-whitespace-before-property": "off", + "no-wrap-func": "off", + "nonblock-statement-body-position": "off", + "object-curly-newline": "off", + "object-curly-spacing": "off", + "object-property-newline": "off", + "one-var-declaration-per-line": "off", + "operator-linebreak": "off", + "padded-blocks": "off", + "prefer-arrow-callback": "off", + "prettier/prettier": "error", + "quote-props": "off", + "quotes": 0, + "react/jsx-child-element-spacing": "off", + "react/jsx-closing-bracket-location": "off", + "react/jsx-closing-tag-location": "off", + "react/jsx-curly-newline": "off", + "react/jsx-curly-spacing": "off", + "react/jsx-equals-spacing": "off", + "react/jsx-first-prop-new-line": "off", + "react/jsx-indent": "off", + "react/jsx-indent-props": "off", + "react/jsx-max-props-per-line": "off", + "react/jsx-newline": "off", + "react/jsx-one-expression-per-line": "off", + "react/jsx-props-no-multi-spaces": "off", + "react/jsx-space-before-closing": "off", + "react/jsx-tag-spacing": "off", + "react/jsx-wrap-multilines": "off", + "rest-spread-spacing": "off", + "semi": "off", + "semi-spacing": "off", + "semi-style": "off", + "space-after-function-name": "off", + "space-after-keywords": "off", + "space-before-blocks": "off", + "space-before-function-paren": "off", + "space-before-function-parentheses": "off", + "space-before-keywords": "off", + "space-in-brackets": "off", + "space-in-parens": "off", + "space-infix-ops": "off", + "space-return-throw-case": "off", + "space-unary-ops": "off", + "space-unary-word-ops": "off", + "standard/array-bracket-even-spacing": "off", + "standard/computed-property-even-spacing": "off", + "standard/object-curly-even-spacing": "off", + "switch-colon-spacing": "off", + "template-curly-spacing": "off", + "template-tag-spacing": "off", + "unicorn/empty-brace-spaces": "off", + "unicorn/no-nested-ternary": "off", + "unicorn/number-literal-case": "off", + "unicorn/template-indent": 0, + "vue/array-bracket-newline": "off", + "vue/array-bracket-spacing": "off", + "vue/array-element-newline": "off", + "vue/arrow-spacing": "off", + "vue/block-spacing": "off", + "vue/block-tag-newline": "off", + "vue/brace-style": "off", + "vue/comma-dangle": "off", + "vue/comma-spacing": "off", + "vue/comma-style": "off", + "vue/dot-location": "off", + "vue/func-call-spacing": "off", + "vue/html-closing-bracket-newline": "off", + "vue/html-closing-bracket-spacing": "off", + "vue/html-end-tags": "off", + "vue/html-indent": "off", + "vue/html-quotes": "off", + "vue/html-self-closing": 0, + "vue/key-spacing": "off", + "vue/keyword-spacing": "off", + "vue/max-attributes-per-line": "off", + "vue/max-len": 0, + "vue/multiline-html-element-content-newline": "off", + "vue/multiline-ternary": "off", + "vue/mustache-interpolation-spacing": "off", + "vue/no-extra-parens": "off", + "vue/no-multi-spaces": "off", + "vue/no-spaces-around-equal-signs-in-attribute": "off", + "vue/object-curly-newline": "off", + "vue/object-curly-spacing": "off", + "vue/object-property-newline": "off", + "vue/operator-linebreak": "off", + "vue/quote-props": "off", + "vue/script-indent": "off", + "vue/singleline-html-element-content-newline": "off", + "vue/space-in-parens": "off", + "vue/space-infix-ops": "off", + "vue/space-unary-ops": "off", + "vue/template-curly-spacing": "off", + "wrap-iife": "off", + "wrap-regex": "off", + "yield-star-spacing": "off", + }, + }, + { + "languageOptions": { + "parser": { + "meta": { + "name": "typescript-eslint/parser", + "version": "8.27.0", + }, + "parseForESLint": [Function], + }, + "sourceType": "module", + }, + "name": "typescript-eslint/base", + "plugins": { + "@typescript-eslint": { + "configs": { + "all": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/ban-tslint-comment": "error", + "@typescript-eslint/class-literal-property-style": "error", + "@typescript-eslint/class-methods-use-this": "error", + "@typescript-eslint/consistent-generic-constructors": "error", + "@typescript-eslint/consistent-indexed-object-style": "error", + "@typescript-eslint/consistent-return": "error", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/consistent-type-exports": "error", + "@typescript-eslint/consistent-type-imports": "error", + "@typescript-eslint/default-param-last": "error", + "@typescript-eslint/dot-notation": "error", + "@typescript-eslint/explicit-function-return-type": "error", + "@typescript-eslint/explicit-member-accessibility": "error", + "@typescript-eslint/explicit-module-boundary-types": "error", + "@typescript-eslint/init-declarations": "error", + "@typescript-eslint/max-params": "error", + "@typescript-eslint/member-ordering": "error", + "@typescript-eslint/method-signature-style": "error", + "@typescript-eslint/naming-convention": "error", + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-confusing-non-null-assertion": "error", + "@typescript-eslint/no-confusing-void-expression": "error", + "@typescript-eslint/no-deprecated": "error", + "@typescript-eslint/no-dupe-class-members": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-dynamic-delete": "error", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-extraneous-class": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-import-type-side-effects": "error", + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/no-invalid-this": "error", + "@typescript-eslint/no-invalid-void-type": "error", + "@typescript-eslint/no-loop-func": "error", + "@typescript-eslint/no-magic-numbers": "error", + "@typescript-eslint/no-meaningless-void-operator": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/no-misused-spread": "error", + "@typescript-eslint/no-mixed-enums": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-redeclare": "error", + "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-restricted-imports": "error", + "@typescript-eslint/no-restricted-types": "error", + "@typescript-eslint/no-shadow": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", + "@typescript-eslint/no-unnecessary-condition": "error", + "@typescript-eslint/no-unnecessary-parameter-property-assignment": "error", + "@typescript-eslint/no-unnecessary-qualifier": "error", + "@typescript-eslint/no-unnecessary-template-expression": "error", + "@typescript-eslint/no-unnecessary-type-arguments": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unnecessary-type-parameters": "error", + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-type-assertion": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-use-before-define": "error", + "@typescript-eslint/no-useless-constructor": "error", + "@typescript-eslint/no-useless-empty-export": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/non-nullable-type-assertion-style": "error", + "@typescript-eslint/only-throw-error": "error", + "@typescript-eslint/parameter-properties": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-destructuring": "error", + "@typescript-eslint/prefer-enum-initializers": "error", + "@typescript-eslint/prefer-find": "error", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-includes": "error", + "@typescript-eslint/prefer-literal-enum-member": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/prefer-nullish-coalescing": "error", + "@typescript-eslint/prefer-optional-chain": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "@typescript-eslint/prefer-readonly": "error", + "@typescript-eslint/prefer-readonly-parameter-types": "error", + "@typescript-eslint/prefer-reduce-type-parameter": "error", + "@typescript-eslint/prefer-regexp-exec": "error", + "@typescript-eslint/prefer-return-this-type": "error", + "@typescript-eslint/prefer-string-starts-ends-with": "error", + "@typescript-eslint/promise-function-async": "error", + "@typescript-eslint/related-getter-setter-pairs": "error", + "@typescript-eslint/require-array-sort-compare": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/restrict-plus-operands": "error", + "@typescript-eslint/restrict-template-expressions": "error", + "@typescript-eslint/return-await": "error", + "@typescript-eslint/strict-boolean-expressions": "error", + "@typescript-eslint/switch-exhaustiveness-check": "error", + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/typedef": "error", + "@typescript-eslint/unbound-method": "error", + "@typescript-eslint/unified-signatures": "error", + "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", + "class-methods-use-this": "off", + "consistent-return": "off", + "default-param-last": "off", + "dot-notation": "off", + "init-declarations": "off", + "max-params": "off", + "no-array-constructor": "off", + "no-dupe-class-members": "off", + "no-empty-function": "off", + "no-implied-eval": "off", + "no-invalid-this": "off", + "no-loop-func": "off", + "no-magic-numbers": "off", + "no-redeclare": "off", + "no-restricted-imports": "off", + "no-return-await": "off", + "no-shadow": "off", + "no-throw-literal": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + "no-use-before-define": "off", + "no-useless-constructor": "off", + "prefer-destructuring": "off", + "prefer-promise-reject-errors": "off", + "require-await": "off", + }, + }, + "base": { + "parser": "@typescript-eslint/parser", + "parserOptions": { + "sourceType": "module", + }, + "plugins": [ + "@typescript-eslint", + ], + }, + "disable-type-checked": { + "parserOptions": { + "program": null, + "project": false, + "projectService": false, + }, + "rules": { + "@typescript-eslint/await-thenable": "off", + "@typescript-eslint/consistent-return": "off", + "@typescript-eslint/consistent-type-exports": "off", + "@typescript-eslint/dot-notation": "off", + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/no-array-delete": "off", + "@typescript-eslint/no-base-to-string": "off", + "@typescript-eslint/no-confusing-void-expression": "off", + "@typescript-eslint/no-deprecated": "off", + "@typescript-eslint/no-duplicate-type-constituents": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/no-for-in-array": "off", + "@typescript-eslint/no-implied-eval": "off", + "@typescript-eslint/no-meaningless-void-operator": "off", + "@typescript-eslint/no-misused-promises": "off", + "@typescript-eslint/no-misused-spread": "off", + "@typescript-eslint/no-mixed-enums": "off", + "@typescript-eslint/no-redundant-type-constituents": "off", + "@typescript-eslint/no-unnecessary-boolean-literal-compare": "off", + "@typescript-eslint/no-unnecessary-condition": "off", + "@typescript-eslint/no-unnecessary-qualifier": "off", + "@typescript-eslint/no-unnecessary-template-expression": "off", + "@typescript-eslint/no-unnecessary-type-arguments": "off", + "@typescript-eslint/no-unnecessary-type-assertion": "off", + "@typescript-eslint/no-unnecessary-type-parameters": "off", + "@typescript-eslint/no-unsafe-argument": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unsafe-enum-comparison": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unsafe-return": "off", + "@typescript-eslint/no-unsafe-type-assertion": "off", + "@typescript-eslint/no-unsafe-unary-minus": "off", + "@typescript-eslint/non-nullable-type-assertion-style": "off", + "@typescript-eslint/only-throw-error": "off", + "@typescript-eslint/prefer-destructuring": "off", + "@typescript-eslint/prefer-find": "off", + "@typescript-eslint/prefer-includes": "off", + "@typescript-eslint/prefer-nullish-coalescing": "off", + "@typescript-eslint/prefer-optional-chain": "off", + "@typescript-eslint/prefer-promise-reject-errors": "off", + "@typescript-eslint/prefer-readonly": "off", + "@typescript-eslint/prefer-readonly-parameter-types": "off", + "@typescript-eslint/prefer-reduce-type-parameter": "off", + "@typescript-eslint/prefer-regexp-exec": "off", + "@typescript-eslint/prefer-return-this-type": "off", + "@typescript-eslint/prefer-string-starts-ends-with": "off", + "@typescript-eslint/promise-function-async": "off", + "@typescript-eslint/related-getter-setter-pairs": "off", + "@typescript-eslint/require-array-sort-compare": "off", + "@typescript-eslint/require-await": "off", + "@typescript-eslint/restrict-plus-operands": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/return-await": "off", + "@typescript-eslint/strict-boolean-expressions": "off", + "@typescript-eslint/switch-exhaustiveness-check": "off", + "@typescript-eslint/unbound-method": "off", + "@typescript-eslint/use-unknown-in-catch-callback-variable": "off", + }, + }, + "eslint-recommended": { + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.mts", + "*.cts", + ], + "rules": { + "constructor-super": "off", + "getter-return": "off", + "no-class-assign": "off", + "no-const-assign": "off", + "no-dupe-args": "off", + "no-dupe-class-members": "off", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-new-symbol": "off", + "no-obj-calls": "off", + "no-redeclare": "off", + "no-setter-return": "off", + "no-this-before-super": "off", + "no-undef": "off", + "no-unreachable": "off", + "no-unsafe-negation": "off", + "no-var": "error", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + }, + }, + ], + }, + "recommended": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": "error", + "no-array-constructor": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + }, + }, + "recommended-requiring-type-checking": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/only-throw-error": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/restrict-plus-operands": "error", + "@typescript-eslint/restrict-template-expressions": "error", + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/unbound-method": "error", + "no-array-constructor": "off", + "no-implied-eval": "off", + "no-throw-literal": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + "prefer-promise-reject-errors": "off", + "require-await": "off", + }, + }, + "recommended-type-checked": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/only-throw-error": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/restrict-plus-operands": "error", + "@typescript-eslint/restrict-template-expressions": "error", + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/unbound-method": "error", + "no-array-constructor": "off", + "no-implied-eval": "off", + "no-throw-literal": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + "prefer-promise-reject-errors": "off", + "require-await": "off", + }, + }, + "recommended-type-checked-only": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/only-throw-error": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/restrict-plus-operands": "error", + "@typescript-eslint/restrict-template-expressions": "error", + "@typescript-eslint/unbound-method": "error", + "no-implied-eval": "off", + "no-throw-literal": "off", + "prefer-promise-reject-errors": "off", + "require-await": "off", + }, + }, + "strict": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "minimumDescriptionLength": 10, + }, + ], + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-dynamic-delete": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-extraneous-class": "error", + "@typescript-eslint/no-invalid-void-type": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-useless-constructor": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-literal-enum-member": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/unified-signatures": "error", + "no-array-constructor": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + "no-useless-constructor": "off", + }, + }, + "strict-type-checked": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "minimumDescriptionLength": 10, + }, + ], + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-confusing-void-expression": "error", + "@typescript-eslint/no-deprecated": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-dynamic-delete": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-extraneous-class": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-invalid-void-type": "error", + "@typescript-eslint/no-meaningless-void-operator": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/no-misused-spread": "error", + "@typescript-eslint/no-mixed-enums": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", + "@typescript-eslint/no-unnecessary-condition": "error", + "@typescript-eslint/no-unnecessary-template-expression": "error", + "@typescript-eslint/no-unnecessary-type-arguments": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unnecessary-type-parameters": "error", + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-useless-constructor": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/only-throw-error": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-literal-enum-member": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "@typescript-eslint/prefer-reduce-type-parameter": "error", + "@typescript-eslint/prefer-return-this-type": "error", + "@typescript-eslint/related-getter-setter-pairs": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/restrict-plus-operands": [ + "error", + { + "allowAny": false, + "allowBoolean": false, + "allowNullish": false, + "allowNumberAndString": false, + "allowRegExp": false, + }, + ], + "@typescript-eslint/restrict-template-expressions": [ + "error", + { + "allowAny": false, + "allowBoolean": false, + "allowNever": false, + "allowNullish": false, + "allowNumber": false, + "allowRegExp": false, + }, + ], + "@typescript-eslint/return-await": [ + "error", + "error-handling-correctness-only", + ], + "@typescript-eslint/triple-slash-reference": "error", + "@typescript-eslint/unbound-method": "error", + "@typescript-eslint/unified-signatures": "error", + "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", + "no-array-constructor": "off", + "no-implied-eval": "off", + "no-return-await": "off", + "no-throw-literal": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + "no-useless-constructor": "off", + "prefer-promise-reject-errors": "off", + "require-await": "off", + }, + }, + "strict-type-checked-only": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/no-array-delete": "error", + "@typescript-eslint/no-base-to-string": "error", + "@typescript-eslint/no-confusing-void-expression": "error", + "@typescript-eslint/no-deprecated": "error", + "@typescript-eslint/no-duplicate-type-constituents": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-for-in-array": "error", + "@typescript-eslint/no-implied-eval": "error", + "@typescript-eslint/no-meaningless-void-operator": "error", + "@typescript-eslint/no-misused-promises": "error", + "@typescript-eslint/no-misused-spread": "error", + "@typescript-eslint/no-mixed-enums": "error", + "@typescript-eslint/no-redundant-type-constituents": "error", + "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", + "@typescript-eslint/no-unnecessary-condition": "error", + "@typescript-eslint/no-unnecessary-template-expression": "error", + "@typescript-eslint/no-unnecessary-type-arguments": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unnecessary-type-parameters": "error", + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-enum-comparison": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + "@typescript-eslint/no-unsafe-unary-minus": "error", + "@typescript-eslint/only-throw-error": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "@typescript-eslint/prefer-reduce-type-parameter": "error", + "@typescript-eslint/prefer-return-this-type": "error", + "@typescript-eslint/related-getter-setter-pairs": "error", + "@typescript-eslint/require-await": "error", + "@typescript-eslint/restrict-plus-operands": [ + "error", + { + "allowAny": false, + "allowBoolean": false, + "allowNullish": false, + "allowNumberAndString": false, + "allowRegExp": false, + }, + ], + "@typescript-eslint/restrict-template-expressions": [ + "error", + { + "allowAny": false, + "allowBoolean": false, + "allowNever": false, + "allowNullish": false, + "allowNumber": false, + "allowRegExp": false, + }, + ], + "@typescript-eslint/return-await": [ + "error", + "error-handling-correctness-only", + ], + "@typescript-eslint/unbound-method": "error", + "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", + "no-implied-eval": "off", + "no-return-await": "off", + "no-throw-literal": "off", + "prefer-promise-reject-errors": "off", + "require-await": "off", + }, + }, + "stylistic": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/ban-tslint-comment": "error", + "@typescript-eslint/class-literal-property-style": "error", + "@typescript-eslint/consistent-generic-constructors": "error", + "@typescript-eslint/consistent-indexed-object-style": "error", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/no-confusing-non-null-assertion": "error", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "no-empty-function": "off", + }, + }, + "stylistic-type-checked": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": "error", + "@typescript-eslint/ban-tslint-comment": "error", + "@typescript-eslint/class-literal-property-style": "error", + "@typescript-eslint/consistent-generic-constructors": "error", + "@typescript-eslint/consistent-indexed-object-style": "error", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/dot-notation": "error", + "@typescript-eslint/no-confusing-non-null-assertion": "error", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-inferrable-types": "error", + "@typescript-eslint/non-nullable-type-assertion-style": "error", + "@typescript-eslint/prefer-find": "error", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-includes": "error", + "@typescript-eslint/prefer-nullish-coalescing": "error", + "@typescript-eslint/prefer-optional-chain": "error", + "@typescript-eslint/prefer-regexp-exec": "error", + "@typescript-eslint/prefer-string-starts-ends-with": "error", + "dot-notation": "off", + "no-empty-function": "off", + }, + }, + "stylistic-type-checked-only": { + "extends": [ + "./configs/base", + "./configs/eslint-recommended", + ], + "rules": { + "@typescript-eslint/dot-notation": "error", + "@typescript-eslint/non-nullable-type-assertion-style": "error", + "@typescript-eslint/prefer-find": "error", + "@typescript-eslint/prefer-includes": "error", + "@typescript-eslint/prefer-nullish-coalescing": "error", + "@typescript-eslint/prefer-optional-chain": "error", + "@typescript-eslint/prefer-regexp-exec": "error", + "@typescript-eslint/prefer-string-starts-ends-with": "error", + "dot-notation": "off", + }, + }, + }, + "meta": { + "name": "@typescript-eslint/eslint-plugin", + "version": "8.27.0", + }, + "rules": { + "adjacent-overload-signatures": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Require that function overload signatures be consecutive", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/adjacent-overload-signatures", + }, + "messages": { + "adjacentSignature": "All {{name}} signatures should be adjacent.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "array-type": { + "create": [Function], + "defaultOptions": [ + { + "default": "array", + }, + ], + "meta": { + "docs": { + "description": "Require consistently using either \`T[]\` or \`Array\` for arrays", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/array-type", + }, + "fixable": "code", + "messages": { + "errorStringArray": "Array type using '{{className}}<{{type}}>' is forbidden. Use '{{readonlyPrefix}}{{type}}[]' instead.", + "errorStringArrayReadonly": "Array type using '{{className}}<{{type}}>' is forbidden. Use '{{readonlyPrefix}}{{type}}' instead.", + "errorStringArraySimple": "Array type using '{{className}}<{{type}}>' is forbidden for simple types. Use '{{readonlyPrefix}}{{type}}[]' instead.", + "errorStringArraySimpleReadonly": "Array type using '{{className}}<{{type}}>' is forbidden for simple types. Use '{{readonlyPrefix}}{{type}}' instead.", + "errorStringGeneric": "Array type using '{{readonlyPrefix}}{{type}}[]' is forbidden. Use '{{className}}<{{type}}>' instead.", + "errorStringGenericSimple": "Array type using '{{readonlyPrefix}}{{type}}[]' is forbidden for non-simple types. Use '{{className}}<{{type}}>' instead.", + }, + "schema": [ + { + "$defs": { + "arrayOption": { + "enum": [ + "array", + "generic", + "array-simple", + ], + "type": "string", + }, + }, + "additionalProperties": false, + "properties": { + "default": { + "$ref": "#/items/0/$defs/arrayOption", + "description": "The array type expected for mutable cases.", + }, + "readonly": { + "$ref": "#/items/0/$defs/arrayOption", + "description": "The array type expected for readonly cases. If omitted, the value for \`default\` will be used.", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "await-thenable": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow awaiting a value that is not a Thenable", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/await-thenable", + }, + "hasSuggestions": true, + "messages": { + "await": "Unexpected \`await\` of a non-Promise (non-"Thenable") value.", + "awaitUsingOfNonAsyncDisposable": "Unexpected \`await using\` of a value that is not async disposable.", + "convertToOrdinaryFor": "Convert to an ordinary \`for...of\` loop.", + "forAwaitOfNonAsyncIterable": "Unexpected \`for await...of\` of a value that is not async iterable.", + "removeAwait": "Remove unnecessary \`await\`.", + }, + "schema": [], + "type": "problem", + }, + }, + "ban-ts-comment": { + "create": [Function], + "defaultOptions": [ + { + "minimumDescriptionLength": 3, + "ts-check": false, + "ts-expect-error": "allow-with-description", + "ts-ignore": true, + "ts-nocheck": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow \`@ts-\` comments or require descriptions after directives", + "recommended": { + "recommended": true, + "strict": [ + { + "minimumDescriptionLength": 10, + }, + ], + }, + "url": "https://typescript-eslint.io/rules/ban-ts-comment", + }, + "hasSuggestions": true, + "messages": { + "replaceTsIgnoreWithTsExpectError": "Replace "@ts-ignore" with "@ts-expect-error".", + "tsDirectiveComment": "Do not use "@ts-{{directive}}" because it alters compilation errors.", + "tsDirectiveCommentDescriptionNotMatchPattern": "The description for the "@ts-{{directive}}" directive must match the {{format}} format.", + "tsDirectiveCommentRequiresDescription": "Include a description after the "@ts-{{directive}}" directive to explain why the @ts-{{directive}} is necessary. The description must be {{minimumDescriptionLength}} characters or longer.", + "tsIgnoreInsteadOfExpectError": "Use "@ts-expect-error" instead of "@ts-ignore", as "@ts-ignore" will do nothing if the following line is error-free.", + }, + "schema": [ + { + "$defs": { + "directiveConfigSchema": { + "oneOf": [ + { + "default": true, + "type": "boolean", + }, + { + "enum": [ + "allow-with-description", + ], + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "descriptionFormat": { + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + }, + "additionalProperties": false, + "properties": { + "minimumDescriptionLength": { + "default": 3, + "description": "A minimum character length for descriptions when \`allow-with-description\` is enabled.", + "type": "number", + }, + "ts-check": { + "$ref": "#/items/0/$defs/directiveConfigSchema", + }, + "ts-expect-error": { + "$ref": "#/items/0/$defs/directiveConfigSchema", + }, + "ts-ignore": { + "$ref": "#/items/0/$defs/directiveConfigSchema", + }, + "ts-nocheck": { + "$ref": "#/items/0/$defs/directiveConfigSchema", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "ban-tslint-comment": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow \`// tslint:\` comments", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/ban-tslint-comment", + }, + "fixable": "code", + "messages": { + "commentDetected": "tslint comment detected: "{{ text }}"", + }, + "schema": [], + "type": "suggestion", + }, + }, + "class-literal-property-style": { + "create": [Function], + "defaultOptions": [ + "fields", + ], + "meta": { + "docs": { + "description": "Enforce that literals on classes are exposed in a consistent style", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/class-literal-property-style", + }, + "hasSuggestions": true, + "messages": { + "preferFieldStyle": "Literals should be exposed using readonly fields.", + "preferFieldStyleSuggestion": "Replace the literals with readonly fields.", + "preferGetterStyle": "Literals should be exposed using getters.", + "preferGetterStyleSuggestion": "Replace the literals with getters.", + }, + "schema": [ + { + "description": "Which literal class member syntax to prefer.", + "enum": [ + "fields", + "getters", + ], + "type": "string", + }, + ], + "type": "problem", + }, + }, + "class-methods-use-this": { + "create": [Function], + "defaultOptions": [ + { + "enforceForClassFields": true, + "exceptMethods": [], + "ignoreClassesThatImplementAnInterface": false, + "ignoreOverrideMethods": false, + }, + ], + "meta": { + "docs": { + "description": "Enforce that class methods utilize \`this\`", + "extendsBaseRule": true, + "requiresTypeChecking": false, + "url": "https://typescript-eslint.io/rules/class-methods-use-this", + }, + "messages": { + "missingThis": "Expected 'this' to be used by class {{name}}.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "enforceForClassFields": { + "default": true, + "description": "Enforces that functions used as instance field initializers utilize \`this\`.", + "type": "boolean", + }, + "exceptMethods": { + "description": "Allows specified method names to be ignored with this rule.", + "items": { + "type": "string", + }, + "type": "array", + }, + "ignoreClassesThatImplementAnInterface": { + "description": "Whether to ignore class members that are defined within a class that \`implements\` a type.", + "oneOf": [ + { + "description": "Ignore all classes that implement an interface", + "type": "boolean", + }, + { + "description": "Ignore only the public fields of classes that implement an interface", + "enum": [ + "public-fields", + ], + "type": "string", + }, + ], + }, + "ignoreOverrideMethods": { + "description": "Whether to ignore members marked with the \`override\` modifier.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "consistent-generic-constructors": { + "create": [Function], + "defaultOptions": [ + "constructor", + ], + "meta": { + "docs": { + "description": "Enforce specifying generic type arguments on type annotation or constructor name of a constructor call", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/consistent-generic-constructors", + }, + "fixable": "code", + "messages": { + "preferConstructor": "The generic type arguments should be specified as part of the constructor type arguments.", + "preferTypeAnnotation": "The generic type arguments should be specified as part of the type annotation.", + }, + "schema": [ + { + "description": "Which constructor call syntax to prefer.", + "enum": [ + "type-annotation", + "constructor", + ], + "type": "string", + }, + ], + "type": "suggestion", + }, + }, + "consistent-indexed-object-style": { + "create": [Function], + "defaultOptions": [ + "record", + ], + "meta": { + "docs": { + "description": "Require or disallow the \`Record\` type", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/consistent-indexed-object-style", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "preferIndexSignature": "An index signature is preferred over a record.", + "preferIndexSignatureSuggestion": "Change into an index signature instead of a record.", + "preferRecord": "A record is preferred over an index signature.", + }, + "schema": [ + { + "description": "Which indexed object syntax to prefer.", + "enum": [ + "record", + "index-signature", + ], + "type": "string", + }, + ], + "type": "suggestion", + }, + }, + "consistent-return": { + "create": [Function], + "defaultOptions": [ + { + "treatUndefinedAsUnspecified": false, + }, + ], + "meta": { + "defaultOptions": [ + { + "treatUndefinedAsUnspecified": false, + }, + ], + "docs": { + "description": "Require \`return\` statements to either always or never specify values", + "extendsBaseRule": true, + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/consistent-return", + }, + "hasSuggestions": undefined, + "messages": { + "missingReturn": "Expected to return a value at the end of {{name}}.", + "missingReturnValue": "{{name}} expected a return value.", + "unexpectedReturnValue": "{{name}} expected no return value.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "treatUndefinedAsUnspecified": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "consistent-type-assertions": { + "create": [Function], + "defaultOptions": [ + { + "arrayLiteralTypeAssertions": "allow", + "assertionStyle": "as", + "objectLiteralTypeAssertions": "allow", + }, + ], + "meta": { + "docs": { + "description": "Enforce consistent usage of type assertions", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/consistent-type-assertions", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "angle-bracket": "Use '<{{cast}}>' instead of 'as {{cast}}'.", + "as": "Use 'as {{cast}}' instead of '<{{cast}}>'.", + "never": "Do not use any type assertions.", + "replaceArrayTypeAssertionWithAnnotation": "Use const x: {{cast}} = [ ... ] instead.", + "replaceArrayTypeAssertionWithSatisfies": "Use const x = [ ... ] satisfies {{cast}} instead.", + "replaceObjectTypeAssertionWithAnnotation": "Use const x: {{cast}} = { ... } instead.", + "replaceObjectTypeAssertionWithSatisfies": "Use const x = { ... } satisfies {{cast}} instead.", + "unexpectedArrayTypeAssertion": "Always prefer const x: T[] = [ ... ].", + "unexpectedObjectTypeAssertion": "Always prefer const x: T = { ... }.", + }, + "schema": [ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "assertionStyle": { + "description": "The expected assertion style to enforce.", + "enum": [ + "never", + ], + "type": "string", + }, + }, + "required": [ + "assertionStyle", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "arrayLiteralTypeAssertions": { + "description": "Whether to always prefer type declarations for array literals used as variable initializers, rather than type assertions.", + "enum": [ + "allow", + "allow-as-parameter", + "never", + ], + "type": "string", + }, + "assertionStyle": { + "description": "The expected assertion style to enforce.", + "enum": [ + "as", + "angle-bracket", + ], + "type": "string", + }, + "objectLiteralTypeAssertions": { + "description": "Whether to always prefer type declarations for object literals used as variable initializers, rather than type assertions.", + "enum": [ + "allow", + "allow-as-parameter", + "never", + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + ], + "type": "suggestion", + }, + }, + "consistent-type-definitions": { + "create": [Function], + "defaultOptions": [ + "interface", + ], + "meta": { + "docs": { + "description": "Enforce type definitions to consistently use either \`interface\` or \`type\`", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/consistent-type-definitions", + }, + "fixable": "code", + "messages": { + "interfaceOverType": "Use an \`interface\` instead of a \`type\`.", + "typeOverInterface": "Use a \`type\` instead of an \`interface\`.", + }, + "schema": [ + { + "description": "Which type definition syntax to prefer.", + "enum": [ + "interface", + "type", + ], + "type": "string", + }, + ], + "type": "suggestion", + }, + }, + "consistent-type-exports": { + "create": [Function], + "defaultOptions": [ + { + "fixMixedExportsWithInlineTypeSpecifier": false, + }, + ], + "meta": { + "docs": { + "description": "Enforce consistent usage of type exports", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/consistent-type-exports", + }, + "fixable": "code", + "messages": { + "multipleExportsAreTypes": "Type exports {{exportNames}} are not values and should be exported using \`export type\`.", + "singleExportIsType": "Type export {{exportNames}} is not a value and should be exported using \`export type\`.", + "typeOverValue": "All exports in the declaration are only used as types. Use \`export type\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "fixMixedExportsWithInlineTypeSpecifier": { + "description": "Whether the rule will autofix "mixed" export cases using TS inline type specifiers.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "consistent-type-imports": { + "create": [Function], + "defaultOptions": [ + { + "disallowTypeAnnotations": true, + "fixStyle": "separate-type-imports", + "prefer": "type-imports", + }, + ], + "meta": { + "docs": { + "description": "Enforce consistent usage of type imports", + "url": "https://typescript-eslint.io/rules/consistent-type-imports", + }, + "fixable": "code", + "messages": { + "avoidImportType": "Use an \`import\` instead of an \`import type\`.", + "noImportTypeAnnotations": "\`import()\` type annotations are forbidden.", + "someImportsAreOnlyTypes": "Imports {{typeImports}} are only used as type.", + "typeOverValue": "All imports in the declaration are only used as types. Use \`import type\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "disallowTypeAnnotations": { + "description": "Whether to disallow type imports in type annotations (\`import()\`).", + "type": "boolean", + }, + "fixStyle": { + "description": "The expected type modifier to be added when an import is detected as used only in the type position.", + "enum": [ + "separate-type-imports", + "inline-type-imports", + ], + "type": "string", + }, + "prefer": { + "description": "The expected import kind for type-only imports.", + "enum": [ + "type-imports", + "no-type-imports", + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "default-param-last": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce default parameters to be last", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/default-param-last", + }, + "messages": { + "shouldBeLast": "Default parameters should be last.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "dot-notation": { + "create": [Function], + "defaultOptions": [ + { + "allowIndexSignaturePropertyAccess": false, + "allowKeywords": true, + "allowPattern": "", + "allowPrivateClassPropertyAccess": false, + "allowProtectedClassPropertyAccess": false, + }, + ], + "meta": { + "defaultOptions": [ + { + "allowIndexSignaturePropertyAccess": false, + "allowKeywords": true, + "allowPattern": "", + "allowPrivateClassPropertyAccess": false, + "allowProtectedClassPropertyAccess": false, + }, + ], + "docs": { + "description": "Enforce dot notation whenever possible", + "extendsBaseRule": true, + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/dot-notation", + }, + "fixable": "code", + "hasSuggestions": undefined, + "messages": { + "useBrackets": ".{{key}} is a syntax error.", + "useDot": "[{{key}}] is better written in dot notation.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowIndexSignaturePropertyAccess": { + "default": false, + "description": "Whether to allow accessing properties matching an index signature with array notation.", + "type": "boolean", + }, + "allowKeywords": { + "default": true, + "description": "Whether to allow keywords such as ["class"]\`.", + "type": "boolean", + }, + "allowPattern": { + "default": "", + "description": "Regular expression of names to allow.", + "type": "string", + }, + "allowPrivateClassPropertyAccess": { + "default": false, + "description": "Whether to allow accessing class members marked as \`private\` with array notation.", + "type": "boolean", + }, + "allowProtectedClassPropertyAccess": { + "default": false, + "description": "Whether to allow accessing class members marked as \`protected\` with array notation.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "explicit-function-return-type": { + "create": [Function], + "defaultOptions": [ + { + "allowConciseArrowFunctionExpressionsStartingWithVoid": false, + "allowDirectConstAssertionInArrowFunctions": true, + "allowExpressions": false, + "allowFunctionsWithoutTypeParameters": false, + "allowHigherOrderFunctions": true, + "allowIIFEs": false, + "allowTypedFunctionExpressions": true, + "allowedNames": [], + }, + ], + "meta": { + "docs": { + "description": "Require explicit return types on functions and class methods", + "url": "https://typescript-eslint.io/rules/explicit-function-return-type", + }, + "messages": { + "missingReturnType": "Missing return type on function.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowConciseArrowFunctionExpressionsStartingWithVoid": { + "description": "Whether to allow arrow functions that start with the \`void\` keyword.", + "type": "boolean", + }, + "allowDirectConstAssertionInArrowFunctions": { + "description": "Whether to ignore arrow functions immediately returning a \`as const\` value.", + "type": "boolean", + }, + "allowExpressions": { + "description": "Whether to ignore function expressions (functions which are not part of a declaration).", + "type": "boolean", + }, + "allowFunctionsWithoutTypeParameters": { + "description": "Whether to ignore functions that don't have generic type parameters.", + "type": "boolean", + }, + "allowHigherOrderFunctions": { + "description": "Whether to ignore functions immediately returning another function expression.", + "type": "boolean", + }, + "allowIIFEs": { + "description": "Whether to ignore immediately invoked function expressions (IIFEs).", + "type": "boolean", + }, + "allowTypedFunctionExpressions": { + "description": "Whether to ignore type annotations on the variable of function expressions.", + "type": "boolean", + }, + "allowedNames": { + "description": "An array of function/method names that will not have their arguments or return values checked.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "explicit-member-accessibility": { + "create": [Function], + "defaultOptions": [ + { + "accessibility": "explicit", + }, + ], + "meta": { + "docs": { + "description": "Require explicit accessibility modifiers on class properties and methods", + "url": "https://typescript-eslint.io/rules/explicit-member-accessibility", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "addExplicitAccessibility": "Add '{{ type }}' accessibility modifier", + "missingAccessibility": "Missing accessibility modifier on {{type}} {{name}}.", + "unwantedPublicAccessibility": "Public accessibility modifier on {{type}} {{name}}.", + }, + "schema": [ + { + "$defs": { + "accessibilityLevel": { + "oneOf": [ + { + "description": "Always require an accessor.", + "enum": [ + "explicit", + ], + "type": "string", + }, + { + "description": "Require an accessor except when public.", + "enum": [ + "no-public", + ], + "type": "string", + }, + { + "description": "Never check whether there is an accessor.", + "enum": [ + "off", + ], + "type": "string", + }, + ], + }, + }, + "additionalProperties": false, + "properties": { + "accessibility": { + "$ref": "#/items/0/$defs/accessibilityLevel", + "description": "Which accessibility modifier is required to exist or not exist.", + }, + "ignoredMethodNames": { + "description": "Specific method names that may be ignored.", + "items": { + "type": "string", + }, + "type": "array", + }, + "overrides": { + "additionalProperties": false, + "description": "Changes to required accessibility modifiers for specific kinds of class members.", + "properties": { + "accessors": { + "$ref": "#/items/0/$defs/accessibilityLevel", + }, + "constructors": { + "$ref": "#/items/0/$defs/accessibilityLevel", + }, + "methods": { + "$ref": "#/items/0/$defs/accessibilityLevel", + }, + "parameterProperties": { + "$ref": "#/items/0/$defs/accessibilityLevel", + }, + "properties": { + "$ref": "#/items/0/$defs/accessibilityLevel", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "explicit-module-boundary-types": { + "create": [Function], + "defaultOptions": [ + { + "allowArgumentsExplicitlyTypedAsAny": false, + "allowDirectConstAssertionInArrowFunctions": true, + "allowHigherOrderFunctions": true, + "allowOverloadFunctions": false, + "allowTypedFunctionExpressions": true, + "allowedNames": [], + }, + ], + "meta": { + "docs": { + "description": "Require explicit return and argument types on exported functions' and classes' public class methods", + "url": "https://typescript-eslint.io/rules/explicit-module-boundary-types", + }, + "messages": { + "anyTypedArg": "Argument '{{name}}' should be typed with a non-any type.", + "anyTypedArgUnnamed": "{{type}} argument should be typed with a non-any type.", + "missingArgType": "Argument '{{name}}' should be typed.", + "missingArgTypeUnnamed": "{{type}} argument should be typed.", + "missingReturnType": "Missing return type on function.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowArgumentsExplicitlyTypedAsAny": { + "description": "Whether to ignore arguments that are explicitly typed as \`any\`.", + "type": "boolean", + }, + "allowDirectConstAssertionInArrowFunctions": { + "description": "Whether to ignore return type annotations on body-less arrow functions that return an \`as const\` type assertion. +You must still type the parameters of the function.", + "type": "boolean", + }, + "allowHigherOrderFunctions": { + "description": "Whether to ignore return type annotations on functions immediately returning another function expression. +You must still type the parameters of the function.", + "type": "boolean", + }, + "allowOverloadFunctions": { + "description": "Whether to ignore return type annotations on functions with overload signatures.", + "type": "boolean", + }, + "allowTypedFunctionExpressions": { + "description": "Whether to ignore type annotations on the variable of a function expression.", + "type": "boolean", + }, + "allowedNames": { + "description": "An array of function/method names that will not have their arguments or return values checked.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "init-declarations": { + "create": [Function], + "defaultOptions": [ + "always", + ], + "meta": { + "docs": { + "description": "Require or disallow initialization in variable declarations", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/init-declarations", + }, + "hasSuggestions": undefined, + "messages": { + "initialized": "Variable '{{idName}}' should be initialized on declaration.", + "notInitialized": "Variable '{{idName}}' should not be initialized on declaration.", + }, + "schema": { + "anyOf": [ + { + "items": [ + { + "enum": [ + "always", + ], + }, + ], + "maxItems": 1, + "minItems": 0, + "type": "array", + }, + { + "items": [ + { + "enum": [ + "never", + ], + }, + { + "additionalProperties": false, + "properties": { + "ignoreForLoopInit": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "maxItems": 2, + "minItems": 0, + "type": "array", + }, + ], + }, + "type": "suggestion", + }, + }, + "max-params": { + "create": [Function], + "defaultOptions": [ + { + "countVoidThis": false, + "max": 3, + }, + ], + "meta": { + "docs": { + "description": "Enforce a maximum number of parameters in function definitions", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/max-params", + }, + "messages": { + "exceed": "{{name}} has too many parameters ({{count}}). Maximum allowed is {{max}}.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "countVoidThis": { + "description": "Whether to count a \`this\` declaration when the type is \`void\`.", + "type": "boolean", + }, + "max": { + "description": "A maximum number of parameters in function definitions.", + "minimum": 0, + "type": "integer", + }, + "maximum": { + "description": "(deprecated) A maximum number of parameters in function definitions.", + "minimum": 0, + "type": "integer", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "member-ordering": { + "create": [Function], + "defaultOptions": [ + { + "default": { + "memberTypes": [ + "signature", + "call-signature", + "public-static-field", + "protected-static-field", + "private-static-field", + "#private-static-field", + "public-decorated-field", + "protected-decorated-field", + "private-decorated-field", + "public-instance-field", + "protected-instance-field", + "private-instance-field", + "#private-instance-field", + "public-abstract-field", + "protected-abstract-field", + "public-field", + "protected-field", + "private-field", + "#private-field", + "static-field", + "instance-field", + "abstract-field", + "decorated-field", + "field", + "static-initialization", + "public-constructor", + "protected-constructor", + "private-constructor", + "constructor", + "public-static-accessor", + "protected-static-accessor", + "private-static-accessor", + "#private-static-accessor", + "public-decorated-accessor", + "protected-decorated-accessor", + "private-decorated-accessor", + "public-instance-accessor", + "protected-instance-accessor", + "private-instance-accessor", + "#private-instance-accessor", + "public-abstract-accessor", + "protected-abstract-accessor", + "public-accessor", + "protected-accessor", + "private-accessor", + "#private-accessor", + "static-accessor", + "instance-accessor", + "abstract-accessor", + "decorated-accessor", + "accessor", + "public-static-get", + "protected-static-get", + "private-static-get", + "#private-static-get", + "public-decorated-get", + "protected-decorated-get", + "private-decorated-get", + "public-instance-get", + "protected-instance-get", + "private-instance-get", + "#private-instance-get", + "public-abstract-get", + "protected-abstract-get", + "public-get", + "protected-get", + "private-get", + "#private-get", + "static-get", + "instance-get", + "abstract-get", + "decorated-get", + "get", + "public-static-set", + "protected-static-set", + "private-static-set", + "#private-static-set", + "public-decorated-set", + "protected-decorated-set", + "private-decorated-set", + "public-instance-set", + "protected-instance-set", + "private-instance-set", + "#private-instance-set", + "public-abstract-set", + "protected-abstract-set", + "public-set", + "protected-set", + "private-set", + "#private-set", + "static-set", + "instance-set", + "abstract-set", + "decorated-set", + "set", + "public-static-method", + "protected-static-method", + "private-static-method", + "#private-static-method", + "public-decorated-method", + "protected-decorated-method", + "private-decorated-method", + "public-instance-method", + "protected-instance-method", + "private-instance-method", + "#private-instance-method", + "public-abstract-method", + "protected-abstract-method", + "public-method", + "protected-method", + "private-method", + "#private-method", + "static-method", + "instance-method", + "abstract-method", + "decorated-method", + "method", + ], + }, + }, + ], + "meta": { + "docs": { + "description": "Require a consistent member declaration order", + "url": "https://typescript-eslint.io/rules/member-ordering", + }, + "messages": { + "incorrectGroupOrder": "Member {{name}} should be declared before all {{rank}} definitions.", + "incorrectOrder": "Member {{member}} should be declared before member {{beforeMember}}.", + "incorrectRequiredMembersOrder": "Member {{member}} should be declared after all {{optionalOrRequired}} members.", + }, + "schema": [ + { + "$defs": { + "allItems": { + "enum": [ + "readonly-signature", + "signature", + "readonly-field", + "public-readonly-field", + "public-decorated-readonly-field", + "decorated-readonly-field", + "static-readonly-field", + "public-static-readonly-field", + "instance-readonly-field", + "public-instance-readonly-field", + "abstract-readonly-field", + "public-abstract-readonly-field", + "protected-readonly-field", + "protected-decorated-readonly-field", + "protected-static-readonly-field", + "protected-instance-readonly-field", + "protected-abstract-readonly-field", + "private-readonly-field", + "private-decorated-readonly-field", + "private-static-readonly-field", + "private-instance-readonly-field", + "#private-readonly-field", + "#private-static-readonly-field", + "#private-instance-readonly-field", + "field", + "public-field", + "public-decorated-field", + "decorated-field", + "static-field", + "public-static-field", + "instance-field", + "public-instance-field", + "abstract-field", + "public-abstract-field", + "protected-field", + "protected-decorated-field", + "protected-static-field", + "protected-instance-field", + "protected-abstract-field", + "private-field", + "private-decorated-field", + "private-static-field", + "private-instance-field", + "#private-field", + "#private-static-field", + "#private-instance-field", + "method", + "public-method", + "public-decorated-method", + "decorated-method", + "static-method", + "public-static-method", + "instance-method", + "public-instance-method", + "abstract-method", + "public-abstract-method", + "protected-method", + "protected-decorated-method", + "protected-static-method", + "protected-instance-method", + "protected-abstract-method", + "private-method", + "private-decorated-method", + "private-static-method", + "private-instance-method", + "#private-method", + "#private-static-method", + "#private-instance-method", + "call-signature", + "constructor", + "public-constructor", + "protected-constructor", + "private-constructor", + "accessor", + "public-accessor", + "public-decorated-accessor", + "decorated-accessor", + "static-accessor", + "public-static-accessor", + "instance-accessor", + "public-instance-accessor", + "abstract-accessor", + "public-abstract-accessor", + "protected-accessor", + "protected-decorated-accessor", + "protected-static-accessor", + "protected-instance-accessor", + "protected-abstract-accessor", + "private-accessor", + "private-decorated-accessor", + "private-static-accessor", + "private-instance-accessor", + "#private-accessor", + "#private-static-accessor", + "#private-instance-accessor", + "get", + "public-get", + "public-decorated-get", + "decorated-get", + "static-get", + "public-static-get", + "instance-get", + "public-instance-get", + "abstract-get", + "public-abstract-get", + "protected-get", + "protected-decorated-get", + "protected-static-get", + "protected-instance-get", + "protected-abstract-get", + "private-get", + "private-decorated-get", + "private-static-get", + "private-instance-get", + "#private-get", + "#private-static-get", + "#private-instance-get", + "set", + "public-set", + "public-decorated-set", + "decorated-set", + "static-set", + "public-static-set", + "instance-set", + "public-instance-set", + "abstract-set", + "public-abstract-set", + "protected-set", + "protected-decorated-set", + "protected-static-set", + "protected-instance-set", + "protected-abstract-set", + "private-set", + "private-decorated-set", + "private-static-set", + "private-instance-set", + "#private-set", + "#private-static-set", + "#private-instance-set", + "static-initialization", + "static-static-initialization", + "public-static-static-initialization", + "instance-static-initialization", + "public-instance-static-initialization", + "abstract-static-initialization", + "public-abstract-static-initialization", + "protected-static-static-initialization", + "protected-instance-static-initialization", + "protected-abstract-static-initialization", + "private-static-static-initialization", + "private-instance-static-initialization", + "#private-static-static-initialization", + "#private-instance-static-initialization", + ], + "type": "string", + }, + "baseConfig": { + "oneOf": [ + { + "enum": [ + "never", + ], + "type": "string", + }, + { + "items": { + "oneOf": [ + { + "$ref": "#/items/0/$defs/allItems", + }, + { + "items": { + "$ref": "#/items/0/$defs/allItems", + }, + "type": "array", + }, + ], + }, + "type": "array", + }, + { + "additionalProperties": false, + "properties": { + "memberTypes": { + "oneOf": [ + { + "items": { + "oneOf": [ + { + "$ref": "#/items/0/$defs/allItems", + }, + { + "items": { + "$ref": "#/items/0/$defs/allItems", + }, + "type": "array", + }, + ], + }, + "type": "array", + }, + { + "enum": [ + "never", + ], + "type": "string", + }, + ], + }, + "optionalityOrder": { + "$ref": "#/items/0/$defs/optionalityOrderOptions", + }, + "order": { + "$ref": "#/items/0/$defs/orderOptions", + }, + }, + "type": "object", + }, + ], + }, + "optionalityOrderOptions": { + "enum": [ + "optional-first", + "required-first", + ], + "type": "string", + }, + "orderOptions": { + "enum": [ + "alphabetically", + "alphabetically-case-insensitive", + "as-written", + "natural", + "natural-case-insensitive", + ], + "type": "string", + }, + "typeItems": { + "enum": [ + "readonly-signature", + "signature", + "readonly-field", + "field", + "method", + "constructor", + ], + "type": "string", + }, + "typesConfig": { + "oneOf": [ + { + "enum": [ + "never", + ], + "type": "string", + }, + { + "items": { + "oneOf": [ + { + "$ref": "#/items/0/$defs/typeItems", + }, + { + "items": { + "$ref": "#/items/0/$defs/typeItems", + }, + "type": "array", + }, + ], + }, + "type": "array", + }, + { + "additionalProperties": false, + "properties": { + "memberTypes": { + "oneOf": [ + { + "items": { + "oneOf": [ + { + "$ref": "#/items/0/$defs/typeItems", + }, + { + "items": { + "$ref": "#/items/0/$defs/typeItems", + }, + "type": "array", + }, + ], + }, + "type": "array", + }, + { + "enum": [ + "never", + ], + "type": "string", + }, + ], + }, + "optionalityOrder": { + "$ref": "#/items/0/$defs/optionalityOrderOptions", + }, + "order": { + "$ref": "#/items/0/$defs/orderOptions", + }, + }, + "type": "object", + }, + ], + }, + }, + "additionalProperties": false, + "properties": { + "classExpressions": { + "$ref": "#/items/0/$defs/baseConfig", + }, + "classes": { + "$ref": "#/items/0/$defs/baseConfig", + }, + "default": { + "$ref": "#/items/0/$defs/baseConfig", + }, + "interfaces": { + "$ref": "#/items/0/$defs/typesConfig", + }, + "typeLiterals": { + "$ref": "#/items/0/$defs/typesConfig", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "method-signature-style": { + "create": [Function], + "defaultOptions": [ + "property", + ], + "meta": { + "docs": { + "description": "Enforce using a particular method signature syntax", + "url": "https://typescript-eslint.io/rules/method-signature-style", + }, + "fixable": "code", + "messages": { + "errorMethod": "Shorthand method signature is forbidden. Use a function property instead.", + "errorProperty": "Function property signature is forbidden. Use a method shorthand instead.", + }, + "schema": [ + { + "enum": [ + "property", + "method", + ], + "type": "string", + }, + ], + "type": "suggestion", + }, + }, + "naming-convention": { + "create": [Function], + "defaultOptions": [ + { + "format": [ + "camelCase", + ], + "leadingUnderscore": "allow", + "selector": "default", + "trailingUnderscore": "allow", + }, + { + "format": [ + "camelCase", + "PascalCase", + ], + "selector": "import", + }, + { + "format": [ + "camelCase", + "UPPER_CASE", + ], + "leadingUnderscore": "allow", + "selector": "variable", + "trailingUnderscore": "allow", + }, + { + "format": [ + "PascalCase", + ], + "selector": "typeLike", + }, + ], + "meta": { + "docs": { + "description": "Enforce naming conventions for everything across a codebase", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/naming-convention", + }, + "messages": { + "doesNotMatchFormat": "{{type}} name \`{{name}}\` must match one of the following formats: {{formats}}", + "doesNotMatchFormatTrimmed": "{{type}} name \`{{name}}\` trimmed as \`{{processedName}}\` must match one of the following formats: {{formats}}", + "missingAffix": "{{type}} name \`{{name}}\` must have one of the following {{position}}es: {{affixes}}", + "missingUnderscore": "{{type}} name \`{{name}}\` must have {{count}} {{position}} underscore(s).", + "satisfyCustom": "{{type}} name \`{{name}}\` must {{regexMatch}} the RegExp: {{regex}}", + "unexpectedUnderscore": "{{type}} name \`{{name}}\` must not have a {{position}} underscore.", + }, + "schema": { + "$defs": { + "formatOptionsConfig": { + "oneOf": [ + { + "additionalItems": false, + "items": { + "$ref": "#/$defs/predefinedFormats", + }, + "type": "array", + }, + { + "type": "null", + }, + ], + }, + "matchRegexConfig": { + "additionalProperties": false, + "properties": { + "match": { + "type": "boolean", + }, + "regex": { + "type": "string", + }, + }, + "required": [ + "match", + "regex", + ], + "type": "object", + }, + "predefinedFormats": { + "enum": [ + "camelCase", + "strictCamelCase", + "PascalCase", + "StrictPascalCase", + "snake_case", + "UPPER_CASE", + ], + "type": "string", + }, + "prefixSuffixConfig": { + "additionalItems": false, + "items": { + "minLength": 1, + "type": "string", + }, + "type": "array", + }, + "typeModifiers": { + "enum": [ + "boolean", + "string", + "number", + "function", + "array", + ], + "type": "string", + }, + "underscoreOptions": { + "enum": [ + "forbid", + "allow", + "require", + "requireDouble", + "allowDouble", + "allowSingleOrDouble", + ], + "type": "string", + }, + }, + "additionalItems": false, + "items": { + "oneOf": [ + { + "additionalProperties": false, + "description": "Multiple selectors in one config", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "const", + "readonly", + "static", + "public", + "protected", + "private", + "#private", + "abstract", + "destructured", + "global", + "exported", + "unused", + "requiresQuotes", + "override", + "async", + "default", + "namespace", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "additionalItems": false, + "items": { + "enum": [ + "default", + "variableLike", + "memberLike", + "typeLike", + "method", + "property", + "accessor", + "variable", + "function", + "parameter", + "parameterProperty", + "classicAccessor", + "enumMember", + "classMethod", + "objectLiteralMethod", + "typeMethod", + "classProperty", + "objectLiteralProperty", + "typeProperty", + "autoAccessor", + "class", + "interface", + "typeAlias", + "enum", + "typeParameter", + "import", + ], + "type": "string", + }, + "type": "array", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'default'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "const", + "readonly", + "static", + "public", + "protected", + "private", + "#private", + "abstract", + "destructured", + "global", + "exported", + "unused", + "requiresQuotes", + "override", + "async", + "default", + "namespace", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "default", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'variableLike'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "unused", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "variableLike", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'variable'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "const", + "destructured", + "exported", + "global", + "unused", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "variable", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'function'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "exported", + "global", + "unused", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "function", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'parameter'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "destructured", + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "parameter", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'memberLike'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "#private", + "protected", + "public", + "readonly", + "requiresQuotes", + "static", + "override", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "memberLike", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'classProperty'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "#private", + "protected", + "public", + "readonly", + "requiresQuotes", + "static", + "override", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "classProperty", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'objectLiteralProperty'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "public", + "requiresQuotes", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "objectLiteralProperty", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'typeProperty'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "public", + "readonly", + "requiresQuotes", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "typeProperty", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'parameterProperty'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "private", + "protected", + "public", + "readonly", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "parameterProperty", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'property'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "#private", + "protected", + "public", + "readonly", + "requiresQuotes", + "static", + "override", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "property", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'classMethod'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "#private", + "protected", + "public", + "requiresQuotes", + "static", + "override", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "classMethod", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'objectLiteralMethod'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "public", + "requiresQuotes", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "objectLiteralMethod", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'typeMethod'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "public", + "requiresQuotes", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "typeMethod", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'method'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "#private", + "protected", + "public", + "requiresQuotes", + "static", + "override", + "async", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "method", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'classicAccessor'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "protected", + "public", + "requiresQuotes", + "static", + "override", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "classicAccessor", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'autoAccessor'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "protected", + "public", + "requiresQuotes", + "static", + "override", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "autoAccessor", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'accessor'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "private", + "protected", + "public", + "requiresQuotes", + "static", + "override", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "accessor", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "types": { + "additionalItems": false, + "items": { + "$ref": "#/$defs/typeModifiers", + }, + "type": "array", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'enumMember'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "requiresQuotes", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "enumMember", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'typeLike'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "exported", + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "typeLike", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'class'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "abstract", + "exported", + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "class", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'interface'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "exported", + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "interface", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'typeAlias'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "exported", + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "typeAlias", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'enum'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "exported", + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "enum", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'typeParameter'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "unused", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "typeParameter", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + { + "additionalProperties": false, + "description": "Selector 'import'", + "properties": { + "custom": { + "$ref": "#/$defs/matchRegexConfig", + }, + "failureMessage": { + "type": "string", + }, + "filter": { + "oneOf": [ + { + "minLength": 1, + "type": "string", + }, + { + "$ref": "#/$defs/matchRegexConfig", + }, + ], + }, + "format": { + "$ref": "#/$defs/formatOptionsConfig", + }, + "leadingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + "modifiers": { + "additionalItems": false, + "items": { + "enum": [ + "default", + "namespace", + ], + "type": "string", + }, + "type": "array", + }, + "prefix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "selector": { + "enum": [ + "import", + ], + "type": "string", + }, + "suffix": { + "$ref": "#/$defs/prefixSuffixConfig", + }, + "trailingUnderscore": { + "$ref": "#/$defs/underscoreOptions", + }, + }, + "required": [ + "selector", + "format", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + "type": "suggestion", + }, + }, + "no-array-constructor": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow generic \`Array\` constructors", + "extendsBaseRule": true, + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-array-constructor", + }, + "fixable": "code", + "messages": { + "useLiteral": "The array literal notation [] is preferable.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-array-delete": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow using the \`delete\` operator on array values", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-array-delete", + }, + "hasSuggestions": true, + "messages": { + "noArrayDelete": "Using the \`delete\` operator with an array expression is unsafe.", + "useSplice": "Use \`array.splice()\` instead.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-base-to-string": { + "create": [Function], + "defaultOptions": [ + { + "ignoredTypeNames": [ + "Error", + "RegExp", + "URL", + "URLSearchParams", + ], + }, + ], + "meta": { + "docs": { + "description": "Require \`.toString()\` and \`.toLocaleString()\` to only be called on objects which provide useful information when stringified", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-base-to-string", + }, + "messages": { + "baseArrayJoin": "Using \`join()\` for {{name}} {{certainty}} use Object's default stringification format ('[object Object]') when stringified.", + "baseToString": "'{{name}}' {{certainty}} use Object's default stringification format ('[object Object]') when stringified.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoredTypeNames": { + "description": "Stringified regular expressions of type names to ignore.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-confusing-non-null-assertion": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow non-null assertion in locations that may be confusing", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/no-confusing-non-null-assertion", + }, + "hasSuggestions": true, + "messages": { + "confusingAssign": "Confusing combination of non-null assertion and assignment like \`a! = b\`, which looks very similar to \`a != b\`.", + "confusingEqual": "Confusing combination of non-null assertion and equality test like \`a! == b\`, which looks very similar to \`a !== b\`.", + "confusingOperator": "Confusing combination of non-null assertion and \`{{operator}}\` operator like \`a! {{operator}} b\`, which might be misinterpreted as \`!(a {{operator}} b)\`.", + "notNeedInAssign": "Remove unnecessary non-null assertion (!) in assignment left-hand side.", + "notNeedInEqualTest": "Remove unnecessary non-null assertion (!) in equality test.", + "notNeedInOperator": "Remove possibly unnecessary non-null assertion (!) in the left operand of the \`{{operator}}\` operator.", + "wrapUpLeft": "Wrap the left-hand side in parentheses to avoid confusion with "{{operator}}" operator.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-confusing-void-expression": { + "create": [Function], + "defaultOptions": [ + { + "ignoreArrowShorthand": false, + "ignoreVoidOperator": false, + "ignoreVoidReturningFunctions": false, + }, + ], + "meta": { + "docs": { + "description": "Require expressions of type void to appear in statement position", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-confusing-void-expression", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "invalidVoidExpr": "Placing a void expression inside another expression is forbidden. Move it to its own statement instead.", + "invalidVoidExprArrow": "Returning a void expression from an arrow function shorthand is forbidden. Please add braces to the arrow function.", + "invalidVoidExprArrowWrapVoid": "Void expressions returned from an arrow function shorthand must be marked explicitly with the \`void\` operator.", + "invalidVoidExprReturn": "Returning a void expression from a function is forbidden. Please move it before the \`return\` statement.", + "invalidVoidExprReturnLast": "Returning a void expression from a function is forbidden. Please remove the \`return\` statement.", + "invalidVoidExprReturnWrapVoid": "Void expressions returned from a function must be marked explicitly with the \`void\` operator.", + "invalidVoidExprWrapVoid": "Void expressions used inside another expression must be moved to its own statement or marked explicitly with the \`void\` operator.", + "voidExprWrapVoid": "Mark with an explicit \`void\` operator.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreArrowShorthand": { + "description": "Whether to ignore "shorthand" \`() =>\` arrow functions: those without \`{ ... }\` braces.", + "type": "boolean", + }, + "ignoreVoidOperator": { + "description": "Whether to ignore returns that start with the \`void\` operator.", + "type": "boolean", + }, + "ignoreVoidReturningFunctions": { + "description": "Whether to ignore returns from functions with explicit \`void\` return types and functions with contextual \`void\` return types.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-deprecated": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + }, + ], + "meta": { + "docs": { + "description": "Disallow using code marked as \`@deprecated\`", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-deprecated", + }, + "messages": { + "deprecated": "\`{{name}}\` is deprecated.", + "deprecatedWithReason": "\`{{name}}\` is deprecated. {{reason}}", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Type specifiers that can be allowed.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-dupe-class-members": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow duplicate class members", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-dupe-class-members", + }, + "hasSuggestions": undefined, + "messages": { + "unexpected": "Duplicate name '{{name}}'.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-duplicate-enum-values": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow duplicate enum member values", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-duplicate-enum-values", + }, + "hasSuggestions": false, + "messages": { + "duplicateValue": "Duplicate enum member value {{value}}.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-duplicate-type-constituents": { + "create": [Function], + "defaultOptions": [ + { + "ignoreIntersections": false, + "ignoreUnions": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow duplicate constituents of union or intersection types", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-duplicate-type-constituents", + }, + "fixable": "code", + "messages": { + "duplicate": "{{type}} type constituent is duplicated with {{previous}}.", + "unnecessary": "Explicit undefined is unnecessary on an optional parameter.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreIntersections": { + "description": "Whether to ignore \`&\` intersections.", + "type": "boolean", + }, + "ignoreUnions": { + "description": "Whether to ignore \`|\` unions.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-dynamic-delete": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow using the \`delete\` operator on computed key expressions", + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/no-dynamic-delete", + }, + "fixable": "code", + "messages": { + "dynamicDelete": "Do not delete dynamically computed property keys.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-empty-function": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + }, + ], + "meta": { + "defaultOptions": [ + { + "allow": [], + }, + ], + "docs": { + "description": "Disallow empty functions", + "extendsBaseRule": true, + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/no-empty-function", + }, + "hasSuggestions": undefined, + "messages": { + "unexpected": "Unexpected empty {{name}}.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Locations and kinds of functions that are allowed to be empty.", + "items": { + "enum": [ + "functions", + "arrowFunctions", + "generatorFunctions", + "methods", + "generatorMethods", + "getters", + "setters", + "constructors", + "private-constructors", + "protected-constructors", + "asyncFunctions", + "asyncMethods", + "decoratedFunctions", + "overrideMethods", + ], + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-empty-interface": { + "create": [Function], + "defaultOptions": [ + { + "allowSingleExtends": false, + }, + ], + "meta": { + "deprecated": { + "deprecatedSince": "8.0.0", + "replacedBy": [ + { + "rule": { + "name": "@typescript-eslint/no-empty-object-type", + "url": "https://typescript-eslint.io/rules/no-empty-object-type", + }, + }, + ], + "url": "https://github.com/typescript-eslint/typescript-eslint/pull/8977", + }, + "docs": { + "description": "Disallow the declaration of empty interfaces", + "url": "https://typescript-eslint.io/rules/no-empty-interface", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "noEmpty": "An empty interface is equivalent to \`{}\`.", + "noEmptyWithSuper": "An interface declaring no members is equivalent to its supertype.", + }, + "replacedBy": [ + "@typescript-eslint/no-empty-object-type", + ], + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowSingleExtends": { + "description": "Whether to allow empty interfaces that extend a single other interface.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-empty-object-type": { + "create": [Function], + "defaultOptions": [ + { + "allowInterfaces": "never", + "allowObjectTypes": "never", + }, + ], + "meta": { + "docs": { + "description": "Disallow accidentally using the "empty object" type", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-empty-object-type", + }, + "hasSuggestions": true, + "messages": { + "noEmptyInterface": "An empty interface declaration allows any non-nullish value, including literals like \`0\` and \`""\`. +- If that's what you want, disable this lint rule with an inline comment or configure the '{{ option }}' rule option. +- If you want a type meaning "any object", you probably want \`object\` instead. +- If you want a type meaning "any value", you probably want \`unknown\` instead.", + "noEmptyInterfaceWithSuper": "An interface declaring no members is equivalent to its supertype.", + "noEmptyObject": "The \`{}\` ("empty object") type allows any non-nullish value, including literals like \`0\` and \`""\`. +- If that's what you want, disable this lint rule with an inline comment or configure the '{{ option }}' rule option. +- If you want a type meaning "any object", you probably want \`object\` instead. +- If you want a type meaning "any value", you probably want \`unknown\` instead.", + "replaceEmptyInterface": "Replace empty interface with \`{{replacement}}\`.", + "replaceEmptyInterfaceWithSuper": "Replace empty interface with a type alias.", + "replaceEmptyObjectType": "Replace \`{}\` with \`{{replacement}}\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowInterfaces": { + "description": "Whether to allow empty interfaces.", + "enum": [ + "always", + "never", + "with-single-extends", + ], + "type": "string", + }, + "allowObjectTypes": { + "description": "Whether to allow empty object type literals.", + "enum": [ + "always", + "never", + ], + "type": "string", + }, + "allowWithName": { + "description": "A stringified regular expression to allow interfaces and object type aliases with the configured name.", + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-explicit-any": { + "create": [Function], + "defaultOptions": [ + { + "fixToUnknown": false, + "ignoreRestArgs": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow the \`any\` type", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-explicit-any", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "suggestNever": "Use \`never\` instead, this is useful when instantiating generic type parameters that you don't need to know the type of.", + "suggestUnknown": "Use \`unknown\` instead, this will force you to explicitly, and safely assert the type is correct.", + "unexpectedAny": "Unexpected any. Specify a different type.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "fixToUnknown": { + "description": "Whether to enable auto-fixing in which the \`any\` type is converted to the \`unknown\` type.", + "type": "boolean", + }, + "ignoreRestArgs": { + "description": "Whether to ignore rest parameter arrays.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-extra-non-null-assertion": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow extra non-null assertions", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-extra-non-null-assertion", + }, + "fixable": "code", + "messages": { + "noExtraNonNullAssertion": "Forbidden extra non-null assertion.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-extraneous-class": { + "create": [Function], + "defaultOptions": [ + { + "allowConstructorOnly": false, + "allowEmpty": false, + "allowStaticOnly": false, + "allowWithDecorator": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow classes used as namespaces", + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/no-extraneous-class", + }, + "messages": { + "empty": "Unexpected empty class.", + "onlyConstructor": "Unexpected class with only a constructor.", + "onlyStatic": "Unexpected class with only static properties.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowConstructorOnly": { + "description": "Whether to allow extraneous classes that contain only a constructor.", + "type": "boolean", + }, + "allowEmpty": { + "description": "Whether to allow extraneous classes that have no body (i.e. are empty).", + "type": "boolean", + }, + "allowStaticOnly": { + "description": "Whether to allow extraneous classes that only contain static members.", + "type": "boolean", + }, + "allowWithDecorator": { + "description": "Whether to allow extraneous classes that include a decorator.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-floating-promises": { + "create": [Function], + "defaultOptions": [ + { + "allowForKnownSafeCalls": [], + "allowForKnownSafePromises": [], + "checkThenables": false, + "ignoreIIFE": false, + "ignoreVoid": true, + }, + ], + "meta": { + "docs": { + "description": "Require Promise-like statements to be handled appropriately", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-floating-promises", + }, + "hasSuggestions": true, + "messages": { + "floating": "Promises must be awaited, end with a call to .catch, or end with a call to .then with a rejection handler.", + "floatingFixAwait": "Add await operator.", + "floatingFixVoid": "Add void operator to ignore.", + "floatingPromiseArray": "An array of Promises may be unintentional. Consider handling the promises' fulfillment or rejection with Promise.all or similar.", + "floatingPromiseArrayVoid": "An array of Promises may be unintentional. Consider handling the promises' fulfillment or rejection with Promise.all or similar, or explicitly marking the expression as ignored with the \`void\` operator.", + "floatingUselessRejectionHandler": "Promises must be awaited, end with a call to .catch, or end with a call to .then with a rejection handler. A rejection handler that is not a function will be ignored.", + "floatingUselessRejectionHandlerVoid": "Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the \`void\` operator. A rejection handler that is not a function will be ignored.", + "floatingVoid": "Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the \`void\` operator.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowForKnownSafeCalls": { + "description": "Type specifiers of functions whose calls are safe to float.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + "allowForKnownSafePromises": { + "description": "Type specifiers that are known to be safe to float.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + "checkThenables": { + "description": "Whether to check all "Thenable"s, not just the built-in Promise type.", + "type": "boolean", + }, + "ignoreIIFE": { + "description": "Whether to ignore async IIFEs (Immediately Invoked Function Expressions).", + "type": "boolean", + }, + "ignoreVoid": { + "description": "Whether to ignore \`void\` expressions.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-for-in-array": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow iterating over an array with a for-in loop", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-for-in-array", + }, + "messages": { + "forInViolation": "For-in loops over arrays skips holes, returns indices as strings, and may visit the prototype chain or other enumerable properties. Use a more robust iteration method such as for-of or array.forEach instead.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-implied-eval": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow the use of \`eval()\`-like functions", + "extendsBaseRule": true, + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-implied-eval", + }, + "messages": { + "noFunctionConstructor": "Implied eval. Do not use the Function constructor to create functions.", + "noImpliedEvalError": "Implied eval. Consider passing a function.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-import-type-side-effects": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce the use of top-level import type qualifier when an import only has specifiers with inline type qualifiers", + "url": "https://typescript-eslint.io/rules/no-import-type-side-effects", + }, + "fixable": "code", + "messages": { + "useTopLevelQualifier": "TypeScript will only remove the inline type specifiers which will leave behind a side effect import at runtime. Convert this to a top-level type qualifier to properly remove the entire import.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-inferrable-types": { + "create": [Function], + "defaultOptions": [ + { + "ignoreParameters": false, + "ignoreProperties": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow explicit type declarations for variables or parameters initialized to a number, string, or boolean", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/no-inferrable-types", + }, + "fixable": "code", + "messages": { + "noInferrableType": "Type {{type}} trivially inferred from a {{type}} literal, remove type annotation.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreParameters": { + "description": "Whether to ignore function parameters.", + "type": "boolean", + }, + "ignoreProperties": { + "description": "Whether to ignore class properties.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-invalid-this": { + "create": [Function], + "defaultOptions": [ + { + "capIsConstructor": true, + }, + ], + "meta": { + "defaultOptions": [ + { + "capIsConstructor": true, + }, + ], + "docs": { + "description": "Disallow \`this\` keywords outside of classes or class-like objects", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-invalid-this", + }, + "hasSuggestions": undefined, + "messages": { + "unexpectedThis": "Unexpected 'this'.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "capIsConstructor": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-invalid-void-type": { + "create": [Function], + "defaultOptions": [ + { + "allowAsThisParameter": false, + "allowInGenericTypeArguments": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow \`void\` type outside of generic or return types", + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/no-invalid-void-type", + }, + "messages": { + "invalidVoidForGeneric": "{{ generic }} may not have void as a type argument.", + "invalidVoidNotReturn": "void is only valid as a return type.", + "invalidVoidNotReturnOrGeneric": "void is only valid as a return type or generic type argument.", + "invalidVoidNotReturnOrThisParam": "void is only valid as return type or type of \`this\` parameter.", + "invalidVoidNotReturnOrThisParamOrGeneric": "void is only valid as a return type or generic type argument or the type of a \`this\` parameter.", + "invalidVoidUnionConstituent": "void is not valid as a constituent in a union type", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowAsThisParameter": { + "description": "Whether a \`this\` parameter of a function may be \`void\`.", + "type": "boolean", + }, + "allowInGenericTypeArguments": { + "description": "Whether \`void\` can be used as a valid value for generic type parameters.", + "oneOf": [ + { + "description": "Whether \`void\` can be used as a valid value for all generic type parameters.", + "type": "boolean", + }, + { + "description": "Allowlist of types that may accept \`void\` as a generic type parameter.", + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + }, + ], + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-loop-func": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow function declarations that contain unsafe references inside loop statements", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-loop-func", + }, + "hasSuggestions": undefined, + "messages": { + "unsafeRefs": "Function declared in a loop contains unsafe references to variable(s) {{ varNames }}.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-loss-of-precision": { + "create": [Function], + "defaultOptions": [], + "meta": { + "deprecated": { + "deprecatedSince": "8.0.0", + "replacedBy": [ + { + "rule": { + "name": "no-loss-of-precision", + "url": "https://eslint.org/docs/latest/rules/no-loss-of-precision", + }, + }, + ], + "url": "https://github.com/typescript-eslint/typescript-eslint/pull/8832", + }, + "docs": { + "description": "Disallow literal numbers that lose precision", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-loss-of-precision", + }, + "hasSuggestions": undefined, + "messages": { + "noLossOfPrecision": "This number literal will lose precision at runtime.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-magic-numbers": { + "create": [Function], + "defaultOptions": [ + { + "detectObjects": false, + "enforceConst": false, + "ignore": [], + "ignoreArrayIndexes": false, + "ignoreEnums": false, + "ignoreNumericLiteralTypes": false, + "ignoreReadonlyClassProperties": false, + "ignoreTypeIndexes": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow magic numbers", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-magic-numbers", + }, + "messages": { + "noMagic": "No magic number: {{raw}}.", + "useConst": "Number constants declarations must use 'const'.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "detectObjects": { + "default": false, + "type": "boolean", + }, + "enforceConst": { + "default": false, + "type": "boolean", + }, + "ignore": { + "items": { + "anyOf": [ + { + "type": "number", + }, + { + "pattern": "^[+-]?(?:0|[1-9][0-9]*)n$", + "type": "string", + }, + ], + }, + "type": "array", + "uniqueItems": true, + }, + "ignoreArrayIndexes": { + "default": false, + "type": "boolean", + }, + "ignoreClassFieldInitialValues": { + "default": false, + "type": "boolean", + }, + "ignoreDefaultValues": { + "default": false, + "type": "boolean", + }, + "ignoreEnums": { + "description": "Whether enums used in TypeScript are considered okay.", + "type": "boolean", + }, + "ignoreNumericLiteralTypes": { + "description": "Whether numbers used in TypeScript numeric literal types are considered okay.", + "type": "boolean", + }, + "ignoreReadonlyClassProperties": { + "description": "Whether \`readonly\` class properties are considered okay.", + "type": "boolean", + }, + "ignoreTypeIndexes": { + "description": "Whether numbers used to index types are okay.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-meaningless-void-operator": { + "create": [Function], + "defaultOptions": [ + { + "checkNever": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow the \`void\` operator except when used to discard a value", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-meaningless-void-operator", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "meaninglessVoidOperator": "void operator shouldn't be used on {{type}}; it should convey that a return value is being ignored", + "removeVoid": "Remove 'void'", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "checkNever": { + "default": false, + "description": "Whether to suggest removing \`void\` when the argument has type \`never\`.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-misused-new": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce valid definition of \`new\` and \`constructor\`", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-misused-new", + }, + "messages": { + "errorMessageClass": "Class cannot have method named \`new\`.", + "errorMessageInterface": "Interfaces cannot be constructed, only classes.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-misused-promises": { + "create": [Function], + "defaultOptions": [ + { + "checksConditionals": true, + "checksSpreads": true, + "checksVoidReturn": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow Promises in places not designed to handle them", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-misused-promises", + }, + "messages": { + "conditional": "Expected non-Promise value in a boolean conditional.", + "predicate": "Expected a non-Promise value to be returned.", + "spread": "Expected a non-Promise value to be spreaded in an object.", + "voidReturnArgument": "Promise returned in function argument where a void return was expected.", + "voidReturnAttribute": "Promise-returning function provided to attribute where a void return was expected.", + "voidReturnInheritedMethod": "Promise-returning method provided where a void return was expected by extended/implemented type '{{ heritageTypeName }}'.", + "voidReturnProperty": "Promise-returning function provided to property where a void return was expected.", + "voidReturnReturnValue": "Promise-returning function provided to return value where a void return was expected.", + "voidReturnVariable": "Promise-returning function provided to variable where a void return was expected.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "checksConditionals": { + "description": "Whether to warn when a Promise is provided to conditional statements.", + "type": "boolean", + }, + "checksSpreads": { + "description": "Whether to warn when \`...\` spreading a \`Promise\`.", + "type": "boolean", + }, + "checksVoidReturn": { + "description": "Whether to warn when a Promise is returned from a function typed as returning \`void\`.", + "oneOf": [ + { + "description": "Whether to disable checking all asynchronous functions.", + "type": "boolean", + }, + { + "additionalProperties": false, + "description": "Which forms of functions may have checking disabled.", + "properties": { + "arguments": { + "description": "Disables checking an asynchronous function passed as argument where the parameter type expects a function that returns \`void\`.", + "type": "boolean", + }, + "attributes": { + "description": "Disables checking an asynchronous function passed as a JSX attribute expected to be a function that returns \`void\`.", + "type": "boolean", + }, + "inheritedMethods": { + "description": "Disables checking an asynchronous method in a type that extends or implements another type expecting that method to return \`void\`.", + "type": "boolean", + }, + "properties": { + "description": "Disables checking an asynchronous function passed as an object property expected to be a function that returns \`void\`.", + "type": "boolean", + }, + "returns": { + "description": "Disables checking an asynchronous function returned in a function whose return type is a function that returns \`void\`.", + "type": "boolean", + }, + "variables": { + "description": "Disables checking an asynchronous function used as a variable whose return type is a function that returns \`void\`.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-misused-spread": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + }, + ], + "meta": { + "docs": { + "description": "Disallow using the spread operator when it might cause unexpected behavior", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-misused-spread", + }, + "hasSuggestions": true, + "messages": { + "addAwait": "Add await operator.", + "noArraySpreadInObject": "Using the spread operator on an array in an object will result in a list of indices.", + "noClassDeclarationSpreadInObject": "Using the spread operator on class declarations will spread only their static properties, and will lose their class prototype.", + "noClassInstanceSpreadInObject": "Using the spread operator on class instances will lose their class prototype.", + "noFunctionSpreadInObject": "Using the spread operator on a function without additional properties can cause unexpected behavior. Did you forget to call the function?", + "noIterableSpreadInObject": "Using the spread operator on an Iterable in an object can cause unexpected behavior.", + "noMapSpreadInObject": "Using the spread operator on a Map in an object will result in an empty object. Did you mean to use \`Object.fromEntries(map)\` instead?", + "noPromiseSpreadInObject": "Using the spread operator on Promise in an object can cause unexpected behavior. Did you forget to await the promise?", + "noStringSpread": "Using the spread operator on a string can mishandle special characters, as can \`.split("")\`. +- \`...\` produces Unicode code points, which will decompose complex emojis into individual emojis +- .split("") produces UTF-16 code units, which breaks rich characters in many languages +Consider using \`Intl.Segmenter\` for locale-aware string decomposition. +Otherwise, if you don't need to preserve emojis or other non-Ascii characters, disable this lint rule on this line or configure the 'allow' rule option.", + "replaceMapSpreadInObject": "Replace map spread in object with \`Object.fromEntries()\`", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "An array of type specifiers that are known to be safe to spread.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-mixed-enums": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow enums from having both number and string members", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-mixed-enums", + }, + "messages": { + "mixed": "Mixing number and string enums can be confusing.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-namespace": { + "create": [Function], + "defaultOptions": [ + { + "allowDeclarations": false, + "allowDefinitionFiles": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow TypeScript namespaces", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-namespace", + }, + "messages": { + "moduleSyntaxIsPreferred": "ES2015 module syntax is preferred over namespaces.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowDeclarations": { + "description": "Whether to allow \`declare\` with custom TypeScript namespaces.", + "type": "boolean", + }, + "allowDefinitionFiles": { + "description": "Whether to allow \`declare\` with custom TypeScript namespaces inside definition files.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-non-null-asserted-nullish-coalescing": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow non-null assertions in the left operand of a nullish coalescing operator", + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/no-non-null-asserted-nullish-coalescing", + }, + "hasSuggestions": true, + "messages": { + "noNonNullAssertedNullishCoalescing": "The nullish coalescing operator is designed to handle undefined and null - using a non-null assertion is not needed.", + "suggestRemovingNonNull": "Remove the non-null assertion.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-non-null-asserted-optional-chain": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow non-null assertions after an optional chain expression", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-non-null-asserted-optional-chain", + }, + "hasSuggestions": true, + "messages": { + "noNonNullOptionalChain": "Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong.", + "suggestRemovingNonNull": "You should remove the non-null assertion.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-non-null-assertion": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow non-null assertions using the \`!\` postfix operator", + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/no-non-null-assertion", + }, + "hasSuggestions": true, + "messages": { + "noNonNull": "Forbidden non-null assertion.", + "suggestOptionalChain": "Consider using the optional chain operator \`?.\` instead. This operator includes runtime checks, so it is safer than the compile-only non-null assertion operator.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-redeclare": { + "create": [Function], + "defaultOptions": [ + { + "builtinGlobals": true, + "ignoreDeclarationMerge": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow variable redeclaration", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-redeclare", + }, + "messages": { + "redeclared": "'{{id}}' is already defined.", + "redeclaredAsBuiltin": "'{{id}}' is already defined as a built-in global variable.", + "redeclaredBySyntax": "'{{id}}' is already defined by a variable declaration.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "builtinGlobals": { + "description": "Whether to report shadowing of built-in global variables.", + "type": "boolean", + }, + "ignoreDeclarationMerge": { + "description": "Whether to ignore declaration merges between certain TypeScript declaration types.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-redundant-type-constituents": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow members of unions and intersections that do nothing or override type information", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-redundant-type-constituents", + }, + "messages": { + "errorTypeOverrides": "'{{typeName}}' is an 'error' type that acts as 'any' and overrides all other types in this {{container}} type.", + "literalOverridden": "{{literal}} is overridden by {{primitive}} in this union type.", + "overridden": "'{{typeName}}' is overridden by other types in this {{container}} type.", + "overrides": "'{{typeName}}' overrides all other types in this {{container}} type.", + "primitiveOverridden": "{{primitive}} is overridden by the {{literal}} in this intersection type.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-require-imports": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + "allowAsImport": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow invocation of \`require()\`", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-require-imports", + }, + "messages": { + "noRequireImports": "A \`require()\` style import is forbidden.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Patterns of import paths to allow requiring from.", + "items": { + "type": "string", + }, + "type": "array", + }, + "allowAsImport": { + "description": "Allows \`require\` statements in import declarations.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-restricted-imports": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow specified modules when loaded by \`import\`", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-restricted-imports", + }, + "fixable": undefined, + "messages": { + "allowedImportName": "'{{importName}}' import from '{{importSource}}' is restricted because only '{{allowedImportNames}}' import(s) is/are allowed.", + "allowedImportNamePattern": "'{{importName}}' import from '{{importSource}}' is restricted because only imports that match the pattern '{{allowedImportNamePattern}}' are allowed from '{{importSource}}'.", + "allowedImportNamePatternWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted because only imports that match the pattern '{{allowedImportNamePattern}}' are allowed from '{{importSource}}'. {{customMessage}}", + "allowedImportNameWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted because only '{{allowedImportNames}}' import(s) is/are allowed. {{customMessage}}", + "everything": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted.", + "everythingWithAllowImportNames": "* import is invalid because only '{{allowedImportNames}}' from '{{importSource}}' is/are allowed.", + "everythingWithAllowImportNamesAndCustomMessage": "* import is invalid because only '{{allowedImportNames}}' from '{{importSource}}' is/are allowed. {{customMessage}}", + "everythingWithAllowedImportNamePattern": "* import is invalid because only imports that match the pattern '{{allowedImportNamePattern}}' from '{{importSource}}' are allowed.", + "everythingWithAllowedImportNamePatternWithCustomMessage": "* import is invalid because only imports that match the pattern '{{allowedImportNamePattern}}' from '{{importSource}}' are allowed. {{customMessage}}", + "everythingWithCustomMessage": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted. {{customMessage}}", + "importName": "'{{importName}}' import from '{{importSource}}' is restricted.", + "importNameWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted. {{customMessage}}", + "path": "'{{importSource}}' import is restricted from being used.", + "pathWithCustomMessage": "'{{importSource}}' import is restricted from being used. {{customMessage}}", + "patternAndEverything": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted from being used by a pattern.", + "patternAndEverythingWithCustomMessage": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted from being used by a pattern. {{customMessage}}", + "patternAndEverythingWithRegexImportName": "* import is invalid because import name matching '{{importNames}}' pattern from '{{importSource}}' is restricted from being used.", + "patternAndEverythingWithRegexImportNameAndCustomMessage": "* import is invalid because import name matching '{{importNames}}' pattern from '{{importSource}}' is restricted from being used. {{customMessage}}", + "patternAndImportName": "'{{importName}}' import from '{{importSource}}' is restricted from being used by a pattern.", + "patternAndImportNameWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted from being used by a pattern. {{customMessage}}", + "patternWithCustomMessage": "'{{importSource}}' import is restricted from being used by a pattern. {{customMessage}}", + "patterns": "'{{importSource}}' import is restricted from being used by a pattern.", + }, + "schema": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "allowImportNames": { + "items": { + "type": "string", + }, + "type": "array", + }, + "allowTypeImports": { + "description": "Whether to allow type-only imports for a path.", + "type": "boolean", + }, + "importNames": { + "items": { + "type": "string", + }, + "type": "array", + }, + "message": { + "minLength": 1, + "type": "string", + }, + "name": { + "type": "string", + }, + }, + "required": [ + "name", + ], + "type": "object", + }, + ], + }, + "type": "array", + "uniqueItems": true, + }, + { + "additionalItems": false, + "items": [ + { + "additionalProperties": false, + "properties": { + "paths": { + "items": { + "anyOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "allowImportNames": { + "items": { + "type": "string", + }, + "type": "array", + }, + "allowTypeImports": { + "description": "Whether to allow type-only imports for a path.", + "type": "boolean", + }, + "importNames": { + "items": { + "type": "string", + }, + "type": "array", + }, + "message": { + "minLength": 1, + "type": "string", + }, + "name": { + "type": "string", + }, + }, + "required": [ + "name", + ], + "type": "object", + }, + ], + }, + "type": "array", + "uniqueItems": true, + }, + "patterns": { + "anyOf": [ + { + "items": { + "type": "string", + }, + "type": "array", + "uniqueItems": true, + }, + { + "items": { + "additionalProperties": false, + "properties": { + "allowImportNamePattern": { + "type": "string", + }, + "allowImportNames": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "allowTypeImports": { + "description": "Whether to allow type-only imports for a path.", + "type": "boolean", + }, + "caseSensitive": { + "type": "boolean", + }, + "group": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "importNamePattern": { + "type": "string", + }, + "importNames": { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + "message": { + "minLength": 1, + "type": "string", + }, + "regex": { + "type": "string", + }, + }, + "required": undefined, + "type": "object", + }, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "type": "object", + }, + ], + "type": "array", + }, + ], + }, + "type": "suggestion", + }, + }, + "no-restricted-types": { + "create": [Function], + "defaultOptions": [ + {}, + ], + "meta": { + "docs": { + "description": "Disallow certain types", + "url": "https://typescript-eslint.io/rules/no-restricted-types", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "bannedTypeMessage": "Don't use \`{{name}}\` as a type.{{customMessage}}", + "bannedTypeReplacement": "Replace \`{{name}}\` with \`{{replacement}}\`.", + }, + "schema": [ + { + "$defs": { + "banConfig": { + "oneOf": [ + { + "description": "Bans the type with the default message.", + "enum": [ + true, + ], + "type": "boolean", + }, + { + "description": "Bans the type with a custom message.", + "type": "string", + }, + { + "additionalProperties": false, + "description": "Bans a type.", + "properties": { + "fixWith": { + "description": "Type to autofix replace with. Note that autofixers can be applied automatically - so you need to be careful with this option.", + "type": "string", + }, + "message": { + "description": "Custom error message.", + "type": "string", + }, + "suggest": { + "description": "Types to suggest replacing with.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + }, + }, + "additionalProperties": false, + "properties": { + "types": { + "additionalProperties": { + "$ref": "#/items/0/$defs/banConfig", + }, + "description": "An object whose keys are the types you want to ban, and the values are error messages.", + "type": "object", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-shadow": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + "builtinGlobals": false, + "hoist": "functions-and-types", + "ignoreFunctionTypeParameterNameValueShadow": true, + "ignoreOnInitialization": false, + "ignoreTypeValueShadow": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow variable declarations from shadowing variables declared in the outer scope", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-shadow", + }, + "messages": { + "noShadow": "'{{name}}' is already declared in the upper scope on line {{shadowedLine}} column {{shadowedColumn}}.", + "noShadowGlobal": "'{{name}}' is already a global variable.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Identifier names for which shadowing is allowed.", + "items": { + "type": "string", + }, + "type": "array", + }, + "builtinGlobals": { + "description": "Whether to report shadowing of built-in global variables.", + "type": "boolean", + }, + "hoist": { + "description": "Whether to report shadowing before outer functions or variables are defined.", + "enum": [ + "all", + "functions", + "functions-and-types", + "never", + "types", + ], + "type": "string", + }, + "ignoreFunctionTypeParameterNameValueShadow": { + "description": "Whether to ignore function parameters named the same as a variable.", + "type": "boolean", + }, + "ignoreOnInitialization": { + "description": "Whether to ignore the variable initializers when the shadowed variable is presumably still unitialized.", + "type": "boolean", + }, + "ignoreTypeValueShadow": { + "description": "Whether to ignore types named the same as a variable.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-this-alias": { + "create": [Function], + "defaultOptions": [ + { + "allowDestructuring": true, + "allowedNames": [], + }, + ], + "meta": { + "docs": { + "description": "Disallow aliasing \`this\`", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-this-alias", + }, + "messages": { + "thisAssignment": "Unexpected aliasing of 'this' to local variable.", + "thisDestructure": "Unexpected aliasing of members of 'this' to local variables.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowDestructuring": { + "description": "Whether to ignore destructurings, such as \`const { props, state } = this\`.", + "type": "boolean", + }, + "allowedNames": { + "description": "Names to ignore, such as ["self"] for \`const self = this;\`.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-type-alias": { + "create": [Function], + "defaultOptions": [ + { + "allowAliases": "never", + "allowCallbacks": "never", + "allowConditionalTypes": "never", + "allowConstructors": "never", + "allowGenerics": "never", + "allowLiterals": "never", + "allowMappedTypes": "never", + "allowTupleTypes": "never", + }, + ], + "meta": { + "deprecated": { + "deprecatedSince": "6.0.0", + "replacedBy": [ + { + "rule": { + "name": "@typescript-eslint/consistent-type-definitions", + "url": "https://typescript-eslint.io/rules/consistent-type-definitions", + }, + }, + ], + "url": "https://github.com/typescript-eslint/typescript-eslint/pull/6229", + }, + "docs": { + "description": "Disallow type aliases", + "url": "https://typescript-eslint.io/rules/no-type-alias", + }, + "messages": { + "noCompositionAlias": "{{typeName}} in {{compositionType}} types are not allowed.", + "noTypeAlias": "Type {{alias}} are not allowed.", + }, + "schema": [ + { + "$defs": { + "expandedOptions": { + "enum": [ + "always", + "never", + "in-unions", + "in-intersections", + "in-unions-and-intersections", + ], + "type": "string", + }, + "simpleOptions": { + "enum": [ + "always", + "never", + ], + "type": "string", + }, + }, + "additionalProperties": false, + "properties": { + "allowAliases": { + "$ref": "#/items/0/$defs/expandedOptions", + "description": "Whether to allow direct one-to-one type aliases.", + }, + "allowCallbacks": { + "$ref": "#/items/0/$defs/simpleOptions", + "description": "Whether to allow type aliases for callbacks.", + }, + "allowConditionalTypes": { + "$ref": "#/items/0/$defs/simpleOptions", + "description": "Whether to allow type aliases for conditional types.", + }, + "allowConstructors": { + "$ref": "#/items/0/$defs/simpleOptions", + "description": "Whether to allow type aliases with constructors.", + }, + "allowGenerics": { + "$ref": "#/items/0/$defs/simpleOptions", + "description": "Whether to allow type aliases with generic types.", + }, + "allowLiterals": { + "$ref": "#/items/0/$defs/expandedOptions", + "description": "Whether to allow type aliases with object literal types.", + }, + "allowMappedTypes": { + "$ref": "#/items/0/$defs/expandedOptions", + "description": "Whether to allow type aliases with mapped types.", + }, + "allowTupleTypes": { + "$ref": "#/items/0/$defs/expandedOptions", + "description": "Whether to allow type aliases with tuple types.", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-unnecessary-boolean-literal-compare": { + "create": [Function], + "defaultOptions": [ + { + "allowComparingNullableBooleansToFalse": true, + "allowComparingNullableBooleansToTrue": true, + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow unnecessary equality comparisons against boolean literals", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-boolean-literal-compare", + }, + "fixable": "code", + "messages": { + "comparingNullableToFalse": "This expression unnecessarily compares a nullable boolean value to false instead of using the ?? operator to provide a default.", + "comparingNullableToTrueDirect": "This expression unnecessarily compares a nullable boolean value to true instead of using it directly.", + "comparingNullableToTrueNegated": "This expression unnecessarily compares a nullable boolean value to true instead of negating it.", + "direct": "This expression unnecessarily compares a boolean value to a boolean instead of using it directly.", + "negated": "This expression unnecessarily compares a boolean value to a boolean instead of negating it.", + "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowComparingNullableBooleansToFalse": { + "description": "Whether to allow comparisons between nullable boolean variables and \`false\`.", + "type": "boolean", + }, + "allowComparingNullableBooleansToTrue": { + "description": "Whether to allow comparisons between nullable boolean variables and \`true\`.", + "type": "boolean", + }, + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { + "description": "Unless this is set to \`true\`, the rule will error on every file whose \`tsconfig.json\` does _not_ have the \`strictNullChecks\` compiler option (or \`strict\`) set to \`true\`.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-unnecessary-condition": { + "create": [Function], + "defaultOptions": [ + { + "allowConstantLoopConditions": "never", + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, + "checkTypePredicates": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow conditionals where the type is always truthy or always falsy", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-condition", + }, + "fixable": "code", + "messages": { + "alwaysFalsy": "Unnecessary conditional, value is always falsy.", + "alwaysFalsyFunc": "This callback should return a conditional, but return is always falsy.", + "alwaysNullish": "Unnecessary conditional, left-hand side of \`??\` operator is always \`null\` or \`undefined\`.", + "alwaysTruthy": "Unnecessary conditional, value is always truthy.", + "alwaysTruthyFunc": "This callback should return a conditional, but return is always truthy.", + "comparisonBetweenLiteralTypes": "Unnecessary conditional, comparison is always {{trueOrFalse}}, since \`{{left}} {{operator}} {{right}}\` is {{trueOrFalse}}.", + "never": "Unnecessary conditional, value is \`never\`.", + "neverNullish": "Unnecessary conditional, expected left-hand side of \`??\` operator to be possibly null or undefined.", + "neverOptionalChain": "Unnecessary optional chain on a non-nullish value.", + "noOverlapBooleanExpression": "Unnecessary conditional, the types have no overlap.", + "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", + "typeGuardAlreadyIsType": "Unnecessary conditional, expression already has the type being checked by the {{typeGuardOrAssertionFunction}}.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowConstantLoopConditions": { + "description": "Whether to ignore constant loop conditions, such as \`while (true)\`.", + "oneOf": [ + { + "type": "boolean", + }, + { + "enum": [ + "always", + "never", + "only-allowed-literals", + ], + "type": "string", + }, + ], + }, + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { + "description": "Whether to not error when running with a tsconfig that has strictNullChecks turned.", + "type": "boolean", + }, + "checkTypePredicates": { + "description": "Whether to check the asserted argument of a type predicate function for unnecessary conditions", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-unnecessary-parameter-property-assignment": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow unnecessary assignment of constructor property parameter", + "url": "https://typescript-eslint.io/rules/no-unnecessary-parameter-property-assignment", + }, + "messages": { + "unnecessaryAssign": "This assignment is unnecessary since it is already assigned by a parameter property.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-unnecessary-qualifier": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow unnecessary namespace qualifiers", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-qualifier", + }, + "fixable": "code", + "messages": { + "unnecessaryQualifier": "Qualifier is unnecessary since '{{ name }}' is in scope.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-unnecessary-template-expression": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow unnecessary template expressions", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-template-expression", + }, + "fixable": "code", + "messages": { + "noUnnecessaryTemplateExpression": "Template literal expression is unnecessary and can be simplified.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-unnecessary-type-arguments": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow type arguments that are equal to the default", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-type-arguments", + }, + "fixable": "code", + "messages": { + "unnecessaryTypeParameter": "This is the default value for this type parameter, so it can be omitted.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-unnecessary-type-assertion": { + "create": [Function], + "defaultOptions": [ + {}, + ], + "meta": { + "docs": { + "description": "Disallow type assertions that do not change the type of an expression", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-type-assertion", + }, + "fixable": "code", + "messages": { + "contextuallyUnnecessary": "This assertion is unnecessary since the receiver accepts the original type of the expression.", + "unnecessaryAssertion": "This assertion is unnecessary since it does not change the type of the expression.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "typesToIgnore": { + "description": "A list of type names to ignore.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-unnecessary-type-constraint": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow unnecessary constraints on generic types", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-unnecessary-type-constraint", + }, + "hasSuggestions": true, + "messages": { + "removeUnnecessaryConstraint": "Remove the unnecessary \`{{constraint}}\` constraint.", + "unnecessaryConstraint": "Constraining the generic type \`{{name}}\` to \`{{constraint}}\` does nothing and is unnecessary.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-unnecessary-type-parameters": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow type parameters that aren't used multiple times", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unnecessary-type-parameters", + }, + "hasSuggestions": true, + "messages": { + "replaceUsagesWithConstraint": "Replace all usages of type parameter with its constraint.", + "sole": "Type parameter {{name}} is {{uses}} in the {{descriptor}} signature.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-argument": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow calling a function with a value with type \`any\`", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-argument", + }, + "messages": { + "unsafeArgument": "Unsafe argument of type {{sender}} assigned to a parameter of type {{receiver}}.", + "unsafeArraySpread": "Unsafe spread of an {{sender}} array type.", + "unsafeSpread": "Unsafe spread of an {{sender}} type.", + "unsafeTupleSpread": "Unsafe spread of a tuple type. The argument is {{sender}} and is assigned to a parameter of type {{receiver}}.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-assignment": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow assigning a value with type \`any\` to variables and properties", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-assignment", + }, + "messages": { + "anyAssignment": "Unsafe assignment of an {{sender}} value.", + "anyAssignmentThis": "Unsafe assignment of an {{sender}} value. \`this\` is typed as \`any\`. +You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", + "unsafeArrayPattern": "Unsafe array destructuring of an {{sender}} array value.", + "unsafeArrayPatternFromTuple": "Unsafe array destructuring of a tuple element with an {{sender}} value.", + "unsafeArraySpread": "Unsafe spread of an {{sender}} value in an array.", + "unsafeAssignment": "Unsafe assignment of type {{sender}} to a variable of type {{receiver}}.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-call": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow calling a value with type \`any\`", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-call", + }, + "messages": { + "unsafeCall": "Unsafe call of a(n) {{type}} typed value.", + "unsafeCallThis": "Unsafe call of a(n) {{type}} typed value. \`this\` is typed as {{type}}. +You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", + "unsafeNew": "Unsafe construction of a(n) {{type}} typed value.", + "unsafeTemplateTag": "Unsafe use of a(n) {{type}} typed template tag.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-declaration-merging": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow unsafe declaration merging", + "recommended": "recommended", + "requiresTypeChecking": false, + "url": "https://typescript-eslint.io/rules/no-unsafe-declaration-merging", + }, + "messages": { + "unsafeMerging": "Unsafe declaration merging between classes and interfaces.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-enum-comparison": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow comparing an enum value with a non-enum value", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-enum-comparison", + }, + "hasSuggestions": true, + "messages": { + "mismatchedCase": "The case statement does not have a shared enum type with the switch predicate.", + "mismatchedCondition": "The two values in this comparison do not have a shared enum type.", + "replaceValueWithEnum": "Replace with an enum value comparison.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-unsafe-function-type": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow using the unsafe built-in Function type", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-unsafe-function-type", + }, + "fixable": "code", + "messages": { + "bannedFunctionType": "The \`Function\` type accepts any function-like value. +Prefer explicitly defining any function parameters and return type.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-member-access": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow member access on a value with type \`any\`", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-member-access", + }, + "messages": { + "unsafeComputedMemberAccess": "Computed name {{property}} resolves to an {{type}} value.", + "unsafeMemberExpression": "Unsafe member access {{property}} on an {{type}} value.", + "unsafeThisMemberExpression": "Unsafe member access {{property}} on an \`any\` value. \`this\` is typed as \`any\`. +You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-return": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow returning a value with type \`any\` from a function", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-return", + }, + "messages": { + "unsafeReturn": "Unsafe return of a value of type {{type}}.", + "unsafeReturnAssignment": "Unsafe return of type \`{{sender}}\` from function with return type \`{{receiver}}\`.", + "unsafeReturnThis": "Unsafe return of a value of type \`{{type}}\`. \`this\` is typed as \`any\`. +You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-type-assertion": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow type assertions that narrow a type", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-type-assertion", + }, + "messages": { + "unsafeOfAnyTypeAssertion": "Unsafe assertion from {{type}} detected: consider using type guards or a safer assertion.", + "unsafeToAnyTypeAssertion": "Unsafe assertion to {{type}} detected: consider using a more specific type to ensure safety.", + "unsafeToUnconstrainedTypeAssertion": "Unsafe type assertion: '{{type}}' could be instantiated with an arbitrary type which could be unrelated to the original type.", + "unsafeTypeAssertion": "Unsafe type assertion: type '{{type}}' is more narrow than the original type.", + "unsafeTypeAssertionAssignableToConstraint": "Unsafe type assertion: the original type is assignable to the constraint of type '{{type}}', but '{{type}}' could be instantiated with a different subtype of its constraint.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unsafe-unary-minus": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Require unary negation to take a number", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/no-unsafe-unary-minus", + }, + "messages": { + "unaryMinus": "Argument of unary negation should be assignable to number | bigint but is {{type}} instead.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unused-expressions": { + "create": [Function], + "defaultOptions": [ + { + "allowShortCircuit": false, + "allowTaggedTemplates": false, + "allowTernary": false, + }, + ], + "meta": { + "defaultOptions": [ + { + "allowShortCircuit": false, + "allowTaggedTemplates": false, + "allowTernary": false, + }, + ], + "docs": { + "description": "Disallow unused expressions", + "extendsBaseRule": true, + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-unused-expressions", + }, + "hasSuggestions": undefined, + "messages": { + "unusedExpression": "Expected an assignment or function call and instead saw an expression.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowShortCircuit": { + "type": "boolean", + }, + "allowTaggedTemplates": { + "type": "boolean", + }, + "allowTernary": { + "type": "boolean", + }, + "enforceForJSX": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "no-unused-vars": { + "create": [Function], + "defaultOptions": [ + {}, + ], + "meta": { + "docs": { + "description": "Disallow unused variables", + "extendsBaseRule": true, + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-unused-vars", + }, + "messages": { + "unusedVar": "'{{varName}}' is {{action}} but never used{{additional}}.", + "usedIgnoredVar": "'{{varName}}' is marked as ignored but is used{{additional}}.", + "usedOnlyAsType": "'{{varName}}' is {{action}} but only used as a type{{additional}}.", + }, + "schema": [ + { + "oneOf": [ + { + "enum": [ + "all", + "local", + ], + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "args": { + "description": "Whether to check all, some, or no arguments.", + "enum": [ + "all", + "after-used", + "none", + ], + "type": "string", + }, + "argsIgnorePattern": { + "description": "Regular expressions of argument names to not check for usage.", + "type": "string", + }, + "caughtErrors": { + "description": "Whether to check catch block arguments.", + "enum": [ + "all", + "none", + ], + "type": "string", + }, + "caughtErrorsIgnorePattern": { + "description": "Regular expressions of catch block argument names to not check for usage.", + "type": "string", + }, + "destructuredArrayIgnorePattern": { + "description": "Regular expressions of destructured array variable names to not check for usage.", + "type": "string", + }, + "ignoreClassWithStaticInitBlock": { + "description": "Whether to ignore classes with at least one static initialization block.", + "type": "boolean", + }, + "ignoreRestSiblings": { + "description": "Whether to ignore sibling properties in \`...\` destructurings.", + "type": "boolean", + }, + "reportUsedIgnorePattern": { + "description": "Whether to report variables that match any of the valid ignore pattern options if they have been used.", + "type": "boolean", + }, + "vars": { + "description": "Whether to check all variables or only locally-declared variables.", + "enum": [ + "all", + "local", + ], + "type": "string", + }, + "varsIgnorePattern": { + "description": "Regular expressions of variable names to not check for usage.", + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + ], + "type": "problem", + }, + }, + "no-use-before-define": { + "create": [Function], + "defaultOptions": [ + { + "allowNamedExports": false, + "classes": true, + "enums": true, + "functions": true, + "ignoreTypeReferences": true, + "typedefs": true, + "variables": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow the use of variables before they are defined", + "extendsBaseRule": true, + "url": "https://typescript-eslint.io/rules/no-use-before-define", + }, + "messages": { + "noUseBeforeDefine": "'{{name}}' was used before it was defined.", + }, + "schema": [ + { + "oneOf": [ + { + "enum": [ + "nofunc", + ], + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "allowNamedExports": { + "description": "Whether to ignore named exports.", + "type": "boolean", + }, + "classes": { + "description": "Whether to ignore references to class declarations.", + "type": "boolean", + }, + "enums": { + "description": "Whether to check references to enums.", + "type": "boolean", + }, + "functions": { + "description": "Whether to ignore references to function declarations.", + "type": "boolean", + }, + "ignoreTypeReferences": { + "description": "Whether to ignore type references, such as in type annotations and assertions.", + "type": "boolean", + }, + "typedefs": { + "description": "Whether to check references to types.", + "type": "boolean", + }, + "variables": { + "description": "Whether to ignore references to variables.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + ], + "type": "problem", + }, + }, + "no-useless-constructor": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow unnecessary constructors", + "extendsBaseRule": true, + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/no-useless-constructor", + }, + "hasSuggestions": true, + "messages": { + "noUselessConstructor": "Useless constructor.", + "removeConstructor": "Remove the constructor.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-useless-empty-export": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow empty exports that don't change anything in a module file", + "url": "https://typescript-eslint.io/rules/no-useless-empty-export", + }, + "fixable": "code", + "hasSuggestions": false, + "messages": { + "uselessExport": "Empty export does nothing and can be removed.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "no-var-requires": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + }, + ], + "meta": { + "deprecated": { + "deprecatedSince": "8.0.0", + "replacedBy": [ + { + "rule": { + "name": "@typescript-eslint/no-require-imports", + "url": "https://typescript-eslint.io/rules/no-require-imports", + }, + }, + ], + "url": "https://github.com/typescript-eslint/typescript-eslint/pull/8334", + }, + "docs": { + "description": "Disallow \`require\` statements except in import statements", + "url": "https://typescript-eslint.io/rules/no-var-requires", + }, + "messages": { + "noVarReqs": "Require statement not part of import statement.", + }, + "replacedBy": [ + "@typescript-eslint/no-require-imports", + ], + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Patterns of import paths to allow requiring from.", + "items": { + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "no-wrapper-object-types": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow using confusing built-in primitive class wrappers", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/no-wrapper-object-types", + }, + "fixable": "code", + "messages": { + "bannedClassType": "Prefer using the primitive \`{{preferred}}\` as a type name, rather than the upper-cased \`{{typeName}}\`.", + }, + "schema": [], + "type": "problem", + }, + }, + "non-nullable-type-assertion-style": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce non-null assertions over explicit type assertions", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/non-nullable-type-assertion-style", + }, + "fixable": "code", + "messages": { + "preferNonNullAssertion": "Use a ! assertion to more succinctly remove null and undefined from the type.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "only-throw-error": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + "allowThrowingAny": true, + "allowThrowingUnknown": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow throwing non-\`Error\` values as exceptions", + "extendsBaseRule": "no-throw-literal", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/only-throw-error", + }, + "messages": { + "object": "Expected an error object to be thrown.", + "undef": "Do not throw undefined.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Type specifiers that can be thrown.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + "allowThrowingAny": { + "description": "Whether to always allow throwing values typed as \`any\`.", + "type": "boolean", + }, + "allowThrowingUnknown": { + "description": "Whether to always allow throwing values typed as \`unknown\`.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "parameter-properties": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + "prefer": "class-property", + }, + ], + "meta": { + "docs": { + "description": "Require or disallow parameter properties in class constructors", + "url": "https://typescript-eslint.io/rules/parameter-properties", + }, + "messages": { + "preferClassProperty": "Property {{parameter}} should be declared as a class property.", + "preferParameterProperty": "Property {{parameter}} should be declared as a parameter property.", + }, + "schema": [ + { + "$defs": { + "modifier": { + "enum": [ + "readonly", + "private", + "protected", + "public", + "private readonly", + "protected readonly", + "public readonly", + ], + "type": "string", + }, + }, + "additionalProperties": false, + "properties": { + "allow": { + "description": "Whether to allow certain kinds of properties to be ignored.", + "items": { + "$ref": "#/items/0/$defs/modifier", + }, + "type": "array", + }, + "prefer": { + "description": "Whether to prefer class properties or parameter properties.", + "enum": [ + "class-property", + "parameter-property", + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "prefer-as-const": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce the use of \`as const\` over literal type", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/prefer-as-const", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "preferConstAssertion": "Expected a \`const\` instead of a literal type assertion.", + "variableConstAssertion": "Expected a \`const\` assertion instead of a literal type annotation.", + "variableSuggest": "You should use \`as const\` instead of type annotation.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-destructuring": { + "create": [Function], + "defaultOptions": [ + { + "AssignmentExpression": { + "array": true, + "object": true, + }, + "VariableDeclarator": { + "array": true, + "object": true, + }, + }, + {}, + ], + "meta": { + "docs": { + "description": "Require destructuring from arrays and/or objects", + "extendsBaseRule": true, + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-destructuring", + }, + "fixable": "code", + "hasSuggestions": undefined, + "messages": { + "preferDestructuring": "Use {{type}} destructuring.", + }, + "schema": [ + { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "AssignmentExpression": { + "additionalProperties": false, + "properties": { + "array": { + "type": "boolean", + }, + "object": { + "type": "boolean", + }, + }, + "type": "object", + }, + "VariableDeclarator": { + "additionalProperties": false, + "properties": { + "array": { + "type": "boolean", + }, + "object": { + "type": "boolean", + }, + }, + "type": "object", + }, + }, + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "array": { + "type": "boolean", + }, + "object": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + }, + { + "properties": { + "enforceForDeclarationWithTypeAnnotation": { + "description": "Whether to enforce destructuring on variable declarations with type annotations.", + "type": "boolean", + }, + "enforceForRenamedProperties": { + "description": "Whether to enforce destructuring that use a different variable name than the property name.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-enum-initializers": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Require each enum member value to be explicitly initialized", + "url": "https://typescript-eslint.io/rules/prefer-enum-initializers", + }, + "hasSuggestions": true, + "messages": { + "defineInitializer": "The value of the member '{{ name }}' should be explicitly defined.", + "defineInitializerSuggestion": "Can be fixed to {{ name }} = {{ suggested }}", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-find": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce the use of Array.prototype.find() over Array.prototype.filter() followed by [0] when looking for a single result", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-find", + }, + "hasSuggestions": true, + "messages": { + "preferFind": "Prefer .find(...) instead of .filter(...)[0].", + "preferFindSuggestion": "Use .find(...) instead of .filter(...)[0].", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-for-of": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce the use of \`for-of\` loop over the standard \`for\` loop where possible", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/prefer-for-of", + }, + "messages": { + "preferForOf": "Expected a \`for-of\` loop instead of a \`for\` loop with this simple iteration.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-function-type": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce using function types instead of interfaces with call signatures", + "recommended": "stylistic", + "url": "https://typescript-eslint.io/rules/prefer-function-type", + }, + "fixable": "code", + "messages": { + "functionTypeOverCallableType": "{{ literalOrInterface }} only has a call signature, you should use a function type instead.", + "unexpectedThisOnFunctionOnlyInterface": "\`this\` refers to the function type '{{ interfaceName }}', did you intend to use a generic \`this\` parameter like \`(this: Self, ...) => Self\` instead?", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-includes": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce \`includes\` method over \`indexOf\` method", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-includes", + }, + "fixable": "code", + "messages": { + "preferIncludes": "Use 'includes()' method instead.", + "preferStringIncludes": "Use \`String#includes()\` method with a string instead.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-literal-enum-member": { + "create": [Function], + "defaultOptions": [ + { + "allowBitwiseExpressions": false, + }, + ], + "meta": { + "docs": { + "description": "Require all enum members to be literal values", + "recommended": "strict", + "requiresTypeChecking": false, + "url": "https://typescript-eslint.io/rules/prefer-literal-enum-member", + }, + "messages": { + "notLiteral": "Explicit enum value must only be a literal value (string or number).", + "notLiteralOrBitwiseExpression": "Explicit enum value must only be a literal value (string or number) or a bitwise expression.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowBitwiseExpressions": { + "description": "Whether to allow using bitwise expressions in enum initializers.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-namespace-keyword": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Require using \`namespace\` keyword over \`module\` keyword to declare custom TypeScript modules", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/prefer-namespace-keyword", + }, + "fixable": "code", + "messages": { + "useNamespace": "Use 'namespace' instead of 'module' to declare custom TypeScript modules.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-nullish-coalescing": { + "create": [Function], + "defaultOptions": [ + { + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, + "ignoreBooleanCoercion": false, + "ignoreConditionalTests": true, + "ignoreMixedLogicalExpressions": false, + "ignorePrimitives": { + "bigint": false, + "boolean": false, + "number": false, + "string": false, + }, + "ignoreTernaryTests": false, + }, + ], + "meta": { + "docs": { + "description": "Enforce using the nullish coalescing operator instead of logical assignments or chaining", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-nullish-coalescing", + }, + "hasSuggestions": true, + "messages": { + "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", + "preferNullishOverOr": "Prefer using nullish coalescing operator (\`??{{ equals }}\`) instead of a logical {{ description }} (\`||{{ equals }}\`), as it is a safer operator.", + "preferNullishOverTernary": "Prefer using nullish coalescing operator (\`??{{ equals }}\`) instead of a ternary expression, as it is simpler to read.", + "suggestNullish": "Fix to nullish coalescing operator (\`??{{ equals }}\`).", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { + "description": "Unless this is set to \`true\`, the rule will error on every file whose \`tsconfig.json\` does _not_ have the \`strictNullChecks\` compiler option (or \`strict\`) set to \`true\`.", + "type": "boolean", + }, + "ignoreBooleanCoercion": { + "description": "Whether to ignore arguments to the \`Boolean\` constructor", + "type": "boolean", + }, + "ignoreConditionalTests": { + "description": "Whether to ignore cases that are located within a conditional test.", + "type": "boolean", + }, + "ignoreMixedLogicalExpressions": { + "description": "Whether to ignore any logical or expressions that are part of a mixed logical expression (with \`&&\`).", + "type": "boolean", + }, + "ignorePrimitives": { + "description": "Whether to ignore all (\`true\`) or some (an object with properties) primitive types.", + "oneOf": [ + { + "description": "Which primitives types may be ignored.", + "properties": { + "bigint": { + "description": "Ignore bigint primitive types.", + "type": "boolean", + }, + "boolean": { + "description": "Ignore boolean primitive types.", + "type": "boolean", + }, + "number": { + "description": "Ignore number primitive types.", + "type": "boolean", + }, + "string": { + "description": "Ignore string primitive types.", + "type": "boolean", + }, + }, + "type": "object", + }, + { + "description": "Ignore all primitive types.", + "enum": [ + true, + ], + "type": "boolean", + }, + ], + }, + "ignoreTernaryTests": { + "description": "Whether to ignore any ternary expressions that could be simplified by using the nullish coalescing operator.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-optional-chain": { + "create": [Function], + "defaultOptions": [ + { + "allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing": false, + "checkAny": true, + "checkBigInt": true, + "checkBoolean": true, + "checkNumber": true, + "checkString": true, + "checkUnknown": true, + "requireNullish": false, + }, + ], + "meta": { + "docs": { + "description": "Enforce using concise optional chain expressions instead of chained logical ands, negated logical ors, or empty objects", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-optional-chain", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "optionalChainSuggest": "Change to an optional chain.", + "preferOptionalChain": "Prefer using an optional chain expression instead, as it's more concise and easier to read.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing": { + "description": "Allow autofixers that will change the return type of the expression. This option is considered unsafe as it may break the build.", + "type": "boolean", + }, + "checkAny": { + "description": "Check operands that are typed as \`any\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + "checkBigInt": { + "description": "Check operands that are typed as \`bigint\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + "checkBoolean": { + "description": "Check operands that are typed as \`boolean\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + "checkNumber": { + "description": "Check operands that are typed as \`number\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + "checkString": { + "description": "Check operands that are typed as \`string\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + "checkUnknown": { + "description": "Check operands that are typed as \`unknown\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + "requireNullish": { + "description": "Skip operands that are not typed with \`null\` and/or \`undefined\` when inspecting "loose boolean" operands.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-promise-reject-errors": { + "create": [Function], + "defaultOptions": [ + { + "allowEmptyReject": false, + "allowThrowingAny": false, + "allowThrowingUnknown": false, + }, + ], + "meta": { + "docs": { + "description": "Require using Error objects as Promise rejection reasons", + "extendsBaseRule": true, + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-promise-reject-errors", + }, + "messages": { + "rejectAnError": "Expected the Promise rejection reason to be an Error.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowEmptyReject": { + "description": "Whether to allow calls to \`Promise.reject()\` with no arguments.", + "type": "boolean", + }, + "allowThrowingAny": { + "description": "Whether to always allow throwing values typed as \`any\`.", + "type": "boolean", + }, + "allowThrowingUnknown": { + "description": "Whether to always allow throwing values typed as \`unknown\`.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-readonly": { + "create": [Function], + "defaultOptions": [ + { + "onlyInlineLambdas": false, + }, + ], + "meta": { + "docs": { + "description": "Require private members to be marked as \`readonly\` if they're never modified outside of the constructor", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-readonly", + }, + "fixable": "code", + "messages": { + "preferReadonly": "Member '{{name}}' is never reassigned; mark it as \`readonly\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "onlyInlineLambdas": { + "description": "Whether to restrict checking only to members immediately assigned a lambda value.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-readonly-parameter-types": { + "create": [Function], + "defaultOptions": [ + { + "allow": [], + "checkParameterProperties": true, + "ignoreInferredTypes": false, + "treatMethodsAsReadonly": false, + }, + ], + "meta": { + "docs": { + "description": "Require function parameters to be typed as \`readonly\` to prevent accidental mutation of inputs", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-readonly-parameter-types", + }, + "messages": { + "shouldBeReadonly": "Parameter should be a read only type.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "An array of type specifiers to ignore.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + "checkParameterProperties": { + "description": "Whether to check class parameter properties.", + "type": "boolean", + }, + "ignoreInferredTypes": { + "description": "Whether to ignore parameters which don't explicitly specify a type.", + "type": "boolean", + }, + "treatMethodsAsReadonly": { + "description": "Whether to treat all mutable methods as though they are readonly.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-reduce-type-parameter": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce using type parameter when calling \`Array#reduce\` instead of using a type assertion", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-reduce-type-parameter", + }, + "fixable": "code", + "messages": { + "preferTypeParameter": "Unnecessary assertion: Array#reduce accepts a type parameter for the default value.", + }, + "schema": [], + "type": "problem", + }, + }, + "prefer-regexp-exec": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce \`RegExp#exec\` over \`String#match\` if no global flag is provided", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-regexp-exec", + }, + "fixable": "code", + "messages": { + "regExpExecOverStringMatch": "Use the \`RegExp#exec()\` method instead.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-return-this-type": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce that \`this\` is used when only \`this\` type is returned", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-return-this-type", + }, + "fixable": "code", + "messages": { + "useThisType": "Use \`this\` type instead.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "prefer-string-starts-ends-with": { + "create": [Function], + "defaultOptions": [ + { + "allowSingleElementEquality": "never", + }, + ], + "meta": { + "docs": { + "description": "Enforce using \`String#startsWith\` and \`String#endsWith\` over other equivalent methods of checking substrings", + "recommended": "stylistic", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/prefer-string-starts-ends-with", + }, + "fixable": "code", + "messages": { + "preferEndsWith": "Use the 'String#endsWith' method instead.", + "preferStartsWith": "Use 'String#startsWith' method instead.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowSingleElementEquality": { + "description": "Whether to allow equality checks against the first or last element of a string.", + "enum": [ + "always", + "never", + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "prefer-ts-expect-error": { + "create": [Function], + "defaultOptions": [], + "meta": { + "deprecated": { + "deprecatedSince": "7.11.0", + "replacedBy": [ + { + "rule": { + "name": "@typescript-eslint/ban-ts-comment", + "url": "https://typescript-eslint.io/rules/ban-ts-comment", + }, + }, + ], + "url": "https://github.com/typescript-eslint/typescript-eslint/pull/9081", + }, + "docs": { + "description": "Enforce using \`@ts-expect-error\` over \`@ts-ignore\`", + "url": "https://typescript-eslint.io/rules/prefer-ts-expect-error", + }, + "fixable": "code", + "messages": { + "preferExpectErrorComment": "Use "@ts-expect-error" to ensure an error is actually being suppressed.", + }, + "replacedBy": [ + "@typescript-eslint/ban-ts-comment", + ], + "schema": [], + "type": "problem", + }, + }, + "promise-function-async": { + "create": [Function], + "defaultOptions": [ + { + "allowAny": true, + "allowedPromiseNames": [], + "checkArrowFunctions": true, + "checkFunctionDeclarations": true, + "checkFunctionExpressions": true, + "checkMethodDeclarations": true, + }, + ], + "meta": { + "docs": { + "description": "Require any function or method that returns a Promise to be marked async", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/promise-function-async", + }, + "fixable": "code", + "messages": { + "missingAsync": "Functions that return promises must be async.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowAny": { + "description": "Whether to consider \`any\` and \`unknown\` to be Promises.", + "type": "boolean", + }, + "allowedPromiseNames": { + "description": "Any extra names of classes or interfaces to be considered Promises.", + "items": { + "type": "string", + }, + "type": "array", + }, + "checkArrowFunctions": { + "description": "Whether to check arrow functions.", + "type": "boolean", + }, + "checkFunctionDeclarations": { + "description": "Whether to check standalone function declarations.", + "type": "boolean", + }, + "checkFunctionExpressions": { + "description": "Whether to check inline function expressions", + "type": "boolean", + }, + "checkMethodDeclarations": { + "description": "Whether to check methods on classes and object literals.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "related-getter-setter-pairs": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce that \`get()\` types should be assignable to their equivalent \`set()\` type", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/related-getter-setter-pairs", + }, + "messages": { + "mismatch": "\`get()\` type should be assignable to its equivalent \`set()\` type.", + }, + "schema": [], + "type": "problem", + }, + }, + "require-array-sort-compare": { + "create": [Function], + "defaultOptions": [ + { + "ignoreStringArrays": true, + }, + ], + "meta": { + "docs": { + "description": "Require \`Array#sort\` and \`Array#toSorted\` calls to always provide a \`compareFunction\`", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/require-array-sort-compare", + }, + "messages": { + "requireCompare": "Require 'compare' argument.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreStringArrays": { + "description": "Whether to ignore arrays in which all elements are strings.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "require-await": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow async functions which do not return promises and have no \`await\` expression", + "extendsBaseRule": true, + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/require-await", + }, + "hasSuggestions": true, + "messages": { + "missingAwait": "{{name}} has no 'await' expression.", + "removeAsync": "Remove 'async'.", + }, + "schema": [], + "type": "suggestion", + }, + }, + "restrict-plus-operands": { + "create": [Function], + "defaultOptions": [ + { + "allowAny": true, + "allowBoolean": true, + "allowNullish": true, + "allowNumberAndString": true, + "allowRegExp": true, + "skipCompoundAssignments": false, + }, + ], + "meta": { + "docs": { + "description": "Require both operands of addition to be the same type and be \`bigint\`, \`number\`, or \`string\`", + "recommended": { + "recommended": true, + "strict": [ + { + "allowAny": false, + "allowBoolean": false, + "allowNullish": false, + "allowNumberAndString": false, + "allowRegExp": false, + }, + ], + }, + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/restrict-plus-operands", + }, + "messages": { + "bigintAndNumber": "Numeric '+' operations must either be both bigints or both numbers. Got \`{{left}}\` + \`{{right}}\`.", + "invalid": "Invalid operand for a '+' operation. Operands must each be a number or {{stringLike}}. Got \`{{type}}\`.", + "mismatched": "Operands of '+' operations must be a number or {{stringLike}}. Got \`{{left}}\` + \`{{right}}\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowAny": { + "description": "Whether to allow \`any\` typed values.", + "type": "boolean", + }, + "allowBoolean": { + "description": "Whether to allow \`boolean\` typed values.", + "type": "boolean", + }, + "allowNullish": { + "description": "Whether to allow potentially \`null\` or \`undefined\` typed values.", + "type": "boolean", + }, + "allowNumberAndString": { + "description": "Whether to allow \`bigint\`/\`number\` typed values and \`string\` typed values to be added together.", + "type": "boolean", + }, + "allowRegExp": { + "description": "Whether to allow \`regexp\` typed values.", + "type": "boolean", + }, + "skipCompoundAssignments": { + "description": "Whether to skip compound assignments such as \`+=\`.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "restrict-template-expressions": { + "create": [Function], + "defaultOptions": [ + { + "allow": [ + { + "from": "lib", + "name": [ + "Error", + "URL", + "URLSearchParams", + ], + }, + ], + "allowAny": true, + "allowBoolean": true, + "allowNullish": true, + "allowNumber": true, + "allowRegExp": true, + }, + ], + "meta": { + "docs": { + "description": "Enforce template literal expressions to be of \`string\` type", + "recommended": { + "recommended": true, + "strict": [ + { + "allowAny": false, + "allowBoolean": false, + "allowNever": false, + "allowNullish": false, + "allowNumber": false, + "allowRegExp": false, + }, + ], + }, + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/restrict-template-expressions", + }, + "messages": { + "invalidType": "Invalid type "{{type}}" of template literal expression.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allow": { + "description": "Types to allow in template expressions.", + "items": { + "oneOf": [ + { + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "file", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "path": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "lib", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + }, + "required": [ + "from", + "name", + ], + "type": "object", + }, + { + "additionalProperties": false, + "properties": { + "from": { + "enum": [ + "package", + ], + "type": "string", + }, + "name": { + "oneOf": [ + { + "type": "string", + }, + { + "items": { + "type": "string", + }, + "minItems": 1, + "type": "array", + "uniqueItems": true, + }, + ], + }, + "package": { + "type": "string", + }, + }, + "required": [ + "from", + "name", + "package", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + "allowAny": { + "description": "Whether to allow \`any\` typed values in template expressions.", + "type": "boolean", + }, + "allowArray": { + "description": "Whether to allow \`array\` typed values in template expressions.", + "type": "boolean", + }, + "allowBoolean": { + "description": "Whether to allow \`boolean\` typed values in template expressions.", + "type": "boolean", + }, + "allowNever": { + "description": "Whether to allow \`never\` typed values in template expressions.", + "type": "boolean", + }, + "allowNullish": { + "description": "Whether to allow \`nullish\` typed values in template expressions.", + "type": "boolean", + }, + "allowNumber": { + "description": "Whether to allow \`number\` typed values in template expressions.", + "type": "boolean", + }, + "allowRegExp": { + "description": "Whether to allow \`regexp\` typed values in template expressions.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "return-await": { + "create": [Function], + "defaultOptions": [ + "in-try-catch", + ], + "meta": { + "docs": { + "description": "Enforce consistent awaiting of returned promises", + "recommended": { + "strict": [ + "error-handling-correctness-only", + ], + }, + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/return-await", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "disallowedPromiseAwait": "Returning an awaited promise is not allowed in this context.", + "disallowedPromiseAwaitSuggestion": "Remove \`await\` before the expression. Use caution as this may impact control flow.", + "nonPromiseAwait": "Returning an awaited value that is not a promise is not allowed.", + "requiredPromiseAwait": "Returning an awaited promise is required in this context.", + "requiredPromiseAwaitSuggestion": "Add \`await\` before the expression. Use caution as this may impact control flow.", + }, + "schema": [ + { + "oneOf": [ + { + "description": "Requires that all returned promises be awaited.", + "enum": [ + "always", + ], + "type": "string", + }, + { + "description": "In error-handling contexts, the rule enforces that returned promises must be awaited. In ordinary contexts, the rule does not enforce any particular behavior around whether returned promises are awaited.", + "enum": [ + "error-handling-correctness-only", + ], + "type": "string", + }, + { + "description": "In error-handling contexts, the rule enforces that returned promises must be awaited. In ordinary contexts, the rule enforces that returned promises _must not_ be awaited.", + "enum": [ + "in-try-catch", + ], + "type": "string", + }, + { + "description": "Disallows awaiting any returned promises.", + "enum": [ + "never", + ], + "type": "string", + }, + ], + "type": "string", + }, + ], + "type": "problem", + }, + }, + "sort-type-constituents": { + "create": [Function], + "defaultOptions": [ + { + "caseSensitive": false, + "checkIntersections": true, + "checkUnions": true, + "groupOrder": [ + "named", + "keyword", + "operator", + "literal", + "function", + "import", + "conditional", + "object", + "tuple", + "intersection", + "union", + "nullish", + ], + }, + ], + "meta": { + "deprecated": { + "deprecatedSince": "7.13.0", + "replacedBy": [ + { + "plugin": { + "name": "eslint-plugin-perfectionist", + "url": "https://perfectionist.dev", + }, + "rule": { + "name": "perfectionist/sort-intersection-types", + "url": "https://perfectionist.dev/rules/sort-intersection-types", + }, + }, + { + "plugin": { + "name": "eslint-plugin-perfectionist", + "url": "https://perfectionist.dev", + }, + "rule": { + "name": "perfectionist/sort-union-types", + "url": "https://perfectionist.dev/rules/sort-union-types", + }, + }, + ], + "url": "https://github.com/typescript-eslint/typescript-eslint/pull/9253", + }, + "docs": { + "description": "Enforce constituents of a type union/intersection to be sorted alphabetically", + "url": "https://typescript-eslint.io/rules/sort-type-constituents", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "notSorted": "{{type}} type constituents must be sorted.", + "notSortedNamed": "{{type}} type {{name}} constituents must be sorted.", + "suggestFix": "Sort constituents of type (removes all comments).", + }, + "replacedBy": [ + "perfectionist/sort-intersection-types", + "perfectionist/sort-union-types", + ], + "schema": [ + { + "additionalProperties": false, + "properties": { + "caseSensitive": { + "description": "Whether to sort using case sensitive string comparisons.", + "type": "boolean", + }, + "checkIntersections": { + "description": "Whether to check intersection types (\`&\`).", + "type": "boolean", + }, + "checkUnions": { + "description": "Whether to check union types (\`|\`).", + "type": "boolean", + }, + "groupOrder": { + "description": "Ordering of the groups.", + "items": { + "enum": [ + "conditional", + "function", + "import", + "intersection", + "keyword", + "nullish", + "literal", + "named", + "object", + "operator", + "tuple", + "union", + ], + "type": "string", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "strict-boolean-expressions": { + "create": [Function], + "defaultOptions": [ + { + "allowAny": false, + "allowNullableBoolean": false, + "allowNullableEnum": false, + "allowNullableNumber": false, + "allowNullableObject": true, + "allowNullableString": false, + "allowNumber": true, + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, + "allowString": true, + }, + ], + "meta": { + "docs": { + "description": "Disallow certain types in boolean expressions", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/strict-boolean-expressions", + }, + "hasSuggestions": true, + "messages": { + "conditionErrorAny": "Unexpected any value in {{context}}. An explicit comparison or type conversion is required.", + "conditionErrorNullableBoolean": "Unexpected nullable boolean value in {{context}}. Please handle the nullish case explicitly.", + "conditionErrorNullableEnum": "Unexpected nullable enum value in {{context}}. Please handle the nullish/zero/NaN cases explicitly.", + "conditionErrorNullableNumber": "Unexpected nullable number value in {{context}}. Please handle the nullish/zero/NaN cases explicitly.", + "conditionErrorNullableObject": "Unexpected nullable object value in {{context}}. An explicit null check is required.", + "conditionErrorNullableString": "Unexpected nullable string value in {{context}}. Please handle the nullish/empty cases explicitly.", + "conditionErrorNullish": "Unexpected nullish value in conditional. The condition is always false.", + "conditionErrorNumber": "Unexpected number value in {{context}}. An explicit zero/NaN check is required.", + "conditionErrorObject": "Unexpected object value in {{context}}. The condition is always true.", + "conditionErrorOther": "Unexpected value in conditional. A boolean expression is required.", + "conditionErrorString": "Unexpected string value in {{context}}. An explicit empty string check is required.", + "conditionFixCastBoolean": "Explicitly convert value to a boolean (\`Boolean(value)\`)", + "conditionFixCompareArrayLengthNonzero": "Change condition to check array's length (\`value.length > 0\`)", + "conditionFixCompareArrayLengthZero": "Change condition to check array's length (\`value.length === 0\`)", + "conditionFixCompareEmptyString": "Change condition to check for empty string (\`value !== ""\`)", + "conditionFixCompareFalse": "Change condition to check if false (\`value === false\`)", + "conditionFixCompareNaN": "Change condition to check for NaN (\`!Number.isNaN(value)\`)", + "conditionFixCompareNullish": "Change condition to check for null/undefined (\`value != null\`)", + "conditionFixCompareStringLength": "Change condition to check string's length (\`value.length !== 0\`)", + "conditionFixCompareTrue": "Change condition to check if true (\`value === true\`)", + "conditionFixCompareZero": "Change condition to check for 0 (\`value !== 0\`)", + "conditionFixDefaultEmptyString": "Explicitly treat nullish value the same as an empty string (\`value ?? ""\`)", + "conditionFixDefaultFalse": "Explicitly treat nullish value the same as false (\`value ?? false\`)", + "conditionFixDefaultZero": "Explicitly treat nullish value the same as 0 (\`value ?? 0\`)", + "explicitBooleanReturnType": "Add an explicit \`boolean\` return type annotation.", + "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", + "predicateCannotBeAsync": "Predicate function should not be 'async'; expected a boolean return type.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowAny": { + "description": "Whether to allow \`any\`s in a boolean context.", + "type": "boolean", + }, + "allowNullableBoolean": { + "description": "Whether to allow nullable \`boolean\`s in a boolean context.", + "type": "boolean", + }, + "allowNullableEnum": { + "description": "Whether to allow nullable \`enum\`s in a boolean context.", + "type": "boolean", + }, + "allowNullableNumber": { + "description": "Whether to allow nullable \`number\`s in a boolean context.", + "type": "boolean", + }, + "allowNullableObject": { + "description": "Whether to allow nullable \`object\`s, \`symbol\`s, and functions in a boolean context.", + "type": "boolean", + }, + "allowNullableString": { + "description": "Whether to allow nullable \`string\`s in a boolean context.", + "type": "boolean", + }, + "allowNumber": { + "description": "Whether to allow \`number\`s in a boolean context.", + "type": "boolean", + }, + "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { + "description": "Unless this is set to \`true\`, the rule will error on every file whose \`tsconfig.json\` does _not_ have the \`strictNullChecks\` compiler option (or \`strict\`) set to \`true\`.", + "type": "boolean", + }, + "allowString": { + "description": "Whether to allow \`string\`s in a boolean context.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "switch-exhaustiveness-check": { + "create": [Function], + "defaultOptions": [ + { + "allowDefaultCaseForExhaustiveSwitch": true, + "considerDefaultExhaustiveForUnions": false, + "requireDefaultForNonUnion": false, + }, + ], + "meta": { + "docs": { + "description": "Require switch-case statements to be exhaustive", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/switch-exhaustiveness-check", + }, + "hasSuggestions": true, + "messages": { + "addMissingCases": "Add branches for missing cases.", + "dangerousDefaultCase": "The switch statement is exhaustive, so the default case is unnecessary.", + "switchIsNotExhaustive": "Switch is not exhaustive. Cases not matched: {{missingBranches}}", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "allowDefaultCaseForExhaustiveSwitch": { + "description": "If 'true', allow 'default' cases on switch statements with exhaustive cases.", + "type": "boolean", + }, + "considerDefaultExhaustiveForUnions": { + "description": "If 'true', the 'default' clause is used to determine whether the switch statement is exhaustive for union type", + "type": "boolean", + }, + "defaultCaseCommentPattern": { + "description": "Regular expression for a comment that can indicate an intentionally omitted default case.", + "type": "string", + }, + "requireDefaultForNonUnion": { + "description": "If 'true', require a 'default' clause for switches on non-union types.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "triple-slash-reference": { + "create": [Function], + "defaultOptions": [ + { + "lib": "always", + "path": "never", + "types": "prefer-import", + }, + ], + "meta": { + "docs": { + "description": "Disallow certain triple slash directives in favor of ES6-style import declarations", + "recommended": "recommended", + "url": "https://typescript-eslint.io/rules/triple-slash-reference", + }, + "messages": { + "tripleSlashReference": "Do not use a triple slash reference for {{module}}, use \`import\` style instead.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "lib": { + "description": "What to enforce for \`/// \` references.", + "enum": [ + "always", + "never", + ], + "type": "string", + }, + "path": { + "description": "What to enforce for \`/// \` references.", + "enum": [ + "always", + "never", + ], + "type": "string", + }, + "types": { + "description": "What to enforce for \`/// \` references.", + "enum": [ + "always", + "never", + "prefer-import", + ], + "type": "string", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "typedef": { + "create": [Function], + "defaultOptions": [ + { + "arrayDestructuring": false, + "arrowParameter": false, + "memberVariableDeclaration": false, + "objectDestructuring": false, + "parameter": false, + "propertyDeclaration": false, + "variableDeclaration": false, + "variableDeclarationIgnoreFunction": false, + }, + ], + "meta": { + "docs": { + "description": "Require type annotations in certain places", + "url": "https://typescript-eslint.io/rules/typedef", + }, + "messages": { + "expectedTypedef": "Expected a type annotation.", + "expectedTypedefNamed": "Expected {{name}} to have a type annotation.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "arrayDestructuring": { + "description": "Whether to enforce type annotations on variables declared using array destructuring.", + "type": "boolean", + }, + "arrowParameter": { + "description": "Whether to enforce type annotations for parameters of arrow functions.", + "type": "boolean", + }, + "memberVariableDeclaration": { + "description": "Whether to enforce type annotations on member variables of classes.", + "type": "boolean", + }, + "objectDestructuring": { + "description": "Whether to enforce type annotations on variables declared using object destructuring.", + "type": "boolean", + }, + "parameter": { + "description": "Whether to enforce type annotations for parameters of functions and methods.", + "type": "boolean", + }, + "propertyDeclaration": { + "description": "Whether to enforce type annotations for properties of interfaces and types.", + "type": "boolean", + }, + "variableDeclaration": { + "description": "Whether to enforce type annotations for variable declarations, excluding array and object destructuring.", + "type": "boolean", + }, + "variableDeclarationIgnoreFunction": { + "description": "Whether to ignore variable declarations for non-arrow and arrow functions.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "unbound-method": { + "create": [Function], + "defaultOptions": [ + { + "ignoreStatic": false, + }, + ], + "meta": { + "docs": { + "description": "Enforce unbound methods are called with their expected scope", + "recommended": "recommended", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/unbound-method", + }, + "messages": { + "unbound": "Avoid referencing unbound methods which may cause unintentional scoping of \`this\`.", + "unboundWithoutThisAnnotation": "Avoid referencing unbound methods which may cause unintentional scoping of \`this\`. +If your function does not access \`this\`, you can annotate it with \`this: void\`, or consider using an arrow function instead.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreStatic": { + "description": "Whether to skip checking whether \`static\` methods are correctly bound.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "problem", + }, + }, + "unified-signatures": { + "create": [Function], + "defaultOptions": [ + { + "ignoreDifferentlyNamedParameters": false, + "ignoreOverloadsWithDifferentJSDoc": false, + }, + ], + "meta": { + "docs": { + "description": "Disallow two overloads that could be unified into one with a union or an optional/rest parameter", + "recommended": "strict", + "url": "https://typescript-eslint.io/rules/unified-signatures", + }, + "messages": { + "omittingRestParameter": "{{failureStringStart}} with a rest parameter.", + "omittingSingleParameter": "{{failureStringStart}} with an optional parameter.", + "singleParameterDifference": "{{failureStringStart}} taking \`{{type1}} | {{type2}}\`.", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "ignoreDifferentlyNamedParameters": { + "description": "Whether two parameters with different names at the same index should be considered different even if their types are the same.", + "type": "boolean", + }, + "ignoreOverloadsWithDifferentJSDoc": { + "description": "Whether two overloads with different JSDoc comments should be considered different even if their parameter and return types are the same.", + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "use-unknown-in-catch-callback-variable": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Enforce typing arguments in Promise rejection callbacks as \`unknown\`", + "recommended": "strict", + "requiresTypeChecking": true, + "url": "https://typescript-eslint.io/rules/use-unknown-in-catch-callback-variable", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "addUnknownRestTypeAnnotationSuggestion": "Add an explicit \`: [unknown]\` type annotation to the rejection callback rest variable.", + "addUnknownTypeAnnotationSuggestion": "Add an explicit \`: unknown\` type annotation to the rejection callback variable.", + "useUnknown": "Prefer the safe \`: unknown\` for a \`{{method}}\`{{append}} callback variable.", + "useUnknownArrayDestructuringPattern": "Prefer the safe \`: unknown\` for a \`{{method}}\`{{append}} callback variable. The thrown error may not be iterable.", + "useUnknownObjectDestructuringPattern": "Prefer the safe \`: unknown\` for a \`{{method}}\`{{append}} callback variable. The thrown error may be nullable, or may not have the expected shape.", + "wrongRestTypeAnnotationSuggestion": "Change existing type annotation to \`: [unknown]\`.", + "wrongTypeAnnotationSuggestion": "Change existing type annotation to \`: unknown\`.", + }, + "schema": [], + "type": "suggestion", + }, + }, + }, + }, + }, + }, + { + "files": [ + "**/*.ts", + "**/*.tsx", + "**/*.mts", + "**/*.cts", + ], + "name": "typescript-eslint/eslint-recommended", + "rules": { + "constructor-super": "off", + "getter-return": "off", + "no-class-assign": "off", + "no-const-assign": "off", + "no-dupe-args": "off", + "no-dupe-class-members": "off", + "no-dupe-keys": "off", + "no-func-assign": "off", + "no-import-assign": "off", + "no-new-native-nonconstructor": "off", + "no-new-symbol": "off", + "no-obj-calls": "off", + "no-redeclare": "off", + "no-setter-return": "off", + "no-this-before-super": "off", + "no-undef": "off", + "no-unreachable": "off", + "no-unsafe-negation": "off", + "no-var": "error", + "prefer-const": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + }, + }, + { + "name": "typescript-eslint/recommended", + "rules": { + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/no-array-constructor": "error", + "@typescript-eslint/no-duplicate-enum-values": "error", + "@typescript-eslint/no-empty-object-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-extra-non-null-assertion": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-non-null-asserted-optional-chain": "error", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-type-constraint": "error", + "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "@typescript-eslint/prefer-as-const": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": "error", + "no-array-constructor": "off", + "no-unused-expressions": "off", + "no-unused-vars": "off", + }, + }, + { + "name": "tanstack/query/flat/recommended", + "plugins": { + "@tanstack/query": { + "configs": { + "flat/recommended": [ + { + "name": "tanstack/query/flat/recommended", + "plugins": [Circular], + "rules": { + "@tanstack/query/exhaustive-deps": "error", + "@tanstack/query/infinite-query-property-order": "error", + "@tanstack/query/no-rest-destructuring": "warn", + "@tanstack/query/no-unstable-deps": "error", + "@tanstack/query/stable-query-client": "error", + }, + }, + ], + "recommended": { + "plugins": [ + "@tanstack/query", + ], + "rules": { + "@tanstack/query/exhaustive-deps": "error", + "@tanstack/query/infinite-query-property-order": "error", + "@tanstack/query/no-rest-destructuring": "warn", + "@tanstack/query/no-unstable-deps": "error", + "@tanstack/query/stable-query-client": "error", + }, + }, + }, + "meta": { + "name": "@tanstack/eslint-plugin-query", + }, + "rules": { + "exhaustive-deps": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Exhaustive deps rule for useQuery", + "recommended": "error", + "url": "https://tanstack.com/query/latest/docs/eslint/exhaustive-deps", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "fixTo": "Fix to {{result}}", + "missingDeps": "The following dependencies are missing in your queryKey: {{deps}}", + }, + "schema": [], + "type": "problem", + }, + }, + "infinite-query-property-order": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Ensure correct order of inference sensitive properties for infinite queries", + "recommended": "error", + "url": "https://tanstack.com/query/latest/docs/eslint/infinite-query-property-order", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "invalidOrder": "Invalid order of properties for \`{{function}}\`.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-rest-destructuring": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallows rest destructuring in queries", + "recommended": "warn", + "url": "https://tanstack.com/query/latest/docs/eslint/no-rest-destructuring", + }, + "messages": { + "objectRestDestructure": "Object rest destructuring on a query will observe all changes to the query, leading to excessive re-renders.", + }, + "schema": [], + "type": "problem", + }, + }, + "no-unstable-deps": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Disallow putting the result of query hooks directly in a React hook dependency array", + "recommended": "error", + "url": "https://tanstack.com/query/latest/docs/eslint/no-unstable-deps", + }, + "messages": { + "noUnstableDeps": "The result of {{queryHook}} is not referentially stable, so don't pass it directly into the dependencies array of {{reactHook}}. Instead, destructure the return value of {{queryHook}} and pass the destructured values into the dependency array of {{reactHook}}.", + }, + "schema": [], + "type": "problem", + }, + }, + "stable-query-client": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "Makes sure that QueryClient is stable", + "recommended": "error", + "url": "https://tanstack.com/query/latest/docs/eslint/stable-query-client", + }, + "fixable": "code", + "hasSuggestions": true, + "messages": { + "fixTo": "Fix to {{result}}", + "unstable": "QueryClient is not stable. It should be either extracted from the component or wrapped in React.useState. +See https://tkdodo.eu/blog/react-query-fa-qs#2-the-queryclient-is-not-stable", + }, + "schema": [], + "type": "problem", + }, + }, + }, + }, + }, + "rules": { + "@tanstack/query/exhaustive-deps": "error", + "@tanstack/query/infinite-query-property-order": "error", + "@tanstack/query/no-rest-destructuring": "warn", + "@tanstack/query/no-unstable-deps": "error", + "@tanstack/query/stable-query-client": "error", + }, + }, + { + "plugins": { + "@devup": { + "rules": { + "app-page": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "required 페이지나 레이아웃 컴포넌트는 반드시 export default로 내보내야 합니다.", + "url": "https://github.com/dev-five-git/devup/tree/main/packages/eslint-plugin/src/rules/app-page", + }, + "fixable": "code", + "messages": { + "nameOfPageOrLayoutComponentShouldHaveSuffix": "페이지나 레이아웃 컴포넌트의 이름은 반드시 \`Page\`나 \`Layout\`으로 끝나야 합니다.", + "pageOrLayoutComponentShouldDefaultExport": "페이지나 레이아웃 컴포넌트는 반드시 \`export default\`로 내보내야 합니다.", + "pathParamsShouldExist": "경로 변수를 사용할 수 있을 경우 \`params\`는 반드시 존재해야 합니다.", + }, + "schema": [], + "type": "problem", + }, + }, + "component": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "required 컴포넌트 이름은 디렉터리 혹은 파일명을 따라야 합니다.", + "url": "https://github.com/dev-five-git/devup/tree/main/packages/eslint-plugin/src/rules/component", + }, + "fixable": "code", + "messages": { + "componentFileShouldExportComponent": "컴포넌트 파일은 컴포넌트를 내보내야 합니다.", + "componentNameShouldBeFollowDirectoryStructure": "컴포넌트 이름은 디렉토리명 혹은 파일명을 따라야 합니다.", + }, + "schema": [], + "type": "problem", + }, + }, + "component-interface": { + "create": [Function], + "defaultOptions": [], + "meta": { + "docs": { + "description": "required type annotation for component props when empty object pattern", + "url": "https://github.com/dev-five-git/devup/tree/main/packages/eslint-plugin/src/rules/component-interface", + }, + "fixable": "code", + "messages": { + "componentPropsShouldHaveTypeAnnotationWhenEmptyObjectPattern": "컴포넌트의 \`props\`가 비어있고 타입이 없을 경우 반드시 타입을 명시해야 합니다.", + }, + "schema": [], + "type": "problem", + }, + }, + "rsc-api": { + "create": [Function], + "meta": { + "docs": { + "description": "required 서버 컴포넌트에서는 반드시 cache 버전을 사용해야 합니다.", + "recommended": true, + }, + "fixable": "code", + "messages": { + "apiShouldBeCached": "\`{{ api }}\`는 서버 컴포넌트에서는 반드시 cache 버전을 사용해야 합니다.", + }, + "schema": [], + "type": "problem", + }, + }, + }, + }, + "react-hooks": { + "configs": { + "recommended": { + "plugins": [ + "react-hooks", + ], + "rules": { + "react-hooks/exhaustive-deps": "warn", + "react-hooks/rules-of-hooks": "error", + }, + }, + "recommended-latest": { + "name": "react-hooks/recommended", + "plugins": { + "react-hooks": { + "configs": [Circular], + "meta": { + "name": "eslint-plugin-react-hooks", + }, + "rules": { + "exhaustive-deps": { + "create": [Function], + "meta": { + "docs": { + "description": "verifies the list of dependencies for Hooks like useEffect and similar", + "recommended": true, + "url": "https://github.com/facebook/react/issues/14920", + }, + "fixable": "code", + "hasSuggestions": true, + "schema": [ + { + "additionalProperties": false, + "enableDangerousAutofixThisMayCauseInfiniteLoops": false, + "properties": { + "additionalHooks": { + "type": "string", + }, + "enableDangerousAutofixThisMayCauseInfiniteLoops": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "rules-of-hooks": { + "create": [Function], + "meta": { + "docs": { + "description": "enforces the Rules of Hooks", + "recommended": true, + "url": "https://reactjs.org/docs/hooks-rules.html", + }, + "type": "problem", + }, + }, + }, + }, + }, + "rules": { + "react-hooks/exhaustive-deps": "warn", + "react-hooks/rules-of-hooks": "error", + }, + }, + "recommended-legacy": { + "plugins": [ + "react-hooks", + ], + "rules": { + "react-hooks/exhaustive-deps": "warn", + "react-hooks/rules-of-hooks": "error", + }, + }, + }, + "meta": { + "name": "eslint-plugin-react-hooks", + }, + "rules": { + "exhaustive-deps": { + "create": [Function], + "meta": { + "docs": { + "description": "verifies the list of dependencies for Hooks like useEffect and similar", + "recommended": true, + "url": "https://github.com/facebook/react/issues/14920", + }, + "fixable": "code", + "hasSuggestions": true, + "schema": [ + { + "additionalProperties": false, + "enableDangerousAutofixThisMayCauseInfiniteLoops": false, + "properties": { + "additionalHooks": { + "type": "string", + }, + "enableDangerousAutofixThisMayCauseInfiniteLoops": { + "type": "boolean", + }, + }, + "type": "object", + }, + ], + "type": "suggestion", + }, + }, + "rules-of-hooks": { + "create": [Function], + "meta": { + "docs": { + "description": "enforces the Rules of Hooks", + "recommended": true, + "url": "https://reactjs.org/docs/hooks-rules.html", + }, + "type": "problem", + }, + }, + }, + }, + "simple-import-sort": { + "meta": { + "name": "eslint-plugin-simple-import-sort", + "version": "12.1.1", + }, + "rules": { + "exports": { + "create": [Function], + "meta": { + "docs": { + "description": "Automatically sort exports.", + "url": "https://github.com/lydell/eslint-plugin-simple-import-sort#sort-order", + }, + "fixable": "code", + "messages": { + "sort": "Run autofix to sort these exports!", + }, + "schema": [], + "type": "layout", + }, + }, + "imports": { + "create": [Function], + "meta": { + "docs": { + "description": "Automatically sort imports.", + "url": "https://github.com/lydell/eslint-plugin-simple-import-sort#sort-order", + }, + "fixable": "code", + "messages": { + "sort": "Run autofix to sort these imports!", + }, + "schema": [ + { + "additionalProperties": false, + "properties": { + "groups": { + "items": { + "items": { + "type": "string", + }, + "type": "array", + }, + "type": "array", + }, + }, + "type": "object", + }, + ], + "type": "layout", + }, + }, + }, + }, + "unused-imports": { + "meta": { + "name": "unused-imports", + }, + "rules": { + "no-unused-imports": { + "create": [Function], + "defaultOptions": [ + {}, + ], + "meta": { + "docs": { + "description": "Disallow unused variables", + "extendsBaseRule": true, + "recommended": "recommended", + "url": "https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/docs/rules/no-unused-imports.md", + }, + "fixable": "code", + "messages": { + "unusedVar": "'{{varName}}' is {{action}} but never used{{additional}}.", + "usedIgnoredVar": "'{{varName}}' is marked as ignored but is used{{additional}}.", + "usedOnlyAsType": "'{{varName}}' is {{action}} but only used as a type{{additional}}.", + }, + "schema": [ + { + "oneOf": [ + { + "enum": [ + "all", + "local", + ], + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "args": { + "description": "Whether to check all, some, or no arguments.", + "enum": [ + "all", + "after-used", + "none", + ], + "type": "string", + }, + "argsIgnorePattern": { + "description": "Regular expressions of argument names to not check for usage.", + "type": "string", + }, + "caughtErrors": { + "description": "Whether to check catch block arguments.", + "enum": [ + "all", + "none", + ], + "type": "string", + }, + "caughtErrorsIgnorePattern": { + "description": "Regular expressions of catch block argument names to not check for usage.", + "type": "string", + }, + "destructuredArrayIgnorePattern": { + "description": "Regular expressions of destructured array variable names to not check for usage.", + "type": "string", + }, + "ignoreClassWithStaticInitBlock": { + "description": "Whether to ignore classes with at least one static initialization block.", + "type": "boolean", + }, + "ignoreRestSiblings": { + "description": "Whether to ignore sibling properties in \`...\` destructurings.", + "type": "boolean", + }, + "reportUsedIgnorePattern": { + "description": "Whether to report variables that match any of the valid ignore pattern options if they have been used.", + "type": "boolean", + }, + "vars": { + "description": "Whether to check all variables or only locally-declared variables.", + "enum": [ + "all", + "local", + ], + "type": "string", + }, + "varsIgnorePattern": { + "description": "Regular expressions of variable names to not check for usage.", + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + ], + "type": "problem", + }, + }, + "no-unused-vars": { + "create": [Function], + "defaultOptions": [ + {}, + ], + "meta": { + "docs": { + "description": "Disallow unused variables", + "extendsBaseRule": true, + "recommended": "recommended", + "url": "https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/docs/rules/no-unused-vars.md", + }, + "fixable": "code", + "messages": { + "unusedVar": "'{{varName}}' is {{action}} but never used{{additional}}.", + "usedIgnoredVar": "'{{varName}}' is marked as ignored but is used{{additional}}.", + "usedOnlyAsType": "'{{varName}}' is {{action}} but only used as a type{{additional}}.", + }, + "schema": [ + { + "oneOf": [ + { + "enum": [ + "all", + "local", + ], + "type": "string", + }, + { + "additionalProperties": false, + "properties": { + "args": { + "description": "Whether to check all, some, or no arguments.", + "enum": [ + "all", + "after-used", + "none", + ], + "type": "string", + }, + "argsIgnorePattern": { + "description": "Regular expressions of argument names to not check for usage.", + "type": "string", + }, + "caughtErrors": { + "description": "Whether to check catch block arguments.", + "enum": [ + "all", + "none", + ], + "type": "string", + }, + "caughtErrorsIgnorePattern": { + "description": "Regular expressions of catch block argument names to not check for usage.", + "type": "string", + }, + "destructuredArrayIgnorePattern": { + "description": "Regular expressions of destructured array variable names to not check for usage.", + "type": "string", + }, + "ignoreClassWithStaticInitBlock": { + "description": "Whether to ignore classes with at least one static initialization block.", + "type": "boolean", + }, + "ignoreRestSiblings": { + "description": "Whether to ignore sibling properties in \`...\` destructurings.", + "type": "boolean", + }, + "reportUsedIgnorePattern": { + "description": "Whether to report variables that match any of the valid ignore pattern options if they have been used.", + "type": "boolean", + }, + "vars": { + "description": "Whether to check all variables or only locally-declared variables.", + "enum": [ + "all", + "local", + ], + "type": "string", + }, + "varsIgnorePattern": { + "description": "Regular expressions of variable names to not check for usage.", + "type": "string", + }, + }, + "type": "object", + }, + ], + }, + ], + "type": "problem", + }, + }, + }, + }, + }, + "rules": { + "@devup/app-page": "error", + "@devup/component": "error", + "@devup/component-interface": "error", + "@devup/rsc-api": "error", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-expressions": [ + "error", + { + "allowShortCircuit": true, + "allowTernary": true, + }, + ], + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "all", + "argsIgnorePattern": "^_", + "caughtErrors": "all", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", + "ignoreRestSiblings": true, + "varsIgnorePattern": "^_", + }, + ], + "@typescript-eslint/no-var-requires": "off", + "camelcase": "off", + "comma-dangle": "off", + "no-console": [ + "error", + { + "allow": [ + "info", + "debug", + "warn", + "error", + ], + }, + ], + "no-constant-condition": [ + "error", + { + "checkLoops": false, + }, + ], + "no-trailing-spaces": "error", + "prettier/prettier": [ + "error", + { + "endOfLine": "auto", + "semi": false, + "singleQuote": true, + "trailingComma": "all", + }, + ], + "react-hooks/exhaustive-deps": [ + "warn", + { + "additionalHooks": "useSafeEffect", + }, + ], + "react-hooks/rules-of-hooks": "error", + "react/jsx-curly-brace-presence": "error", + "react/jsx-sort-props": [ + "error", + { + "callbacksLast": false, + "ignoreCase": false, + "noSortAlphabetically": false, + "reservedFirst": true, + "shorthandFirst": false, + "shorthandLast": false, + }, + ], + "react/prop-types": "off", + "react/react-in-jsx-scope": "off", + "react/sort-default-props": "error", + "require-jsdoc": "off", + "simple-import-sort/exports": "error", + "simple-import-sort/imports": "error", + "spaced-comment": [ + "error", + "always", + { + "markers": [ + "/", + ], + }, + ], + "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-vars": "off", + "valid-jsdoc": "off", + }, + "settings": { + "react": { + "version": "detect", + }, + }, + }, + { + "files": [ + "**/*.test-d.{ts,tsx}", + ], + "rules": { + "@typescript-eslint/no-unused-expressions": "off", + }, + }, +] +`; diff --git a/packages/eslint-plugin/src/configs/__tests__/recommended.test.ts b/packages/eslint-plugin/src/configs/__tests__/recommended.test.ts new file mode 100644 index 00000000..38a93c49 --- /dev/null +++ b/packages/eslint-plugin/src/configs/__tests__/recommended.test.ts @@ -0,0 +1,6 @@ +import recommended from '../recommended' +describe('recommended', () => { + it('export recommended config', () => { + expect(recommended).toMatchSnapshot() + }) +}) diff --git a/packages/eslint-plugin/src/configs/recommended.ts b/packages/eslint-plugin/src/configs/recommended.ts new file mode 100644 index 00000000..0e2a5f5a --- /dev/null +++ b/packages/eslint-plugin/src/configs/recommended.ts @@ -0,0 +1,33 @@ +import { noUselessTailingNulls } from 'src/rules/no-useless-tailing-nulls' + +export default [ + { + ignores: [ + '**/node_modules/', + '**/build/', + '**/__snapshots__/', + '!**/src/**', + '!vite.config.ts', + '!**/.storybook/**', + '**/storybook-static/', + '**/dist/', + '**/next-env.d.ts', + '**/out/', + '**/.next/', + '**/public/', + '**/.df/', + ], + }, + { + plugins: { + '@devup-ui': { + rules: { + 'no-useless-tailing-nulls': noUselessTailingNulls, + }, + }, + }, + rules: { + '@devup-ui/no-useless-tailing-nulls': 'error', + }, + }, +] diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts new file mode 100644 index 00000000..5ce6fd5a --- /dev/null +++ b/packages/eslint-plugin/src/index.ts @@ -0,0 +1,6 @@ +import recommended from './configs/recommended' +export * as rules from './rules' + +export const configs = { + recommended, +} diff --git a/packages/eslint-plugin/src/rules/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/__tests__/index.test.ts new file mode 100644 index 00000000..04d32c17 --- /dev/null +++ b/packages/eslint-plugin/src/rules/__tests__/index.test.ts @@ -0,0 +1,8 @@ +import * as index from '../index' +describe('export index', () => { + it('export', () => { + expect({ ...index }).toEqual({ + noUselessTailingNulls: expect.any(Object), + }) + }) +}) diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/README.md b/packages/eslint-plugin/src/rules/css-utils-literal-only/README.md new file mode 100644 index 00000000..e69de29b diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts new file mode 100644 index 00000000..116129ca --- /dev/null +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts @@ -0,0 +1,88 @@ +import { RuleTester } from '@typescript-eslint/rule-tester' + +import { cssUtilsLiteralOnly } from '../index' + +describe('css-utils-literal-only rule', () => { + const ruleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 'latest', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }) + it.each(['css', 'globalCss'])('should pass', (code) => { + ruleTester.run('css-utils-literal-only rule', cssUtilsLiteralOnly, { + valid: [ + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: 1})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: "1"})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} } from "other-package";\n${code}({w: [1][0]})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: [1]})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: ["1"]})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({w: ["1"]})`, + filename: 'src/app/page.tsx', + }, + ], + invalid: [ + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: v})`, + output: `import { ${code} } from "@devup-ui/react";\n${code}({w: v})`, + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'cssUtilsLiteralOnly', + }, + ], + }, + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: [v]})`, + output: `import { ${code} } from "@devup-ui/react";\n${code}({w: [v]})`, + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'cssUtilsLiteralOnly', + }, + ], + }, + { + code: `import { ${code} } from "@devup-ui/react";\n${code}({w: [1, null, v]})`, + output: `import { ${code} } from "@devup-ui/react";\n${code}({w: [1, null, v]})`, + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'cssUtilsLiteralOnly', + }, + ], + }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({w: [1, null, v]})`, + output: `import { ${code} as B } from "@devup-ui/react";\nB({w: [1, null, v]})`, + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'cssUtilsLiteralOnly', + }, + ], + }, + ], + }) + }) +}) diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts new file mode 100644 index 00000000..50602b8d --- /dev/null +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts @@ -0,0 +1,25 @@ +import { ESLintUtils } from '@typescript-eslint/utils' + +const createRule = ESLintUtils.RuleCreator( + (name) => + `https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`, +) + +export const cssUtilsLiteralOnly = createRule({ + name: 'css-utils-literal-only', + defaultOptions: [], + meta: { + schema: [], + messages: { + cssUtilsLiteralOnly: 'CSS utils should only be used with literal values.', + }, + type: 'problem', + fixable: 'code', + docs: { + description: 'CSS utils should only be used with literal values.', + }, + }, + create(_context) { + return {} + }, +}) diff --git a/packages/eslint-plugin/src/rules/index.ts b/packages/eslint-plugin/src/rules/index.ts new file mode 100644 index 00000000..9b1a6e10 --- /dev/null +++ b/packages/eslint-plugin/src/rules/index.ts @@ -0,0 +1 @@ +export * from './no-useless-tailing-nulls' diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/README.md b/packages/eslint-plugin/src/rules/no-useless-responsive/README.md new file mode 100644 index 00000000..e69de29b diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts new file mode 100644 index 00000000..b9b7e5f6 --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts @@ -0,0 +1,56 @@ +import { RuleTester } from '@typescript-eslint/rule-tester' + +import { noUselessResponsive } from '../index' + +describe('no-useless-responsive rule', () => { + const ruleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 'latest', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }) + ruleTester.run('no-useless-responsive rule', noUselessResponsive, { + valid: [ + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "other-package";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { css } from "@devup-ui/react";\ncss({w: 1})', + filename: 'src/app/page.tsx', + }, + { + code: 'import { css } from "@devup-ui/react";\ncss({w: "1"})', + filename: 'src/app/page.tsx', + }, + { + code: 'import { css } from "other-package";\ncss({w: [1][0]})', + filename: 'src/app/page.tsx', + }, + ], + invalid: [ + { + code: 'import { Box } from "@devup-ui/react";\n', + output: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, + ], + }) +}) diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts new file mode 100644 index 00000000..3c1150e2 --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts @@ -0,0 +1,25 @@ +import { ESLintUtils } from '@typescript-eslint/utils' + +const createRule = ESLintUtils.RuleCreator( + (name) => + `https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`, +) + +export const noUselessResponsive = createRule({ + name: 'no-useless-responsive', + defaultOptions: [], + meta: { + schema: [], + messages: { + uselessResponsive: 'Responsive are useless. Remove them.', + }, + type: 'problem', + fixable: 'code', + docs: { + description: 'No useless responsive.', + }, + }, + create(_context) { + return {} + }, +}) diff --git a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md new file mode 100644 index 00000000..e69de29b diff --git a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts new file mode 100644 index 00000000..cc7df679 --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts @@ -0,0 +1,64 @@ +import { RuleTester } from '@typescript-eslint/rule-tester' + +import { noUselessTailingNulls } from '../index' + +describe('no-useless-tailing-nulls rule', () => { + const ruleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 'latest', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }) + ruleTester.run('no-useless-tailing-nulls rule', noUselessTailingNulls, { + valid: [ + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "other-package";\n', + filename: 'src/app/page.tsx', + }, + ], + invalid: [ + { + code: 'import { Box } from "@devup-ui/react";\n', + output: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessTailingNulls', + }, + ], + }, + { + code: 'import { Box } from "@devup-ui/react";\n', + output: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + errors: [ + { + messageId: 'uselessTailingNulls', + }, + ], + }, + { + code: 'import { css } from "@devup-ui/react";\ncss({w: [1, 2, null, null]})', + output: 'import { css } from "@devup-ui/react";\ncss({w: [1, 2]})', + filename: 'src/app/page.tsx', + errors: [ + { + messageId: 'uselessTailingNulls', + }, + ], + }, + ], + }) +}) diff --git a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts new file mode 100644 index 00000000..0153c6d4 --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts @@ -0,0 +1,25 @@ +import { ESLintUtils } from '@typescript-eslint/utils' + +const createRule = ESLintUtils.RuleCreator( + (name) => + `https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`, +) + +export const noUselessTailingNulls = createRule({ + name: 'no-useless-tailing-nulls', + defaultOptions: [], + meta: { + schema: [], + messages: { + uselessTailingNulls: 'Trailing nulls are useless. Remove them.', + }, + type: 'problem', + fixable: 'code', + docs: { + description: 'No useless tailing nulls.', + }, + }, + create(_context) { + return {} + }, +}) diff --git a/packages/eslint-plugin/tsconfig.json b/packages/eslint-plugin/tsconfig.json new file mode 100644 index 00000000..4c6e75be --- /dev/null +++ b/packages/eslint-plugin/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "types": ["vite/client", "vitest/importMeta", "vitest/globals"], + "strict": true, + "target": "ESNext", + "declaration": true, + "declarationMap": true, + "removeComments": true, + "sourceMap": true, + "useDefineForClassFields": true, + "allowJs": false, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strictFunctionTypes": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "baseUrl": ".", + "jsx": "react-jsx" + } +} diff --git a/packages/eslint-plugin/vite.config.ts b/packages/eslint-plugin/vite.config.ts new file mode 100644 index 00000000..a1d1f0f0 --- /dev/null +++ b/packages/eslint-plugin/vite.config.ts @@ -0,0 +1,63 @@ +import dts from 'vite-plugin-dts' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + coverage: { + all: true, + thresholds: { + '100': true, + }, + }, + }, + plugins: [ + dts({ + entryRoot: 'src', + staticImport: true, + pathsToAliases: false, + exclude: [ + '**/__tests__/**/*', + '**/*.test.(tsx|ts|js|jsx)', + '**/*.test-d.(tsx|ts|js|jsx)', + 'vite.config.ts', + ], + include: ['**/src/**/*.ts'], + copyDtsFiles: true, + compilerOptions: { + isolatedModules: false, + declaration: true, + }, + }) as any, + ], + build: { + rollupOptions: { + onwarn: (warning) => { + if (warning.code === 'MODULE_LEVEL_DIRECTIVE') { + return + } + }, + external: (source) => { + return !(source.includes('src') || source.startsWith('.')) + }, + + output: { + dir: 'dist', + preserveModules: true, + preserveModulesRoot: 'src', + + exports: 'named', + assetFileNames({ name }) { + return name?.replace(/^src\//g, '') ?? '' + }, + }, + }, + lib: { + formats: ['es', 'cjs'], + entry: { + index: 'src/index.ts', + }, + }, + outDir: 'dist', + }, +}) diff --git a/packages/next-plugin/package.json b/packages/next-plugin/package.json index 292a6f4e..29e3e7b7 100644 --- a/packages/next-plugin/package.json +++ b/packages/next-plugin/package.json @@ -46,7 +46,7 @@ "browserslist": "latest" }, "devDependencies": { - "vite": "^7.1.6", + "vite": "^7.1.7", "vite-plugin-dts": "^4.5.4", "vitest": "^3.2.4", "typescript": "^5.9.2", diff --git a/packages/react/package.json b/packages/react/package.json index 55253f0a..1112356a 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "rollup-plugin-preserve-directives": "^0.4.0", - "vite": "^7.1.6", + "vite": "^7.1.7", "vite-plugin-dts": "^4.5.4", "typescript": "^5.9.2", "@types/react": "^19" diff --git a/packages/reset-css/package.json b/packages/reset-css/package.json index 4dabf3a2..e0da71f5 100644 --- a/packages/reset-css/package.json +++ b/packages/reset-css/package.json @@ -43,7 +43,7 @@ }, "devDependencies": { "typescript": "^5.9.2", - "vite": "^7.1.6", + "vite": "^7.1.7", "vite-plugin-dts": "^4.5.4", "rollup-plugin-preserve-directives": "^0.4.0" }, diff --git a/packages/rsbuild-plugin/package.json b/packages/rsbuild-plugin/package.json index 5714c89b..3eef9e6e 100644 --- a/packages/rsbuild-plugin/package.json +++ b/packages/rsbuild-plugin/package.json @@ -56,8 +56,8 @@ "@rsbuild/core": "*" }, "devDependencies": { - "@rsbuild/core": "^1.5.10", - "vite": "^7.1.6", + "@rsbuild/core": "^1.5.12", + "vite": "^7.1.7", "vite-plugin-dts": "^4.5.4", "vitest": "^3.2.4", "typescript": "^5.9.2" diff --git a/packages/webpack-plugin/package.json b/packages/webpack-plugin/package.json index 3c622629..960d2ca8 100644 --- a/packages/webpack-plugin/package.json +++ b/packages/webpack-plugin/package.json @@ -55,7 +55,7 @@ "@devup-ui/wasm": "*" }, "devDependencies": { - "vite": "^7.1.6", + "vite": "^7.1.7", "@types/webpack": "^5.28.5", "vite-plugin-dts": "^4.5.4", "vitest": "^3.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7a28a73..c23adae7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 6.8.0 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@testing-library/user-event': specifier: 14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) @@ -31,34 +31,34 @@ importers: version: 24.5.2 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) eslint: - specifier: ^9.35.0 - version: 9.36.0(jiti@2.5.1) + specifier: ^9.36.0 + version: 9.36.0(jiti@2.6.0) eslint-plugin-devup: specifier: ^2.0.5 - version: 2.0.5(@types/eslint@9.6.1)(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + version: 2.0.5(@types/eslint@9.6.1)(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) eslint-plugin-jsonc: specifier: ^2.20.1 - version: 2.20.1(eslint@9.36.0(jiti@2.5.1)) + version: 2.20.1(eslint@9.36.0(jiti@2.6.0)) eslint-plugin-mdx: specifier: ^3.6.2 - version: 3.6.2(eslint@9.36.0(jiti@2.5.1)) + version: 3.6.2(eslint@9.36.0(jiti@2.6.0)) globals: specifier: ^16.4.0 version: 16.4.0 happy-dom: - specifier: ^18.0.1 - version: 18.0.1 + specifier: ^19.0.1 + version: 19.0.1 husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^16.1.6 - version: 16.1.6 + specifier: ^16.2.3 + version: 16.2.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) apps/landing: dependencies: @@ -78,8 +78,8 @@ importers: specifier: ^3.1.1 version: 3.1.1(@types/react@19.1.13)(react@19.1.1) '@next/mdx': - specifier: ^15.5.3 - version: 15.5.3(@mdx-js/loader@3.1.1(webpack@5.101.3))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1)) + specifier: ^15.5.4 + version: 15.5.4(@mdx-js/loader@3.1.1(webpack@5.101.3))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1)) '@types/mdx': specifier: ^2.0.13 version: 2.0.13 @@ -93,8 +93,8 @@ importers: specifier: 1.3.11 version: 1.3.11(react@19.1.1) next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -145,8 +145,8 @@ importers: specifier: workspace:* version: link:../../packages/react next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -186,11 +186,11 @@ importers: specifier: workspace:* version: link:../../packages/rsbuild-plugin '@rsbuild/core': - specifier: ^1.5.10 - version: 1.5.10 + specifier: ^1.5.12 + version: 1.5.12 '@rsbuild/plugin-react': - specifier: ^1.4.0 - version: 1.4.0(@rsbuild/core@1.5.10) + specifier: ^1.4.1 + version: 1.4.1(@rsbuild/core@1.5.12) apps/vite: dependencies: @@ -220,14 +220,14 @@ importers: specifier: ^19 version: 19.1.9(@types/react@19.1.13) '@vitejs/plugin-react': - specifier: ^5.0.3 - version: 5.0.3(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + specifier: ^5.0.4 + version: 5.0.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) typescript: specifier: ^5 version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) apps/vite-lib: dependencies: @@ -248,17 +248,17 @@ importers: specifier: ^19 version: 19.1.13 '@vitejs/plugin-react': - specifier: ^5.0.3 - version: 5.0.3(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + specifier: ^5.0.4 + version: 5.0.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) typescript: specifier: ^5 version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) benchmark/next-chakra-ui: dependencies: @@ -269,8 +269,8 @@ importers: specifier: ^11.14.0 version: 11.14.0(@types/react@19.1.13)(react@19.1.1) next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -303,8 +303,8 @@ importers: specifier: workspace:* version: link:../../packages/react next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -334,8 +334,8 @@ importers: specifier: workspace:* version: link:../../packages/react next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -363,10 +363,10 @@ importers: dependencies: '@kuma-ui/core': specifier: ^1.5.9 - version: 1.5.9(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.5.9(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -376,7 +376,7 @@ importers: devDependencies: '@kuma-ui/next-plugin': specifier: ^1.3.3 - version: 1.3.3(@babel/core@7.28.4)(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) + version: 1.3.3(@babel/core@7.28.4)(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) '@types/node': specifier: ^24 version: 24.5.2 @@ -402,8 +402,8 @@ importers: specifier: 7.3.2 version: 7.3.2(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react@19.1.1))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -430,8 +430,8 @@ importers: benchmark/next-panda-css: dependencies: next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -440,8 +440,8 @@ importers: version: 19.1.1(react@19.1.1) devDependencies: '@pandacss/dev': - specifier: ^1.3 - version: 1.3.1(typescript@5.9.2) + specifier: ^1.4 + version: 1.4.0(typescript@5.9.2) '@types/node': specifier: ^24 version: 24.5.2 @@ -461,14 +461,14 @@ importers: specifier: ^0.11.1 version: 0.11.1 '@stylexjs/stylex': - specifier: ^0.15.4 - version: 0.15.4 + specifier: ^0.16.0 + version: 0.16.0 bright: specifier: ^1.0.0 version: 1.0.0(react@19.1.1) next: - specifier: 15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -489,32 +489,32 @@ importers: specifier: ^7.27.1 version: 7.27.1(@babel/core@7.28.4) '@stylexjs/babel-plugin': - specifier: ^0.15.4 - version: 0.15.4 + specifier: ^0.16.0 + version: 0.16.0 '@stylexjs/eslint-plugin': - specifier: ^0.15.4 - version: 0.15.4 + specifier: ^0.16.0 + version: 0.16.0 '@stylexjs/nextjs-plugin': specifier: ^0.11.1 - version: 0.11.1(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + version: 0.11.1(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) '@types/node': specifier: 24.5.2 version: 24.5.2 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) '@types/react-test-renderer': specifier: ^19.1.0 version: 19.1.0 eslint: specifier: 9.36.0 - version: 9.36.0(jiti@2.5.1) + version: 9.36.0(jiti@2.6.0) eslint-config-next: - specifier: 15.5.3 - version: 15.5.3(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 15.5.4 + version: 15.5.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -534,8 +534,8 @@ importers: benchmark/next-tailwind: dependencies: next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -574,8 +574,8 @@ importers: specifier: ^1.17.4 version: 1.17.4(babel-plugin-macros@3.1.0) next: - specifier: ^15.5.3 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^15.5.4 + version: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -597,7 +597,7 @@ importers: version: 19.1.9(@types/react@19.1.13) '@vanilla-extract/next-plugin': specifier: ^2.4.14 - version: 2.4.14(babel-plugin-macros@3.1.0)(next@15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(webpack@5.101.3) + version: 2.4.14(babel-plugin-macros@3.1.0)(next@15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(webpack@5.101.3) typescript: specifier: ^5 version: 5.9.2 @@ -623,38 +623,75 @@ importers: specifier: workspace:* version: link:../vite-plugin '@storybook/addon-docs': - specifier: ^9.1.7 - version: 9.1.7(@types/react@19.1.13)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) + specifier: ^9.1.8 + version: 9.1.8(@types/react@19.1.15)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) '@storybook/addon-onboarding': - specifier: ^9.1.7 - version: 9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) + specifier: ^9.1.8 + version: 9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) '@storybook/react-vite': - specifier: ^9.1.7 - version: 9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(rollup@4.51.0)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + specifier: ^9.1.8 + version: 9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(rollup@4.51.0)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@types/react': - specifier: ^19.1.13 - version: 19.1.13 + specifier: ^19.1.15 + version: 19.1.15 eslint-plugin-storybook: - specifier: ^9.1.7 - version: 9.1.7(eslint@9.36.0(jiti@2.5.1))(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2) + specifier: ^9.1.8 + version: 9.1.8(eslint@9.36.0(jiti@2.6.0))(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2) rollup-plugin-preserve-directives: specifier: ^0.4.0 version: 0.4.0(rollup@4.51.0) storybook: - specifier: ^9.1.7 - version: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + specifier: ^9.1.8 + version: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + typescript: + specifier: ^5.9.2 + version: 5.9.2 + vite: + specifier: ^6 + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + + packages/eslint-plugin: + dependencies: + typescript-eslint: + specifier: ^8.44 + version: 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + devDependencies: + '@types/eslint': + specifier: ^9.6 + version: 9.6.1 + '@types/eslint__js': + specifier: ^9.14 + version: 9.14.0 + '@typescript-eslint/rule-tester': + specifier: ^8.44 + version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': + specifier: ^8.44 + version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@vitest/coverage-v8': + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + eslint-plugin-eslint-plugin: + specifier: ^7.0.0 + version: 7.0.0(eslint@9.36.0(jiti@2.6.0)) typescript: specifier: ^5.9.2 version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) packages/next-plugin: dependencies: @@ -666,7 +703,7 @@ importers: version: 4.26.2 next: specifier: ^15.5 - version: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) devDependencies: '@types/webpack': specifier: ^5.28.5 @@ -676,13 +713,13 @@ importers: version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) packages/react: dependencies: @@ -704,10 +741,10 @@ importers: version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) packages/reset-css: dependencies: @@ -723,10 +760,10 @@ importers: version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) packages/rsbuild-plugin: dependencies: @@ -735,20 +772,20 @@ importers: version: link:../../bindings/devup-ui-wasm devDependencies: '@rsbuild/core': - specifier: ^1.5.10 - version: 1.5.10 + specifier: ^1.5.12 + version: 1.5.12 typescript: specifier: ^5.9.2 version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) packages/vite-plugin: dependencies: @@ -757,14 +794,14 @@ importers: version: link:../../bindings/devup-ui-wasm vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) devDependencies: typescript: specifier: ^5.9.2 version: 5.9.2 vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) packages/webpack-plugin: dependencies: @@ -780,13 +817,13 @@ importers: version: 5.9.2 vite: specifier: ^6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) packages: @@ -2257,11 +2294,14 @@ packages: '@next/env@15.5.3': resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} - '@next/eslint-plugin-next@15.5.3': - resolution: {integrity: sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==} + '@next/env@15.5.4': + resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} + + '@next/eslint-plugin-next@15.5.4': + resolution: {integrity: sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==} - '@next/mdx@15.5.3': - resolution: {integrity: sha512-tpD3sdWfAiqjqD1WXL4ZEpxswXdbeoTQjlgvDzbQOxDr37qaAo9bFkpMVb3P3pgAJAQ9Q6w1Yql6YtOsmgZrzg==} + '@next/mdx@15.5.4': + resolution: {integrity: sha512-QUc14KkswCau2/Lul13t13v8QYRiEh3aeyUMUix5mK/Zd8c/J9NQuVvLGhxS7fxGPU+fOcv0GaXqZshkvNaX7A==} peerDependencies: '@mdx-js/loader': '>=0.15.0' '@mdx-js/react': '>=0.15.0' @@ -2277,48 +2317,96 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.5.4': + resolution: {integrity: sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@15.5.3': resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.5.4': + resolution: {integrity: sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@15.5.3': resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@15.5.4': + resolution: {integrity: sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@15.5.3': resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.5.4': + resolution: {integrity: sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@15.5.3': resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@15.5.4': + resolution: {integrity: sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@15.5.3': resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.5.4': + resolution: {integrity: sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@15.5.3': resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.5.4': + resolution: {integrity: sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-x64-msvc@15.5.3': resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.5.4': + resolution: {integrity: sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2359,57 +2447,57 @@ packages: resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} engines: {node: ^16.14.0 || >=18.0.0} - '@pandacss/config@1.3.1': - resolution: {integrity: sha512-Q58Q40JvVyZSruX3jthoJMsUv80Q0g2Aug0Q4OKSaqxLV3MXh3gW8KN0qztVp4kSS+sURShh8qPd6Ucjp5YXPA==} + '@pandacss/config@1.4.0': + resolution: {integrity: sha512-g/9t1V6k44rVqfQvsHBwB6D+GPUYRffHd1dnCh+OXIt/sYofmEwiVVoSmc1C0ohFimyNxMe2aPn7BctIRZWrqg==} - '@pandacss/core@1.3.1': - resolution: {integrity: sha512-NxRnZnz+kftf4iBJwNdoR/cjDIXT7x5f43teQoSDklcB+5CghAoN8Q5xqJS3pQ8PPZDQnB2Ek+sncTWBfITlgg==} + '@pandacss/core@1.4.0': + resolution: {integrity: sha512-BTMFFwaTCOAOxt27OQZwBErECtr4wUc/ZSM8ANi0AWryGJGx0jb4xmKhAu5B85B2zpxt9BkyNs8QC6UOt6DWgA==} - '@pandacss/dev@1.3.1': - resolution: {integrity: sha512-ddoVOsbb39sp6TTZQtrQRBlxsPKJWsnZvr3bKucRXa6xvjUEuWHgA0pP2qmx1XruIj+i4Tj8T2gHzZWhCT9r/g==} + '@pandacss/dev@1.4.0': + resolution: {integrity: sha512-/aS6WQHUjeoa1V+tW/bykZPqJ1jLIWz4gRgkRxCxpaS/ziSdYptZYVmcASsTWVtFamr8uEotB3hZejuLw6B9IA==} hasBin: true - '@pandacss/extractor@1.3.1': - resolution: {integrity: sha512-6UCPexBqvqJ0+He/yOwIZprPoRs/Gpt9n2Whf57NIceozhOpnFsCwrtgOQZLZlx7x9OdKf44g5ZBxM9wvRzCdw==} + '@pandacss/extractor@1.4.0': + resolution: {integrity: sha512-4JBZMyAH9T1HJPtEUQyzZH2GNi/qqCHHUdr+yY0v1BegUJvQgDXp/TNBFZuiGrfxUbd5Up6MqsLwKL3//e+KMg==} - '@pandacss/generator@1.3.1': - resolution: {integrity: sha512-xQQX2NNNVBYYq+wkcY3fk4UVAsAF+Y2YSfsxskLRMkPXFUzESphEv6mOadYQl7sTkxdpUriFYA3jL2Z9aiCb8Q==} + '@pandacss/generator@1.4.0': + resolution: {integrity: sha512-HSZ3LRVTb35lgB6fBrkeU2hil8wTp/mkzQEn0cqiEzlS0dHbilGQrFYmZOjcPZWD/gK2YKcFBuwNISWFZkLiKQ==} '@pandacss/is-valid-prop@0.54.0': resolution: {integrity: sha512-UhRgg1k9VKRCBAHl+XUK3lvN0k9bYifzYGZOqajDid4L1DyU813A1L0ZwN4iV9WX5TX3PfUugqtgG9LnIeFGBQ==} - '@pandacss/is-valid-prop@1.3.1': - resolution: {integrity: sha512-HT4U2GkVsdoESpN21DhzlgN32EfTki7Nd1vddhO4TGw4q0z1oaIuOozMH3/g6fFcN+Jo3fLOX+ZmbToLA/CPXw==} + '@pandacss/is-valid-prop@1.4.0': + resolution: {integrity: sha512-c3FX90/ogkhBEXcjkKdeICM+cg3w4gvJ9Urkoy+Ien+IJNCrPwjesX82k+ystY/teTzMF9B9g4sGAjkkRsd3ug==} - '@pandacss/logger@1.3.1': - resolution: {integrity: sha512-dY7I5+cAwPoYD5WblO9OjKd+RPZy3MUSZEk+fjM6KZsyl0GShdWery2246DxvpKCJnBLcYFp0UZErANt5gkllQ==} + '@pandacss/logger@1.4.0': + resolution: {integrity: sha512-d3FZVyPGIk87uWCMegtiGZSHAI7IA4MC3nUFpkCzBPaJgZfkVSwJjBr8Qz/Hz3S219i66a3vy3UxyCgc7omiHg==} - '@pandacss/node@1.3.1': - resolution: {integrity: sha512-2Qa6fjcpemaIVru4SBbNca5eDqeKOzIlIzXFlrdOOFD4ZWXDVaFqiCX6XeibeoHTHX+ACjtInv0GUrE8RNoCXw==} + '@pandacss/node@1.4.0': + resolution: {integrity: sha512-67axJaUcGDzvCOL5OTbMzSqrxLgM4t3JJNnSFKLeseaCAXqx7G97cJxP/sCXVWXoE47J/O7Sd4xaCQMMu4D2zA==} - '@pandacss/parser@1.3.1': - resolution: {integrity: sha512-vXYaZQD/9h5n/hOr8OCLLvMaY+ng/LchiFqXo5sHaA/fThTMeglipCjuK94rExbJ3PwqNTwcs8zQu0TrOpf/Gg==} + '@pandacss/parser@1.4.0': + resolution: {integrity: sha512-rEOaCI3cgoIs1vqTS8YH3L+Ex8WsW1deGmBo3Hl90mXDcqfkVJxBEAiTzFOCQAYpTUwX+lXzHiCGZQLPvBIFqQ==} - '@pandacss/postcss@1.3.1': - resolution: {integrity: sha512-QuJI31oQMXbtlDPNRENfqVs1VaTTVq6zGOOuz3BDDj++6x165IIEs3KgRmnKPnUNyRHTkQxOMoQZgKQ1wAsU9A==} + '@pandacss/postcss@1.4.0': + resolution: {integrity: sha512-t8BhJeNNV5H5PhqGrA6eER5Yc+Ph45yxZZewZ1YaanuRAWJqBja63x+s4by8aAk6PCe9+czM04BKfafZ3dXZCQ==} - '@pandacss/preset-base@1.3.1': - resolution: {integrity: sha512-3/Q1WlfIrxFLTbRo7Va1EBSgMgDOsvDxill26FWl2CIztKlQtRgeBg4ez8m7LM3elGth6jkTdBTRIry1MXNw1g==} + '@pandacss/preset-base@1.4.0': + resolution: {integrity: sha512-3qo/HdDezCqa6eItZypYiSnm+Sr7SxQtYST4n0UvLYCo3+crvR4q4CwaQG7UNq48abeVIHbN9Ux8kBVP6jFSmA==} - '@pandacss/preset-panda@1.3.1': - resolution: {integrity: sha512-ReLsoXIHIgXLSy0o+trdZpeMwvliL+9lNcpNtlkZrTrzLbrahJwBU0fOeCGxgOemu/3ZfHCTmw2LKWcj942A2w==} + '@pandacss/preset-panda@1.4.0': + resolution: {integrity: sha512-ZumZ7mQBqjpne1GrhqSuIW8/9KY02xI4N8vtD1F8poorVG2JC97QF+5FRtUH8hir7f94xR08G33wTe8qefSP7A==} - '@pandacss/reporter@1.3.1': - resolution: {integrity: sha512-1JovCGuvf+mL86QpIhBVF/s08MeaRwS5FLzoC4Qd0cjlTCE7nrReyfwNhQuMsvKGCPLjZ4OlWl2wpXn0NZ6p8g==} + '@pandacss/reporter@1.4.0': + resolution: {integrity: sha512-ofk6WVhG/nf8t4d7kE9lcLcI0gQDhG8Qedtf+tHncRkVPN9iRpwb2zCXbcg5qjB4q3k5mlTcA+2mj1fLssvnKA==} - '@pandacss/shared@1.3.1': - resolution: {integrity: sha512-B/dVrOpeXbD4RYkdjGoYsvL7YMBQlV/zZ0Vk096a++c0qtgxnIs0nY1scCcL+UeLcKDvCEUF+Q7uzZfDjipPYg==} + '@pandacss/shared@1.4.0': + resolution: {integrity: sha512-84XTuJbsjEvOTQty3MnAQsF0STG54Mwnwhx/pvbvKbXcisLAw/xjn5Z07zo7EBgqbyf3vZxK1+yeIWCwvHhj0g==} - '@pandacss/token-dictionary@1.3.1': - resolution: {integrity: sha512-Y5LgQ+wOZD6fayx4schMBE8YhXJjvGnYxusZrLmTDSLsrvFWigpkAFBog1Tq/1ic0DWRPdjPAqoz1oOjCCAWZA==} + '@pandacss/token-dictionary@1.4.0': + resolution: {integrity: sha512-9hTH1Y3SiXZN0LI5KmLMsT7AZjgvL+JcuOhNTCD5lKOe9Z1sbVDEbQFeg99vm/I99z385w9qOQXw8EfDLlLazQ==} - '@pandacss/types@1.3.1': - resolution: {integrity: sha512-U5r2P36u97KHqJcMSmDb7rWKrrquO+Q0PImKOTVQ/PRZ1bFpVPLYpHEt5KngEYsNM7gU+EuLFuGZuSkkFYUlKw==} + '@pandacss/types@1.4.0': + resolution: {integrity: sha512-lXN3GiPDSjBNXze9LUGEIHtbH8/e/xhb0i4BBDCQAjbt1+My0VHe4OTE1Bg/dD8X2oKAQIB0VsRl4Wf2DRDm7g==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2422,8 +2510,8 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@rolldown/pluginutils@1.0.0-beta.35': - resolution: {integrity: sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==} + '@rolldown/pluginutils@1.0.0-beta.38': + resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} @@ -2539,70 +2627,70 @@ packages: cpu: [x64] os: [win32] - '@rsbuild/core@1.5.10': - resolution: {integrity: sha512-8FDZhtw18XRfCDEZjzt6Xi9ZR+oYpIj7d1AfGX+BVDzLpDCoAHJ/4dWy0ryl8ADssZeezY9JPqKWfTfVJEpc9Q==} + '@rsbuild/core@1.5.12': + resolution: {integrity: sha512-DpinE1If6WRTwQYqH+PRtJo3zshkDYHfIcWq4lTtfsPfPLrXshmRXBam3BS1RRu4v2gGT+LCNiUefftsmcmL0A==} engines: {node: '>=18.12.0'} hasBin: true - '@rsbuild/plugin-react@1.4.0': - resolution: {integrity: sha512-YhhOUOonJBjnKpUf7E4iXKidldPWAGmYBRtDjQgcSmW4tbW0DasFpNCqLn5870Q2Ly6oCU06sLv+8G597I36+w==} + '@rsbuild/plugin-react@1.4.1': + resolution: {integrity: sha512-kahvnfRPQTsG0tReR6h0KuVfyjKJfpv/PoU5qW5SDkON7vmbGn8Jx7l3fI+yU3lR/7qDiAO19QnNjkqxPsFT3Q==} peerDependencies: '@rsbuild/core': 1.x - '@rspack/binding-darwin-arm64@1.5.5': - resolution: {integrity: sha512-Kg3ywEZHLX+aROfTQ5tMOv+Ud+8b4jk8ruUgsi0W8oBkEkR5xBdhFa9vcf6pzy+gfoLCnEI68U9i8ttm+G0csA==} + '@rspack/binding-darwin-arm64@1.5.7': + resolution: {integrity: sha512-prQ/vgJxOPdlYiR4gVeOEKofTCEOu70JQIQApqFnw8lKM7rd9ag8ogDNqmc2L/GGXGHLAqds28oeKXRlzYf7+Q==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.5.5': - resolution: {integrity: sha512-uoGTYnlYW8m47yiDCKvXOehhAOH12wlePJq4sbUbBoHmG07vbDw7fUqnvy2k8319NTVEpMJWGoKyisgI09/uMQ==} + '@rspack/binding-darwin-x64@1.5.7': + resolution: {integrity: sha512-FPqiWSbEEerqfJrGnYe68svvl6NyuQFAb3qqFe/Q0MqFhBYmAZwa0R2/ylugCdgFLZxmkFuWqpDgItpvJb/E3Q==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.5.5': - resolution: {integrity: sha512-KgVN3TeUJ3iNwwOX3JGY4arvoLHX94eItJ4TeOSyetRiSJUrQI0evP16i5kIh+n+p7mVnXmfUS944Gl+uNsJmg==} + '@rspack/binding-linux-arm64-gnu@1.5.7': + resolution: {integrity: sha512-fwy+NY+0CHrZqqzDrjPBlTuK53W4dG5EEg/QQFAE7KVM+okRqPk8tg45bJ5628rCNLe13GDmPIE107LmgspNqA==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.5.5': - resolution: {integrity: sha512-1gKthlCQinXtWar6Hl9Il6BQ/NgYBH0NVuUsjjf85ejD/cTPQENKyIpGvVa1rSIHSfnG/XujUbruHAeY9mEHCA==} + '@rspack/binding-linux-arm64-musl@1.5.7': + resolution: {integrity: sha512-576u/0F4ZUzpHckFme4vQ0sSxjE+B/gVP4tNJ+P6bJaclXLFXV4icbjTUQwOIgmA1EQz/JFeKGGJZ4p6mowpBQ==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.5.5': - resolution: {integrity: sha512-haPFg4M9GwpSI5g9BQhKUNdzCKDvFexIUkLiAHBjFU9iWQTEcI9VfYPixestOIwzUv7E34rHM+jAsmRGWdgmXw==} + '@rspack/binding-linux-x64-gnu@1.5.7': + resolution: {integrity: sha512-brSHywXjjeuWkv0ywgxS4VgDgquarEb4XGr+eXhOaPcc8x2rNefyc4hErplrI7+oxPXVuGK5VE4ZH5bj3Yknvg==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.5.5': - resolution: {integrity: sha512-oUny56JEkCZvIu4n8/P7IPLPNtJnL89EDhxHINH87XLBY3OOgo8JHELR11Zj9SFWiGNsRcLqi+Q78tWa0ligBQ==} + '@rspack/binding-linux-x64-musl@1.5.7': + resolution: {integrity: sha512-HcS0DzbLlWCwVfYcWMbTgILh4GELD6m4CZoFEhIr4fJCJi0p8NgLYycy1QtDhaUjs8TKalmyMwHrJwGnD141JA==} cpu: [x64] os: [linux] - '@rspack/binding-wasm32-wasi@1.5.5': - resolution: {integrity: sha512-tRgxBgIXaBKBH/0KlwvyqbIMqQrg8jKOyFOEQseEE7Oqs2M9KkJ7Vp5QN11u3NvZ9nz5GbZxmVGBMkdj9Gth1w==} + '@rspack/binding-wasm32-wasi@1.5.7': + resolution: {integrity: sha512-uTRUEuK+TVlvUBSWXVoxD+6JTN+rvtRqVlO+A7I7VnOY7p9Rpvk1sXcHtEwg/XuDCq4DALnvlzbFLh7G3zILvw==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.5.5': - resolution: {integrity: sha512-wGWd2yluoFdQgtkIbny6FoHnzahTk+o9RzrptjeS1u/NV1lKrWzmWhwZojMGOUqPiaukZKaziOEo7gpRn2XbEQ==} + '@rspack/binding-win32-arm64-msvc@1.5.7': + resolution: {integrity: sha512-dFHrXRUmMTkxEn/Uw2RLbIckKfi0Zmn2NnEXwedWdyRgZW4Vhk7+VBxM22O/CHZmAGt12Ol25yTuVv58ANLEKA==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.5.5': - resolution: {integrity: sha512-Ikml8AQkzjPCG24vTO4pG2bpJ8vp93jVEgo9X9uYjO2vQbIp5QSOmeZOTM7tXCf8AfTfHEF/yAdE/pR/+tXXGQ==} + '@rspack/binding-win32-ia32-msvc@1.5.7': + resolution: {integrity: sha512-PNtnOIUzE9p/Fbl6l/1Zs7bhn8ccTlaHTgZgQq0sO/QxjLlbU0WPjRl+YLo27cAningSOAbANuYlN8vAcuimrw==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.5.5': - resolution: {integrity: sha512-m2059ms0i/GIQGWTlZ5GI6SWpuMFAPMsWlhXLk2LZRIydhi+N/YPkmc33lFRTlDA3QpKDCvowvCvIIA7g6WSlg==} + '@rspack/binding-win32-x64-msvc@1.5.7': + resolution: {integrity: sha512-22gTaYkwaIUvyXRxf1RVnFTJPqF2hD1pgAQNBIz7kYybe6vvSZ6KInW4WyG4vjYKrJg/cbS4QvtlLn0lYXrdIw==} cpu: [x64] os: [win32] - '@rspack/binding@1.5.5': - resolution: {integrity: sha512-JkB943uBU0lABnKG/jdO+gg3/eeO9CEQMR/1dL6jSU9GTxaNf3XIVc05RhRC7qoVsiXuhSMMFxWyV0hyHxp2bA==} + '@rspack/binding@1.5.7': + resolution: {integrity: sha512-/fFrf4Yu8Tc0yXBw33g2++turdld1MDphLiLg05bx92fOVI1MafocwPvm35e3y1z7CtlQJ2Bmvzhi6APJShKxg==} - '@rspack/core@1.5.5': - resolution: {integrity: sha512-AOIuMktK6X/xHAjJ/0QJ2kbSkILXj641GCPE+EOfWO27ODA8fHPArKbyz5AVGVePV3aUfEo2VFcsNzP67VBEPA==} + '@rspack/core@1.5.7': + resolution: {integrity: sha512-57ey3wafK/g+B9zLdCiIrX3eTK8rFEM3yvxBUb2ro3ZtAaCGm4y7xERcXZJNn4D01pjzzCJ/u1ezpQmsZYLP7A==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -2651,26 +2739,26 @@ packages: '@rushstack/ts-command-line@5.0.3': resolution: {integrity: sha512-bgPhQEqLVv/2hwKLYv/XvsTWNZ9B/+X1zJ7WgQE9rO5oiLzrOZvkIW4pk13yOQBhHyjcND5qMOa6p83t+Z66iQ==} - '@storybook/addon-docs@9.1.7': - resolution: {integrity: sha512-ZwD25QBWOeZS2T/JSHl6iqMx7w2yCxREnZIQaLpyOoGl2mRUk2NHcsGfdXQ4sL0zd7YT7CTfzH5tbwQfLIiEog==} + '@storybook/addon-docs@9.1.8': + resolution: {integrity: sha512-GVrNVEdNRRo6r1hawfgyy6x+HJqPx1oOHm0U0wz0SGAxgS/Xh6SQVZL+RDoh7NpXkNi1GbezVlT931UsHQTyvQ==} peerDependencies: - storybook: ^9.1.7 + storybook: ^9.1.8 - '@storybook/addon-onboarding@9.1.7': - resolution: {integrity: sha512-GCD/5ichFZWlLzEy7YWGL0G2DMZMDU1HXOFODGOgVP7bL3Y7x2eC4tmLN0umzZY2PL5o5go2P2htYhvQI7cLLw==} + '@storybook/addon-onboarding@9.1.8': + resolution: {integrity: sha512-fydnYy2NZ2ZuoIncsN6PdeRUJthFyR8LZchFFrSqy/s9ahWjQ+XRrDevcm9Y6w4d6qTwsgRC3CDPRIJLj/9dgg==} peerDependencies: - storybook: ^9.1.7 + storybook: ^9.1.8 - '@storybook/builder-vite@9.1.7': - resolution: {integrity: sha512-9nflIekC220TSKprN/dDW+tAZSxwkRaq0C6mc5UCgXKjgq4oXditpdwrAcoH0v91RC/bN7LW9Xu5IbvnLNiqLQ==} + '@storybook/builder-vite@9.1.8': + resolution: {integrity: sha512-JjvBag0nM1N51O3VF5++op9Ly5OC8Q+y4PrWLgi2dKhMxJFs8fD9D4PeI/v41PUiQcI0suQxN9BoYoKn2QxUZw==} peerDependencies: - storybook: ^9.1.7 + storybook: ^9.1.8 vite: ^6 - '@storybook/csf-plugin@9.1.7': - resolution: {integrity: sha512-xrPKWt16hBXvyHliuIEzPLvHdRbEe5Oubk/NIPibFVG4cxhEmNxMeHo3uFua3wgtEXyp4UErRWteviNjYSzjUA==} + '@storybook/csf-plugin@9.1.8': + resolution: {integrity: sha512-KnrXPz87bn+8ZGkzFEBc7TT5HkWpR1Xz7ojxPclSvkKxTfzazuaw0JlOQMzJoI1+wHXDAIw/4MIsO8HEiaWyfQ==} peerDependencies: - storybook: ^9.1.7 + storybook: ^9.1.8 '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} @@ -2682,29 +2770,29 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - '@storybook/react-dom-shim@9.1.7': - resolution: {integrity: sha512-ktjCuZ42g3TAF6nMiSdLbJu/EcvC039hYrmVltKpfF7krf+0xHkK3dCuYqSBp5nv3fS+IemrqmzJwREu5BJLuQ==} + '@storybook/react-dom-shim@9.1.8': + resolution: {integrity: sha512-OepccjVZh/KQugTH8/RL2CIyf1g5Lwc5ESC8x8BH3iuYc82WMQBwMJzRI5EofQdirau63NGrqkWCgQASoVreEA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.7 + storybook: ^9.1.8 - '@storybook/react-vite@9.1.7': - resolution: {integrity: sha512-552jMY5eKnP/rWKpcEjyE4ppyGmO+r9IoYNIJQBWA4DpXAQ8NjhsygCFhdDPFGfCxx7+KmfRgOBPcXeywWNgtQ==} + '@storybook/react-vite@9.1.8': + resolution: {integrity: sha512-DIxp76vcelyFOUJupeQEIHXDrSPP6KDXj6Z+Z9thS1HH7JY+OdGtcMLy4fbiD77Zyc8TV9RRZ1D33z2Ot/v9Vw==} engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.7 + storybook: ^9.1.8 vite: ^6 - '@storybook/react@9.1.7': - resolution: {integrity: sha512-GxuA2Eh3LlkEF4HHDKFGP+bqQ1+7VtABVacSXukMu82WV4VAOXhhHEDII8R9AVl2Fbs/iPJnNVj06wnkDeUZhA==} + '@storybook/react@9.1.8': + resolution: {integrity: sha512-EULkwHroJ4IDYcjIBj9VpGhaZ9E5b8LI84hlfBkJ9rnK44a/GrK1yFRIusukO58qTJSh2Y7zfAFKNuiaWh3Sfw==} engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.7 + storybook: ^9.1.8 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: @@ -2713,11 +2801,11 @@ packages: '@stylexjs/babel-plugin@0.11.1': resolution: {integrity: sha512-hQ02pz6VLjr/yC21NyVu5Lv1djQNiYkUI/vGAawv/TYly8SGI/N2ba7ea6E7vtkdE5K4idh8o3EhY2IA28xzsg==} - '@stylexjs/babel-plugin@0.15.4': - resolution: {integrity: sha512-QfL2j3VCU+KTyIEoPBhdwq8KW1Gv0FVvwSzfjjdQ0J2Ei/DJBx2AXVsDYzBcVw0WI+KsEfQUHFZ1Fk2t1U/9Iw==} + '@stylexjs/babel-plugin@0.16.0': + resolution: {integrity: sha512-GCmhsrjJtsa222e+iiySXtQhWUVvVxkVehjeghvl0z+ibMuJhaeUUpXRWqsR8vn5BWHmuA1QJoFng1hYqlV+Kw==} - '@stylexjs/eslint-plugin@0.15.4': - resolution: {integrity: sha512-P33h+QdudEI3oSzIvVXhNHeAfbUzG4xGYW7tt4hdMizAl+bwIj58+8TK7fxQPV01yBMMNGrBlA/aCmzfQOP8Gw==} + '@stylexjs/eslint-plugin@0.16.0': + resolution: {integrity: sha512-Ci9qzHQFJbcCnsV9qMoYP8f4DoVpAeArIYBMu/HCo9OL9J0DP2KN1pJGXAje34DXRAzDxT1qujuKgX7fTCyU8Q==} '@stylexjs/nextjs-plugin@0.11.1': resolution: {integrity: sha512-42mJGw9W3i9cRrChv25JCMGvWhCVVcmt1EqgOgRMy3XTH45Ehd9TkwDiVmhknvSEDKxw+ib3AiSPjZ1ehZ9d6A==} @@ -2736,8 +2824,8 @@ packages: '@stylexjs/stylex@0.11.1': resolution: {integrity: sha512-1OofsiCP2DYV+Cw/iIuHYTAJRy34TtxQt0FDuQGTnNH915hb6NkPmX6iPa++9t4KP3HWR9oVRmAHkpP58BIYbw==} - '@stylexjs/stylex@0.15.4': - resolution: {integrity: sha512-UQT75p3qxwCIsVpH87YfgHvzWGDyMbQcFKhguj4noBZCc+npEh5h7J4BIHMgrxpyJa9mislLfXv+M5TmP2YH5A==} + '@stylexjs/stylex@0.16.0': + resolution: {integrity: sha512-IWwucXiK8LN9i6DenRS+aAJp9zLez0/2NGu5rkobMuoReCrhjnRLwJGzSxIBPkcGSitVyg5f7IRDNzr4RyuGCw==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -2918,6 +3006,10 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/eslint__js@9.14.0': + resolution: {integrity: sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==} + deprecated: This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed. + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -2988,6 +3080,9 @@ packages: '@types/react@19.1.13': resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} + '@types/react@19.1.15': + resolution: {integrity: sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==} + '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -3024,22 +3119,51 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.44.1': + resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.44.0': resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.44.1': + resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/rule-tester@8.44.1': + resolution: {integrity: sha512-yzqJhTLrbXCdEZhO9cuasGLZixWWx11/uFn6Leuu0p1PeW97wDy9JhiaAOl45TFrv5f67qwWdrzM5PMIuIu4vw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/scope-manager@8.44.0': resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.44.1': + resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.44.0': resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.44.0': resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3051,12 +3175,22 @@ packages: resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.44.0': resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.44.1': + resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.44.0': resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3064,10 +3198,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.44.1': + resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.44.0': resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.44.1': + resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -3188,8 +3333,8 @@ packages: peerDependencies: webpack: ^4.30.0 || ^5.20.2 - '@vitejs/plugin-react@5.0.3': - resolution: {integrity: sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg==} + '@vitejs/plugin-react@5.0.4': + resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^6 @@ -3850,10 +3995,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -4275,8 +4416,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-next@15.5.3: - resolution: {integrity: sha512-e6j+QhQFOr5pfsc8VJbuTD9xTXJaRvMHYjEeLPA2pFkheNlgPLCkxdvhxhfuM4KGcqSZj2qEnpHisdTVs3BxuQ==} + eslint-config-next@15.5.4: + resolution: {integrity: sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -4353,6 +4494,12 @@ packages: peerDependencies: eslint: '*' + eslint-plugin-eslint-plugin@7.0.0: + resolution: {integrity: sha512-EgiW9zf4PbqA+yN9T6Z8bHx46+fWtAIXFrYkL4nSTnI84LnTKmzjh+cIJaVAyFVZveKUSG8LcVe1suGG78qZPw==} + engines: {node: ^20.19.0 || ^22.13.1 || >=24.0.0} + peerDependencies: + eslint: '>=9.0.0' + eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} @@ -4412,12 +4559,12 @@ packages: peerDependencies: eslint: '>=5.0.0' - eslint-plugin-storybook@9.1.7: - resolution: {integrity: sha512-Bq9VNutFGX7T0jw7luWt5eEyRFInIsE0+FSaXdayqBNW6NPaGuE+hoBhhTowvohNqEqn5DXwIkPHiI1GhONE9g==} + eslint-plugin-storybook@9.1.8: + resolution: {integrity: sha512-mEn5EVc7DAEvuwKMqUrIYUFZQJiQD3i5egLi1UJERQm91mDOMr5RdC4hjUF3tNE+WxQYD7QzH2j1qf36ML7V3g==} engines: {node: '>=20.0.0'} peerDependencies: eslint: '>=8' - storybook: ^9.1.7 + storybook: ^9.1.8 eslint-plugin-unused-imports@4.2.0: resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} @@ -4737,8 +4884,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - happy-dom@18.0.1: - resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} + happy-dom@19.0.1: + resolution: {integrity: sha512-Rr1H/mvgdCGoIq+jjaGxE/y+ZB+O2DhUBXk9vqoRVc5zsZ/Ne6Fssb8fXaAjPFh3Ajmbx+kfDDf946PHiUbC6Q==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -5100,6 +5247,10 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + jiti@2.6.0: + resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -5326,10 +5477,6 @@ packages: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -5337,8 +5484,8 @@ packages: resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lint-staged@16.1.6: - resolution: {integrity: sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==} + lint-staged@16.2.3: + resolution: {integrity: sha512-1OnJEESB9zZqsp61XHH2fvpS1es3hRCxMplF/AJUDa8Ho8VrscYDIuxGrj3m8KPXbcWZ8fT9XTMUhEQmOVKpKw==} engines: {node: '>=20.17'} hasBin: true @@ -5749,6 +5896,27 @@ packages: sass: optional: true + next@15.5.4: + resolution: {integrity: sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + node-eval@2.0.0: resolution: {integrity: sha512-Ap+L9HznXAVeJj3TJ1op6M6bg5xtTq8L5CU/PJxtkhea/DrIxdTknGKIECKd/v/Lgql95iuMAYvIzBNd0pmcMg==} engines: {node: '>= 4'} @@ -6527,8 +6695,8 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - storybook@9.1.7: - resolution: {integrity: sha512-X8YSQMNuqV9DklQLZH6mLKpDn15Z5tuUUTAIYsiGqx5BwsjtXnv5K04fXgl3jqTZyUauzV/ii8KdT04NVLtMwQ==} + storybook@9.1.8: + resolution: {integrity: sha512-/iP+DvieJ6Mnixy4PFY/KXnhsg/IHIDlTbZqly3EDbveuhsCuIUELfGnj+QSRGf9C6v/f4sZf9sZ3r80ZnKuEA==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -8450,9 +8618,9 @@ snapshots: '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.6.0))': dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -8643,12 +8811,12 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: glob: 10.4.5 magic-string: 0.30.19 react-docgen-typescript: 2.4.0(typescript@5.9.2) - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) optionalDependencies: typescript: 5.9.2 @@ -8676,10 +8844,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kuma-ui/babel-plugin@1.2.3(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@kuma-ui/babel-plugin@1.2.3(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': dependencies: '@babel/core': 7.28.4 - '@kuma-ui/core': 1.5.9(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@kuma-ui/core': 1.5.9(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@kuma-ui/sheet': 1.3.1 '@kuma-ui/system': 1.7.6 transitivePeerDependencies: @@ -8688,11 +8856,11 @@ snapshots: - react - supports-color - '@kuma-ui/compiler@1.3.3(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@kuma-ui/compiler@1.3.3(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': dependencies: '@babel/core': 7.28.4 - '@kuma-ui/babel-plugin': 1.2.3(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) - '@kuma-ui/core': 1.5.9(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@kuma-ui/babel-plugin': 1.2.3(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@kuma-ui/core': 1.5.9(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@kuma-ui/sheet': 1.3.1 '@kuma-ui/system': 1.7.6 '@kuma-ui/wasm': 1.0.3 @@ -8703,7 +8871,7 @@ snapshots: - react - supports-color - '@kuma-ui/core@1.5.9(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@kuma-ui/core@1.5.9(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': dependencies: '@kuma-ui/sheet': 1.3.1 '@kuma-ui/system': 1.7.6 @@ -8712,18 +8880,18 @@ snapshots: stylis: 4.3.6 optionalDependencies: '@types/react': 19.1.13 - next: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@kuma-ui/next-plugin@1.3.3(@babel/core@7.28.4)(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': + '@kuma-ui/next-plugin@1.3.3(@babel/core@7.28.4)(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': dependencies: '@babel/preset-env': 7.28.3(@babel/core@7.28.4) '@babel/preset-react': 7.27.1(@babel/core@7.28.4) '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@kuma-ui/core': 1.5.9(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) - '@kuma-ui/webpack-plugin': 1.4.3(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) + '@kuma-ui/core': 1.5.9(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@kuma-ui/webpack-plugin': 1.4.3(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) babel-loader: 9.2.1(@babel/core@7.28.4)(webpack@5.101.3) browserslist: 4.21.5 - next: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 webpack: 5.101.3 optionalDependencies: @@ -8743,9 +8911,9 @@ snapshots: '@kuma-ui/wasm@1.0.3': {} - '@kuma-ui/webpack-plugin@1.4.3(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': + '@kuma-ui/webpack-plugin@1.4.3(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': dependencies: - '@kuma-ui/compiler': 1.3.3(@types/react@19.1.13)(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + '@kuma-ui/compiler': 1.3.3(@types/react@19.1.13)(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@kuma-ui/sheet': 1.3.1 '@kuma-ui/system': 1.7.6 esbuild: 0.18.20 @@ -8818,6 +8986,12 @@ snapshots: '@types/react': 19.1.13 react: 19.1.1 + '@mdx-js/react@3.1.1(@types/react@19.1.15)(react@19.1.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.1.15 + react: 19.1.1 + '@microsoft/api-extractor-model@7.30.7(@types/node@24.5.2)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -8973,11 +9147,13 @@ snapshots: '@next/env@15.5.3': {} - '@next/eslint-plugin-next@15.5.3': + '@next/env@15.5.4': {} + + '@next/eslint-plugin-next@15.5.4': dependencies: fast-glob: 3.3.1 - '@next/mdx@15.5.3(@mdx-js/loader@3.1.1(webpack@5.101.3))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))': + '@next/mdx@15.5.4(@mdx-js/loader@3.1.1(webpack@5.101.3))(@mdx-js/react@3.1.1(@types/react@19.1.13)(react@19.1.1))': dependencies: source-map: 0.7.6 optionalDependencies: @@ -8987,27 +9163,51 @@ snapshots: '@next/swc-darwin-arm64@15.5.3': optional: true + '@next/swc-darwin-arm64@15.5.4': + optional: true + '@next/swc-darwin-x64@15.5.3': optional: true + '@next/swc-darwin-x64@15.5.4': + optional: true + '@next/swc-linux-arm64-gnu@15.5.3': optional: true + '@next/swc-linux-arm64-gnu@15.5.4': + optional: true + '@next/swc-linux-arm64-musl@15.5.3': optional: true + '@next/swc-linux-arm64-musl@15.5.4': + optional: true + '@next/swc-linux-x64-gnu@15.5.3': optional: true + '@next/swc-linux-x64-gnu@15.5.4': + optional: true + '@next/swc-linux-x64-musl@15.5.3': optional: true + '@next/swc-linux-x64-musl@15.5.4': + optional: true + '@next/swc-win32-arm64-msvc@15.5.3': optional: true + '@next/swc-win32-arm64-msvc@15.5.4': + optional: true + '@next/swc-win32-x64-msvc@15.5.3': optional: true + '@next/swc-win32-x64-msvc@15.5.4': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9074,27 +9274,27 @@ snapshots: dependencies: which: 4.0.0 - '@pandacss/config@1.3.1': + '@pandacss/config@1.4.0': dependencies: - '@pandacss/logger': 1.3.1 - '@pandacss/preset-base': 1.3.1 - '@pandacss/preset-panda': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/logger': 1.4.0 + '@pandacss/preset-base': 1.4.0 + '@pandacss/preset-panda': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/types': 1.4.0 bundle-n-require: 1.1.2 escalade: 3.1.2 merge-anything: 5.1.7 microdiff: 1.3.2 typescript: 5.8.3 - '@pandacss/core@1.3.1': + '@pandacss/core@1.4.0': dependencies: '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.4.49) - '@pandacss/is-valid-prop': 1.3.1 - '@pandacss/logger': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/token-dictionary': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/is-valid-prop': 1.4.0 + '@pandacss/logger': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/token-dictionary': 1.4.0 + '@pandacss/types': 1.4.0 browserslist: 4.23.3 hookable: 5.5.3 lightningcss: 1.25.1 @@ -9110,39 +9310,39 @@ snapshots: postcss-selector-parser: 6.1.2 ts-pattern: 5.8.0 - '@pandacss/dev@1.3.1(typescript@5.9.2)': + '@pandacss/dev@1.4.0(typescript@5.9.2)': dependencies: '@clack/prompts': 0.9.1 - '@pandacss/config': 1.3.1 - '@pandacss/logger': 1.3.1 - '@pandacss/node': 1.3.1(typescript@5.9.2) - '@pandacss/postcss': 1.3.1(typescript@5.9.2) - '@pandacss/preset-panda': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/token-dictionary': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/config': 1.4.0 + '@pandacss/logger': 1.4.0 + '@pandacss/node': 1.4.0(typescript@5.9.2) + '@pandacss/postcss': 1.4.0(typescript@5.9.2) + '@pandacss/preset-panda': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/token-dictionary': 1.4.0 + '@pandacss/types': 1.4.0 cac: 6.7.14 transitivePeerDependencies: - jsdom - typescript - '@pandacss/extractor@1.3.1(typescript@5.9.2)': + '@pandacss/extractor@1.4.0(typescript@5.9.2)': dependencies: - '@pandacss/shared': 1.3.1 + '@pandacss/shared': 1.4.0 ts-evaluator: 1.2.0(typescript@5.9.2) ts-morph: 26.0.0 transitivePeerDependencies: - jsdom - typescript - '@pandacss/generator@1.3.1': + '@pandacss/generator@1.4.0': dependencies: - '@pandacss/core': 1.3.1 - '@pandacss/is-valid-prop': 1.3.1 - '@pandacss/logger': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/token-dictionary': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/core': 1.4.0 + '@pandacss/is-valid-prop': 1.4.0 + '@pandacss/logger': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/token-dictionary': 1.4.0 + '@pandacss/types': 1.4.0 javascript-stringify: 2.1.0 outdent: 0.8.0 pluralize: 8.0.0 @@ -9151,24 +9351,24 @@ snapshots: '@pandacss/is-valid-prop@0.54.0': {} - '@pandacss/is-valid-prop@1.3.1': {} + '@pandacss/is-valid-prop@1.4.0': {} - '@pandacss/logger@1.3.1': + '@pandacss/logger@1.4.0': dependencies: - '@pandacss/types': 1.3.1 + '@pandacss/types': 1.4.0 kleur: 4.1.5 - '@pandacss/node@1.3.1(typescript@5.9.2)': - dependencies: - '@pandacss/config': 1.3.1 - '@pandacss/core': 1.3.1 - '@pandacss/generator': 1.3.1 - '@pandacss/logger': 1.3.1 - '@pandacss/parser': 1.3.1(typescript@5.9.2) - '@pandacss/reporter': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/token-dictionary': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/node@1.4.0(typescript@5.9.2)': + dependencies: + '@pandacss/config': 1.4.0 + '@pandacss/core': 1.4.0 + '@pandacss/generator': 1.4.0 + '@pandacss/logger': 1.4.0 + '@pandacss/parser': 1.4.0(typescript@5.9.2) + '@pandacss/reporter': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/token-dictionary': 1.4.0 + '@pandacss/types': 1.4.0 browserslist: 4.23.3 chokidar: 4.0.3 fast-glob: 3.3.3 @@ -9192,14 +9392,14 @@ snapshots: - jsdom - typescript - '@pandacss/parser@1.3.1(typescript@5.9.2)': + '@pandacss/parser@1.4.0(typescript@5.9.2)': dependencies: - '@pandacss/config': 1.3.1 - '@pandacss/core': 1.3.1 - '@pandacss/extractor': 1.3.1(typescript@5.9.2) - '@pandacss/logger': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/config': 1.4.0 + '@pandacss/core': 1.4.0 + '@pandacss/extractor': 1.4.0(typescript@5.9.2) + '@pandacss/logger': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/types': 1.4.0 '@vue/compiler-sfc': 3.4.19 magic-string: 0.30.17 ts-morph: 26.0.0 @@ -9208,42 +9408,42 @@ snapshots: - jsdom - typescript - '@pandacss/postcss@1.3.1(typescript@5.9.2)': + '@pandacss/postcss@1.4.0(typescript@5.9.2)': dependencies: - '@pandacss/node': 1.3.1(typescript@5.9.2) + '@pandacss/node': 1.4.0(typescript@5.9.2) postcss: 8.4.49 transitivePeerDependencies: - jsdom - typescript - '@pandacss/preset-base@1.3.1': + '@pandacss/preset-base@1.4.0': dependencies: - '@pandacss/types': 1.3.1 + '@pandacss/types': 1.4.0 - '@pandacss/preset-panda@1.3.1': + '@pandacss/preset-panda@1.4.0': dependencies: - '@pandacss/types': 1.3.1 + '@pandacss/types': 1.4.0 - '@pandacss/reporter@1.3.1': + '@pandacss/reporter@1.4.0': dependencies: - '@pandacss/core': 1.3.1 - '@pandacss/generator': 1.3.1 - '@pandacss/logger': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/core': 1.4.0 + '@pandacss/generator': 1.4.0 + '@pandacss/logger': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/types': 1.4.0 table: 6.9.0 wordwrapjs: 5.1.0 - '@pandacss/shared@1.3.1': {} + '@pandacss/shared@1.4.0': {} - '@pandacss/token-dictionary@1.3.1': + '@pandacss/token-dictionary@1.4.0': dependencies: - '@pandacss/logger': 1.3.1 - '@pandacss/shared': 1.3.1 - '@pandacss/types': 1.3.1 + '@pandacss/logger': 1.4.0 + '@pandacss/shared': 1.4.0 + '@pandacss/types': 1.4.0 ts-pattern: 5.8.0 - '@pandacss/types@1.3.1': {} + '@pandacss/types@1.4.0': {} '@pkgjs/parseargs@0.11.0': optional: true @@ -9252,7 +9452,7 @@ snapshots: '@popperjs/core@2.11.8': {} - '@rolldown/pluginutils@1.0.0-beta.35': {} + '@rolldown/pluginutils@1.0.0-beta.38': {} '@rollup/pluginutils@5.3.0(rollup@4.51.0)': dependencies: @@ -9325,71 +9525,71 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.51.0': optional: true - '@rsbuild/core@1.5.10': + '@rsbuild/core@1.5.12': dependencies: - '@rspack/core': 1.5.5(@swc/helpers@0.5.17) + '@rspack/core': 1.5.7(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 core-js: 3.45.1 - jiti: 2.5.1 + jiti: 2.6.0 - '@rsbuild/plugin-react@1.4.0(@rsbuild/core@1.5.10)': + '@rsbuild/plugin-react@1.4.1(@rsbuild/core@1.5.12)': dependencies: - '@rsbuild/core': 1.5.10 + '@rsbuild/core': 1.5.12 '@rspack/plugin-react-refresh': 1.5.1(react-refresh@0.17.0) react-refresh: 0.17.0 transitivePeerDependencies: - webpack-hot-middleware - '@rspack/binding-darwin-arm64@1.5.5': + '@rspack/binding-darwin-arm64@1.5.7': optional: true - '@rspack/binding-darwin-x64@1.5.5': + '@rspack/binding-darwin-x64@1.5.7': optional: true - '@rspack/binding-linux-arm64-gnu@1.5.5': + '@rspack/binding-linux-arm64-gnu@1.5.7': optional: true - '@rspack/binding-linux-arm64-musl@1.5.5': + '@rspack/binding-linux-arm64-musl@1.5.7': optional: true - '@rspack/binding-linux-x64-gnu@1.5.5': + '@rspack/binding-linux-x64-gnu@1.5.7': optional: true - '@rspack/binding-linux-x64-musl@1.5.5': + '@rspack/binding-linux-x64-musl@1.5.7': optional: true - '@rspack/binding-wasm32-wasi@1.5.5': + '@rspack/binding-wasm32-wasi@1.5.7': dependencies: '@napi-rs/wasm-runtime': 1.0.5 optional: true - '@rspack/binding-win32-arm64-msvc@1.5.5': + '@rspack/binding-win32-arm64-msvc@1.5.7': optional: true - '@rspack/binding-win32-ia32-msvc@1.5.5': + '@rspack/binding-win32-ia32-msvc@1.5.7': optional: true - '@rspack/binding-win32-x64-msvc@1.5.5': + '@rspack/binding-win32-x64-msvc@1.5.7': optional: true - '@rspack/binding@1.5.5': + '@rspack/binding@1.5.7': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.5.5 - '@rspack/binding-darwin-x64': 1.5.5 - '@rspack/binding-linux-arm64-gnu': 1.5.5 - '@rspack/binding-linux-arm64-musl': 1.5.5 - '@rspack/binding-linux-x64-gnu': 1.5.5 - '@rspack/binding-linux-x64-musl': 1.5.5 - '@rspack/binding-wasm32-wasi': 1.5.5 - '@rspack/binding-win32-arm64-msvc': 1.5.5 - '@rspack/binding-win32-ia32-msvc': 1.5.5 - '@rspack/binding-win32-x64-msvc': 1.5.5 - - '@rspack/core@1.5.5(@swc/helpers@0.5.17)': + '@rspack/binding-darwin-arm64': 1.5.7 + '@rspack/binding-darwin-x64': 1.5.7 + '@rspack/binding-linux-arm64-gnu': 1.5.7 + '@rspack/binding-linux-arm64-musl': 1.5.7 + '@rspack/binding-linux-x64-gnu': 1.5.7 + '@rspack/binding-linux-x64-musl': 1.5.7 + '@rspack/binding-wasm32-wasi': 1.5.7 + '@rspack/binding-win32-arm64-msvc': 1.5.7 + '@rspack/binding-win32-ia32-msvc': 1.5.7 + '@rspack/binding-win32-x64-msvc': 1.5.7 + + '@rspack/core@1.5.7(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.18.0 - '@rspack/binding': 1.5.5 + '@rspack/binding': 1.5.7 '@rspack/lite-tapable': 1.0.1 optionalDependencies: '@swc/helpers': 0.5.17 @@ -9440,33 +9640,33 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@storybook/addon-docs@9.1.7(@types/react@19.1.13)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': + '@storybook/addon-docs@9.1.8(@types/react@19.1.15)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.1.13)(react@19.1.1) - '@storybook/csf-plugin': 9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) + '@mdx-js/react': 3.1.1(@types/react@19.1.15)(react@19.1.1) + '@storybook/csf-plugin': 9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) '@storybook/icons': 1.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@storybook/react-dom-shim': 9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) + '@storybook/react-dom-shim': 9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-onboarding@9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': + '@storybook/addon-onboarding@9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': dependencies: - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) - '@storybook/builder-vite@9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@storybook/builder-vite@9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@storybook/csf-plugin': 9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@storybook/csf-plugin': 9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) ts-dedent: 2.2.0 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) - '@storybook/csf-plugin@9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': + '@storybook/csf-plugin@9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': dependencies: - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -9476,39 +9676,39 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@storybook/react-dom-shim@9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': + '@storybook/react-dom-shim@9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))': dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) - '@storybook/react-vite@9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(rollup@4.51.0)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@storybook/react-vite@9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(rollup@4.51.0)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@rollup/pluginutils': 5.3.0(rollup@4.51.0) - '@storybook/builder-vite': 9.1.7(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) - '@storybook/react': 9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2) + '@storybook/builder-vite': 9.1.8(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@storybook/react': 9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2) find-up: 7.0.0 magic-string: 0.30.19 react: 19.1.1 react-docgen: 8.0.1 react-dom: 19.1.1(react@19.1.1) resolve: 1.22.10 - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) tsconfig-paths: 4.2.0 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2)': + '@storybook/react@9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) + '@storybook/react-dom-shim': 9.1.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) optionalDependencies: typescript: 5.9.2 @@ -9524,31 +9724,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@stylexjs/babel-plugin@0.15.4': + '@stylexjs/babel-plugin@0.16.0': dependencies: '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 '@dual-bundle/import-meta-resolve': 4.2.1 - '@stylexjs/stylex': 0.15.4 + '@stylexjs/stylex': 0.16.0 postcss-value-parser: 4.2.0 transitivePeerDependencies: - supports-color - '@stylexjs/eslint-plugin@0.15.4': + '@stylexjs/eslint-plugin@0.16.0': dependencies: css-shorthand-expand: 1.2.0 micromatch: 4.0.8 + postcss-value-parser: 4.2.0 - '@stylexjs/nextjs-plugin@0.11.1(next@15.5.3(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': + '@stylexjs/nextjs-plugin@0.11.1(next@15.5.4(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) '@stylexjs/babel-plugin': 0.11.1 - next: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) transitivePeerDependencies: - supports-color @@ -9566,7 +9767,7 @@ snapshots: invariant: 2.2.4 styleq: 0.2.1 - '@stylexjs/stylex@0.15.4': + '@stylexjs/stylex@0.16.0': dependencies: css-mediaquery: 0.1.2 invariant: 2.2.4 @@ -9652,10 +9853,10 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.13 - '@tanstack/eslint-plugin-query@5.89.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@tanstack/eslint-plugin-query@5.89.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: - '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) transitivePeerDependencies: - supports-color - typescript @@ -9680,15 +9881,15 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -9765,6 +9966,10 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 + '@types/eslint__js@9.14.0': + dependencies: + '@eslint/js': 9.36.0 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -9817,13 +10022,17 @@ snapshots: dependencies: '@types/react': 19.1.13 + '@types/react-dom@19.1.9(@types/react@19.1.15)': + dependencies: + '@types/react': 19.1.15 + '@types/react-syntax-highlighter@15.5.13': dependencies: '@types/react': 19.1.13 '@types/react-test-renderer@19.1.0': dependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 '@types/react-transition-group@4.4.12(@types/react@19.1.13)': dependencies: @@ -9833,6 +10042,10 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/react@19.1.15': + dependencies: + csstype: 3.1.3 + '@types/resolve@1.20.6': {} '@types/stylis@4.2.7': {} @@ -9856,15 +10069,15 @@ snapshots: '@types/whatwg-mimetype@3.0.2': {} - '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.44.0 - '@typescript-eslint/type-utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.44.0 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9873,14 +10086,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/type-utils': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + eslint: 9.36.0(jiti@2.6.0) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + optional: true + + '@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.44.0 '@typescript-eslint/types': 8.44.0 '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.44.0 debug: 4.4.3 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3 + eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9888,28 +10131,60 @@ snapshots: '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) - '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/types': 8.44.1 + debug: 4.4.3 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/rule-tester@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + ajv: 6.12.6 + eslint: 9.36.0(jiti@2.6.0) + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/scope-manager@8.44.0': dependencies: '@typescript-eslint/types': 8.44.0 '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/scope-manager@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.44.0 '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) debug: 4.4.3 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -9917,6 +10192,8 @@ snapshots: '@typescript-eslint/types@8.44.0': {} + '@typescript-eslint/types@8.44.1': {} + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) @@ -9933,13 +10210,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/visitor-keys': 8.44.1 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) '@typescript-eslint/scope-manager': 8.44.0 '@typescript-eslint/types': 8.44.0 '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@typescript-eslint/scope-manager': 8.44.1 + '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9949,6 +10253,11 @@ snapshots: '@typescript-eslint/types': 8.44.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.44.1': + dependencies: + '@typescript-eslint/types': 8.44.1 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -10049,10 +10358,10 @@ snapshots: - babel-plugin-macros - supports-color - '@vanilla-extract/next-plugin@2.4.14(babel-plugin-macros@3.1.0)(next@15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(webpack@5.101.3)': + '@vanilla-extract/next-plugin@2.4.14(babel-plugin-macros@3.1.0)(next@15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(webpack@5.101.3)': dependencies: '@vanilla-extract/webpack-plugin': 2.3.22(babel-plugin-macros@3.1.0)(webpack@5.101.3) - next: 15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -10071,19 +10380,19 @@ snapshots: - babel-plugin-macros - supports-color - '@vitejs/plugin-react@5.0.3(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) - '@rolldown/pluginutils': 1.0.0-beta.35 + '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -10098,7 +10407,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -10110,13 +10419,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -11140,8 +11449,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} - character-entities-html4@2.1.0: {} character-entities-legacy@1.1.4: {} @@ -11614,24 +11921,24 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.6.5(eslint@9.36.0(jiti@2.5.1)): + eslint-compat-utils@0.6.5(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) semver: 7.7.2 - eslint-config-next@15.5.3(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): + eslint-config-next@15.5.4(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@next/eslint-plugin-next': 15.5.3 + '@next/eslint-plugin-next': 15.5.4 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.6.0)) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -11639,9 +11946,9 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)): + eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) eslint-import-resolver-node@0.3.9: dependencies: @@ -11651,32 +11958,32 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.5.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.0)) transitivePeerDependencies: - supports-color - eslint-json-compat-utils@0.2.1(eslint@9.36.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.1): + eslint-json-compat-utils@0.2.1(eslint@9.36.0(jiti@2.6.0))(jsonc-eslint-parser@2.4.1): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) esquery: 1.6.0 jsonc-eslint-parser: 2.4.1 - eslint-mdx@3.6.2(eslint@9.36.0(jiti@2.5.1)): + eslint-mdx@3.6.2(eslint@9.36.0(jiti@2.6.0)): dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) espree: 10.4.0 estree-util-visit: 2.0.0 remark-mdx: 3.1.1 @@ -11692,37 +11999,43 @@ snapshots: - bluebird - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.36.0(jiti@2.6.0)) transitivePeerDependencies: - supports-color - eslint-plugin-devup@2.0.5(@types/eslint@9.6.1)(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): + eslint-plugin-devup@2.0.5(@types/eslint@9.6.1)(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: '@eslint/js': 9.35.0 - '@tanstack/eslint-plugin-query': 5.89.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) - eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-prettier: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(prettier@3.6.2) - eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.36.0(jiti@2.5.1)) - eslint-plugin-unused-imports: 4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)) + '@tanstack/eslint-plugin-query': 5.89.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) + eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-prettier: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2) + eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-unused-imports: 4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)) prettier: 3.6.2 - typescript-eslint: 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + typescript-eslint: 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) transitivePeerDependencies: - '@types/eslint' - '@typescript-eslint/eslint-plugin' - supports-color - typescript - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-eslint-plugin@7.0.0(eslint@9.36.0(jiti@2.6.0)): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + eslint: 9.36.0(jiti@2.6.0) + estraverse: 5.3.0 + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11731,9 +12044,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.36.0(jiti@2.6.0)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11745,18 +12058,18 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsonc@2.20.1(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-jsonc@2.20.1(eslint@9.36.0(jiti@2.6.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) - eslint: 9.36.0(jiti@2.5.1) - eslint-compat-utils: 0.6.5(eslint@9.36.0(jiti@2.5.1)) - eslint-json-compat-utils: 0.2.1(eslint@9.36.0(jiti@2.5.1))(jsonc-eslint-parser@2.4.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + eslint: 9.36.0(jiti@2.6.0) + eslint-compat-utils: 0.6.5(eslint@9.36.0(jiti@2.6.0)) + eslint-json-compat-utils: 0.2.1(eslint@9.36.0(jiti@2.6.0))(jsonc-eslint-parser@2.4.1) espree: 10.4.0 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.1 @@ -11765,7 +12078,7 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-jsx-a11y@6.10.2(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.36.0(jiti@2.6.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -11775,7 +12088,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -11784,10 +12097,10 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-mdx@3.6.2(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-mdx@3.6.2(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.5.1) - eslint-mdx: 3.6.2(eslint@9.36.0(jiti@2.5.1)) + eslint: 9.36.0(jiti@2.6.0) + eslint-mdx: 3.6.2(eslint@9.36.0(jiti@2.6.0)) mdast-util-from-markdown: 2.0.2 mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -11802,21 +12115,21 @@ snapshots: - remark-lint-file-extension - supports-color - eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.5.1)) + eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-react-hooks@5.2.0(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-react@7.37.5(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-react@7.37.5(eslint@9.36.0(jiti@2.6.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -11824,7 +12137,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -11838,24 +12151,24 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-storybook@9.1.7(eslint@9.36.0(jiti@2.5.1))(storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2): + eslint-plugin-storybook@9.1.8(eslint@9.36.0(jiti@2.6.0))(storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)))(typescript@5.9.2): dependencies: - '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) - storybook: 9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) + storybook: 9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)): + eslint-plugin-unused-imports@4.2.0(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.5.1) + eslint: 9.36.0(jiti@2.6.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) eslint-scope@5.1.1: dependencies: @@ -11871,9 +12184,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.36.0(jiti@2.5.1): + eslint@9.36.0(jiti@2.6.0): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 @@ -11909,7 +12222,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.0 transitivePeerDependencies: - supports-color @@ -12224,7 +12537,7 @@ snapshots: graphemer@1.4.0: {} - happy-dom@18.0.1: + happy-dom@19.0.1: dependencies: '@types/node': 20.19.17 '@types/whatwg-mimetype': 3.0.2 @@ -12598,6 +12911,8 @@ snapshots: jiti@2.5.1: {} + jiti@2.6.0: {} + jju@1.4.0: {} js-tokens@4.0.0: {} @@ -12768,26 +13083,19 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 - lilconfig@3.1.3: {} - lines-and-columns@1.2.4: {} lines-and-columns@2.0.4: {} - lint-staged@16.1.6: + lint-staged@16.2.3: dependencies: - chalk: 5.6.2 commander: 14.0.1 - debug: 4.4.3 - lilconfig: 3.1.3 listr2: 9.0.4 micromatch: 4.0.8 nano-spawn: 1.0.3 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 - transitivePeerDependencies: - - supports-color listr2@9.0.4: dependencies: @@ -13422,7 +13730,7 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@15.5.3(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.5.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@next/env': 15.5.3 '@swc/helpers': 0.5.15 @@ -13445,6 +13753,29 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.4(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@next/env': 15.5.4 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001743 + postcss: 8.4.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@19.1.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 + sharp: 0.34.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-eval@2.0.0: dependencies: path-is-absolute: 1.0.1 @@ -14366,13 +14697,13 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@9.1.7(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + storybook@9.1.8(@testing-library/dom@10.4.1)(prettier@3.6.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.8.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.25.10 @@ -14703,13 +15034,13 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.36.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.0) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -14920,13 +15251,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14941,7 +15272,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.52.13(@types/node@24.5.2) '@rollup/pluginutils': 5.3.0(rollup@4.51.0) @@ -14954,13 +15285,13 @@ snapshots: magic-string: 0.30.19 typescript: 5.9.2 optionalDependencies: - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -14971,16 +15302,16 @@ snapshots: optionalDependencies: '@types/node': 24.5.2 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.0 lightningcss: 1.30.1 terser: 5.44.0 yaml: 2.8.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@18.0.1)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14998,13 +15329,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.5.2 - happy-dom: 18.0.1 + happy-dom: 19.0.1 transitivePeerDependencies: - jiti - less From 8e8cd3198ef837efb26958a292a8333584ab3f22 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Tue, 30 Sep 2025 23:10:18 +0900 Subject: [PATCH 2/9] Implement eslint rules --- .changeset/config.json | 6 +- .changeset/wise-impalas-jump.md | 5 + apps/landing/devup.json | 1180 +- eslint.config.mjs | 14 + package.json | 5 +- packages/eslint-plugin/package.json | 11 +- .../__snapshots__/recommended.test.ts.snap | 14425 +--------------- .../eslint-plugin/src/configs/recommended.ts | 30 +- .../src/rules/__tests__/index.test.ts | 3 + .../rules/css-utils-literal-only/README.md | 98 + .../__tests__/index.test.ts | 29 +- .../src/rules/css-utils-literal-only/index.ts | 50 +- packages/eslint-plugin/src/rules/index.ts | 3 + .../src/rules/no-duplicate-value/README.md | 71 + .../__tests__/index.test.ts | 77 + .../src/rules/no-duplicate-value/index.ts | 96 + .../src/rules/no-useless-responsive/README.md | 79 + .../__tests__/index.test.ts | 88 + .../src/rules/no-useless-responsive/index.ts | 65 +- .../rules/no-useless-tailing-nulls/README.md | 63 + .../__tests__/index.test.ts | 12 +- .../rules/no-useless-tailing-nulls/index.ts | 82 +- .../eslint-plugin/src/utils/import-storage.ts | 87 + pnpm-lock.yaml | 32 +- tsconfig.json | 2 +- 25 files changed, 1532 insertions(+), 15081 deletions(-) create mode 100644 .changeset/wise-impalas-jump.md create mode 100644 packages/eslint-plugin/src/rules/no-duplicate-value/README.md create mode 100644 packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts create mode 100644 packages/eslint-plugin/src/rules/no-duplicate-value/index.ts create mode 100644 packages/eslint-plugin/src/utils/import-storage.ts diff --git a/.changeset/config.json b/.changeset/config.json index 1c6921f1..bd8889c9 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -10,9 +10,5 @@ "access": "restricted", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": [ - "*-example", - "*-benchmark", - "landing" - ] + "ignore": ["*-example", "*-benchmark", "landing"] } diff --git a/.changeset/wise-impalas-jump.md b/.changeset/wise-impalas-jump.md new file mode 100644 index 00000000..0db2316f --- /dev/null +++ b/.changeset/wise-impalas-jump.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/eslint-plugin': major +--- + +Implement rules diff --git a/apps/landing/devup.json b/apps/landing/devup.json index bb2cabc3..df27821b 100644 --- a/apps/landing/devup.json +++ b/apps/landing/devup.json @@ -1,592 +1,592 @@ { - "theme": { - "colors": { - "light": { - "primary": "#5A44FF", - "secondary": "#85A5F2", - "link": "#006BFF", - "text": "#2F2F2F", - "background": "#FFF", - "containerBackground": "#FFF", - "border": "#E0E0E0", - "success": "#4CAF50", - "warning": "#FF9800", - "error": "#F44336", - "info": "#2196F3", - "base": "#FFF", - "negativeBase": "#000", - "title": "#1A1A1A", - "caption": "#A9A8B4", - "shadow": "#87878740", - "codeBg": "#3E3B41", - "cardBg": "#F8F8F8", - "buttonBlue": "#266CCD", - "joinBg": "#CDE2FA", - "third": "#918AE9", - "buttonBlueHover": "#1453AC", - "buttonBlueActive": "#19498B", - "textReverse": "#FFF", - "footerTitle": "#A3A4B4", - "footerBg": "#F4F4F6", - "footerText": "#51575F", - "menuHover": "#F6F4FF", - "menuActive": "#EAE8FC", - "captionBold": "#7C7B8E", - "search": "#9C50FF", - "kakaoButton": "#DE9800", - "kakaoButtonHover": "#C98900", - "kakaoButtonActive": "#B77D00", - "imageBorder": "#C8C7D1", - "imageDropdown": "#ECECEC", - "imagePlaceholder": "#999", - "imageDate": "#C9C9C9", - "imageDateNone": "#F2F2F2", - "imageProgress": "#DADADA", - "imageMenuBg": "#FBFBFB", - "imageMenuSelect": "#EDECF7", - "starBg": "#F7F8FF" - }, - "dark": { - "primary": "#9086FF", - "secondary": "#2A4586", - "link": "#006BFF", - "text": "#EDEDED", - "background": "#131313", - "containerBackground": "#373639", - "border": "#333", - "success": "#4CAF50", - "warning": "#FF9800", - "error": "#F44336", - "info": "#2196F3", - "base": "#000", - "negativeBase": "#FFF", - "title": "#FAFAFA", - "caption": "#787878", - "shadow": "#62626240", - "codeBg": "#2E303C", - "cardBg": "#28272B", - "buttonBlue": "#0867AF", - "joinBg": "#2F363E", - "third": "#737FE4", - "buttonBlueHover": "#1453AC", - "buttonBlueActive": "#19498B", - "textReverse": "#2F2F2F", - "footerTitle": "#A3A4B4", - "footerBg": "#2E303C", - "footerText": "#FFF", - "menuHover": "#3C404B", - "menuActive": "#283259", - "captionBold": "#9C9BA9", - "search": "#6FA4FF", - "kakaoButton": "#A3740D", - "kakaoButtonHover": "#C98900", - "kakaoButtonActive": "#E09900", - "imageBorder": "#4D4C53", - "imageDropdown": "#3A3A3A", - "imagePlaceholder": "#4C4C4C", - "imageDate": "#636363", - "imageDateNone": "#343333", - "imageProgress": "#444", - "imageMenuBg": "#262626", - "imageMenuSelect": "#3F3F3F", - "starBg": "#232323" - } - }, - "typography": { - "h1": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "38px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "52px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "h6Reg": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 400, - "fontSize": "18px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 400, - "fontSize": "24px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "buttonL": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "17px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "20px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "code": [ - { - "fontFamily": "D2Coding", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "13px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "D2Coding", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "15px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - }, - null - ], - "buttonM": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "15px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "17px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "h4": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "28px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "36px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "body": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "14px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "16px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - }, - null - ], - "h6": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "18px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "24px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "textS": { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "15px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - "buttonLbold": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "17px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "18px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "buttonLsemiB": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "17px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "18px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "h2": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "36px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "48px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "h3": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "32px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "42px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "h5": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 600, - "fontSize": "24px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "30px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "buttonS": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "14px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "15px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "caption": { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "14px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - "small": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 300, - "fontSize": "11px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 400, - "fontSize": "12px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - null - ], - "buttonSmid": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "14px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "15px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "captionBold": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "13px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "14px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null - ], - "textSbold": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "13px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "15px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - null - ], - "textL": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "16px", - "lineHeight": 1.3, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "18px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - }, - null - ], - "footerMenu": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "13px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 500, - "fontSize": "14px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - null - ], - "bodyReg": [ - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 400, - "fontSize": "14px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - }, - null, - null, - null, - { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 400, - "fontSize": "16px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - }, - null - ], - "smallBold": { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 800, - "fontSize": "12px", - "lineHeight": 1.4, - "letterSpacing": "-0.03em" - }, - "bodyBold": { - "fontFamily": "Pretendard", - "fontStyle": "normal", - "fontWeight": 700, - "fontSize": "16px", - "lineHeight": 1.5, - "letterSpacing": "-0.03em" - } - } + "theme": { + "colors": { + "light": { + "primary": "#5A44FF", + "secondary": "#85A5F2", + "link": "#006BFF", + "text": "#2F2F2F", + "background": "#FFF", + "containerBackground": "#FFF", + "border": "#E0E0E0", + "success": "#4CAF50", + "warning": "#FF9800", + "error": "#F44336", + "info": "#2196F3", + "base": "#FFF", + "negativeBase": "#000", + "title": "#1A1A1A", + "caption": "#A9A8B4", + "shadow": "#87878740", + "codeBg": "#3E3B41", + "cardBg": "#F8F8F8", + "buttonBlue": "#266CCD", + "joinBg": "#CDE2FA", + "third": "#918AE9", + "buttonBlueHover": "#1453AC", + "buttonBlueActive": "#19498B", + "textReverse": "#FFF", + "footerTitle": "#A3A4B4", + "footerBg": "#F4F4F6", + "footerText": "#51575F", + "menuHover": "#F6F4FF", + "menuActive": "#EAE8FC", + "captionBold": "#7C7B8E", + "search": "#9C50FF", + "kakaoButton": "#DE9800", + "kakaoButtonHover": "#C98900", + "kakaoButtonActive": "#B77D00", + "imageBorder": "#C8C7D1", + "imageDropdown": "#ECECEC", + "imagePlaceholder": "#999", + "imageDate": "#C9C9C9", + "imageDateNone": "#F2F2F2", + "imageProgress": "#DADADA", + "imageMenuBg": "#FBFBFB", + "imageMenuSelect": "#EDECF7", + "starBg": "#F7F8FF" + }, + "dark": { + "primary": "#9086FF", + "secondary": "#2A4586", + "link": "#006BFF", + "text": "#EDEDED", + "background": "#131313", + "containerBackground": "#373639", + "border": "#333", + "success": "#4CAF50", + "warning": "#FF9800", + "error": "#F44336", + "info": "#2196F3", + "base": "#000", + "negativeBase": "#FFF", + "title": "#FAFAFA", + "caption": "#787878", + "shadow": "#62626240", + "codeBg": "#2E303C", + "cardBg": "#28272B", + "buttonBlue": "#0867AF", + "joinBg": "#2F363E", + "third": "#737FE4", + "buttonBlueHover": "#1453AC", + "buttonBlueActive": "#19498B", + "textReverse": "#2F2F2F", + "footerTitle": "#A3A4B4", + "footerBg": "#2E303C", + "footerText": "#FFF", + "menuHover": "#3C404B", + "menuActive": "#283259", + "captionBold": "#9C9BA9", + "search": "#6FA4FF", + "kakaoButton": "#A3740D", + "kakaoButtonHover": "#C98900", + "kakaoButtonActive": "#E09900", + "imageBorder": "#4D4C53", + "imageDropdown": "#3A3A3A", + "imagePlaceholder": "#4C4C4C", + "imageDate": "#636363", + "imageDateNone": "#343333", + "imageProgress": "#444", + "imageMenuBg": "#262626", + "imageMenuSelect": "#3F3F3F", + "starBg": "#232323" + } + }, + "typography": { + "h1": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "38px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "52px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "h6Reg": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 400, + "fontSize": "18px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 400, + "fontSize": "24px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "buttonL": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "17px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "20px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "code": [ + { + "fontFamily": "D2Coding", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "13px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "D2Coding", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "15px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + }, + null + ], + "buttonM": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "15px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "17px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "h4": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "28px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "36px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "body": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "14px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "16px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + }, + null + ], + "h6": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "18px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "24px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "textS": { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "15px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + "buttonLbold": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "17px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "18px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "buttonLsemiB": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "17px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "18px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "h2": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "36px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "48px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "h3": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "32px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "42px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "h5": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 600, + "fontSize": "24px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "30px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "buttonS": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "14px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "15px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "caption": { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "14px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + "small": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 300, + "fontSize": "11px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 400, + "fontSize": "12px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + null + ], + "buttonSmid": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "14px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "15px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "captionBold": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "13px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "14px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null + ], + "textSbold": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "13px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "15px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + null + ], + "textL": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "16px", + "lineHeight": 1.3, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "18px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + }, + null + ], + "footerMenu": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "13px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 500, + "fontSize": "14px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + null + ], + "bodyReg": [ + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 400, + "fontSize": "14px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + }, + null, + null, + null, + { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 400, + "fontSize": "16px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + }, + null + ], + "smallBold": { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 800, + "fontSize": "12px", + "lineHeight": 1.4, + "letterSpacing": "-0.03em" + }, + "bodyBold": { + "fontFamily": "Pretendard", + "fontStyle": "normal", + "fontWeight": 700, + "fontSize": "16px", + "lineHeight": 1.5, + "letterSpacing": "-0.03em" + } } -} \ No newline at end of file + } +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 7f6b5494..73066a39 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,9 +1,18 @@ import { configs } from 'eslint-plugin-devup' +import eslintPlugin from 'eslint-plugin-eslint-plugin' import jsonc from 'eslint-plugin-jsonc' import * as mdx from 'eslint-plugin-mdx' import globals from 'globals' export default [ + { + ignores: [ + 'coverage', + 'target', + 'benchmark/next-panda-css/styled-system', + 'bindings/devup-ui-wasm/pkg', + ], + }, // eslint-plugin-devup ...configs.recommended, // eslint-plugin-jsonc @@ -61,4 +70,9 @@ export default [ 'react/jsx-tag-spacing': ['error', { beforeClosing: 'never' }], }, }, + // eslint-plugin rule + { + ...eslintPlugin.configs.recommended, + // files: ['packages/eslint-plugin/**/*.{js,jsx,ts,tsx}'], + }, ] diff --git a/package.json b/package.json index eedcf8ad..3f133b4b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "devup-ui", "type": "module", "scripts": { - "lint": "pnpm -F @devup-ui/* lint && cargo fmt --all -- --check && cargo clippy --all-targets --all-features -- -D warnings", + "lint": "pnpm -F @devup-ui/* lint && cargo fmt --all -- --check && cargo clippy --all-targets --all-features -- -D warnings && eslint", "pretest": "pnpm -F @devup-ui/vite-plugin build", "test": "cargo tarpaulin --out xml --out stdout --out html --all-targets && vitest test --coverage --run && pnpm -r test", "build": "pnpm -F wasm build && pnpm -F @devup-ui/* -F !wasm build", @@ -29,7 +29,8 @@ "happy-dom": "^19.0.1", "husky": "^9.1.7", "lint-staged": "^16.2.3", - "vitest": "^3.2.4" + "vitest": "^3.2.4", + "eslint-plugin-eslint-plugin": "^7.0.0" }, "author": "devfive", "packageManager": "pnpm@10.17.1", diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index c314c37d..61c09fd7 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -25,18 +25,13 @@ "author": "devfive", "license": "ISC", "dependencies": { - "typescript-eslint": "^8.44" + "typescript-eslint": "^8.44", + "@typescript-eslint/utils": "^8.44" }, "devDependencies": { - "@types/eslint": "^9.6", - "@types/eslint__js": "^9.14", "@typescript-eslint/rule-tester": "^8.44", - "@typescript-eslint/utils": "^8.44", - "@vitest/coverage-v8": "3.2.4", - "eslint-plugin-eslint-plugin": "^7.0.0", "typescript": "^5.9.2", "vite": "^7.1.7", - "vite-plugin-dts": "^4.5.4", - "vitest": "^3.2.4" + "vite-plugin-dts": "^4.5.4" } } diff --git a/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap b/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap index f1ac655a..36f591bf 100644 --- a/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap +++ b/packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap @@ -3,14350 +3,69 @@ exports[`recommended > export recommended config 1`] = ` [ { - "ignores": [ - "**/node_modules/", - "**/build/", - "**/__snapshots__/", - "!**/src/**", - "!vite.config.ts", - "!**/.storybook/**", - "**/storybook-static/", - "**/dist/", - "**/next-env.d.ts", - "**/out/", - "**/.next/", - "**/public/", - "**/.df/", - ], - }, - { - "languageOptions": { - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - }, - }, - "plugins": { - "react": { - "configs": { - "all": { - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - }, - "plugins": [ - "react", - ], - "rules": { - "react/boolean-prop-naming": 2, - "react/button-has-type": 2, - "react/checked-requires-onchange-or-readonly": 2, - "react/default-props-match-prop-types": 2, - "react/destructuring-assignment": 2, - "react/display-name": 2, - "react/forbid-component-props": 2, - "react/forbid-dom-props": 2, - "react/forbid-elements": 2, - "react/forbid-foreign-prop-types": 2, - "react/forbid-prop-types": 2, - "react/forward-ref-uses-ref": 2, - "react/function-component-definition": 2, - "react/hook-use-state": 2, - "react/iframe-missing-sandbox": 2, - "react/jsx-boolean-value": 2, - "react/jsx-child-element-spacing": 2, - "react/jsx-closing-bracket-location": 2, - "react/jsx-closing-tag-location": 2, - "react/jsx-curly-brace-presence": 2, - "react/jsx-curly-newline": 2, - "react/jsx-curly-spacing": 2, - "react/jsx-equals-spacing": 2, - "react/jsx-filename-extension": 2, - "react/jsx-first-prop-new-line": 2, - "react/jsx-fragments": 2, - "react/jsx-handler-names": 2, - "react/jsx-indent": 2, - "react/jsx-indent-props": 2, - "react/jsx-key": 2, - "react/jsx-max-depth": 2, - "react/jsx-max-props-per-line": 2, - "react/jsx-newline": 2, - "react/jsx-no-bind": 2, - "react/jsx-no-comment-textnodes": 2, - "react/jsx-no-constructed-context-values": 2, - "react/jsx-no-duplicate-props": 2, - "react/jsx-no-leaked-render": 2, - "react/jsx-no-literals": 2, - "react/jsx-no-script-url": 2, - "react/jsx-no-target-blank": 2, - "react/jsx-no-undef": 2, - "react/jsx-no-useless-fragment": 2, - "react/jsx-one-expression-per-line": 2, - "react/jsx-pascal-case": 2, - "react/jsx-props-no-multi-spaces": 2, - "react/jsx-props-no-spread-multi": 2, - "react/jsx-props-no-spreading": 2, - "react/jsx-sort-props": 2, - "react/jsx-tag-spacing": 2, - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/jsx-wrap-multilines": 2, - "react/no-access-state-in-setstate": 2, - "react/no-adjacent-inline-elements": 2, - "react/no-array-index-key": 2, - "react/no-arrow-function-lifecycle": 2, - "react/no-children-prop": 2, - "react/no-danger": 2, - "react/no-danger-with-children": 2, - "react/no-deprecated": 2, - "react/no-did-mount-set-state": 2, - "react/no-did-update-set-state": 2, - "react/no-direct-mutation-state": 2, - "react/no-find-dom-node": 2, - "react/no-invalid-html-attribute": 2, - "react/no-is-mounted": 2, - "react/no-multi-comp": 2, - "react/no-namespace": 2, - "react/no-object-type-as-default-prop": 2, - "react/no-redundant-should-component-update": 2, - "react/no-render-return-value": 2, - "react/no-set-state": 2, - "react/no-string-refs": 2, - "react/no-this-in-sfc": 2, - "react/no-typos": 2, - "react/no-unescaped-entities": 2, - "react/no-unknown-property": 2, - "react/no-unsafe": 2, - "react/no-unstable-nested-components": 2, - "react/no-unused-class-component-methods": 2, - "react/no-unused-prop-types": 2, - "react/no-unused-state": 2, - "react/no-will-update-set-state": 2, - "react/prefer-es6-class": 2, - "react/prefer-exact-props": 2, - "react/prefer-read-only-props": 2, - "react/prefer-stateless-function": 2, - "react/prop-types": 2, - "react/react-in-jsx-scope": 2, - "react/require-default-props": 2, - "react/require-optimization": 2, - "react/require-render-return": 2, - "react/self-closing-comp": 2, - "react/sort-comp": 2, - "react/sort-default-props": 2, - "react/sort-prop-types": 2, - "react/state-in-constructor": 2, - "react/static-property-placement": 2, - "react/style-prop-object": 2, - "react/void-dom-elements-no-children": 2, - }, - }, - "flat": { - "all": { - "languageOptions": { - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - }, - }, - "plugins": { - "react": [Circular], - }, - "rules": { - "react/boolean-prop-naming": 2, - "react/button-has-type": 2, - "react/checked-requires-onchange-or-readonly": 2, - "react/default-props-match-prop-types": 2, - "react/destructuring-assignment": 2, - "react/display-name": 2, - "react/forbid-component-props": 2, - "react/forbid-dom-props": 2, - "react/forbid-elements": 2, - "react/forbid-foreign-prop-types": 2, - "react/forbid-prop-types": 2, - "react/forward-ref-uses-ref": 2, - "react/function-component-definition": 2, - "react/hook-use-state": 2, - "react/iframe-missing-sandbox": 2, - "react/jsx-boolean-value": 2, - "react/jsx-child-element-spacing": 2, - "react/jsx-closing-bracket-location": 2, - "react/jsx-closing-tag-location": 2, - "react/jsx-curly-brace-presence": 2, - "react/jsx-curly-newline": 2, - "react/jsx-curly-spacing": 2, - "react/jsx-equals-spacing": 2, - "react/jsx-filename-extension": 2, - "react/jsx-first-prop-new-line": 2, - "react/jsx-fragments": 2, - "react/jsx-handler-names": 2, - "react/jsx-indent": 2, - "react/jsx-indent-props": 2, - "react/jsx-key": 2, - "react/jsx-max-depth": 2, - "react/jsx-max-props-per-line": 2, - "react/jsx-newline": 2, - "react/jsx-no-bind": 2, - "react/jsx-no-comment-textnodes": 2, - "react/jsx-no-constructed-context-values": 2, - "react/jsx-no-duplicate-props": 2, - "react/jsx-no-leaked-render": 2, - "react/jsx-no-literals": 2, - "react/jsx-no-script-url": 2, - "react/jsx-no-target-blank": 2, - "react/jsx-no-undef": 2, - "react/jsx-no-useless-fragment": 2, - "react/jsx-one-expression-per-line": 2, - "react/jsx-pascal-case": 2, - "react/jsx-props-no-multi-spaces": 2, - "react/jsx-props-no-spread-multi": 2, - "react/jsx-props-no-spreading": 2, - "react/jsx-sort-props": 2, - "react/jsx-tag-spacing": 2, - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/jsx-wrap-multilines": 2, - "react/no-access-state-in-setstate": 2, - "react/no-adjacent-inline-elements": 2, - "react/no-array-index-key": 2, - "react/no-arrow-function-lifecycle": 2, - "react/no-children-prop": 2, - "react/no-danger": 2, - "react/no-danger-with-children": 2, - "react/no-deprecated": 2, - "react/no-did-mount-set-state": 2, - "react/no-did-update-set-state": 2, - "react/no-direct-mutation-state": 2, - "react/no-find-dom-node": 2, - "react/no-invalid-html-attribute": 2, - "react/no-is-mounted": 2, - "react/no-multi-comp": 2, - "react/no-namespace": 2, - "react/no-object-type-as-default-prop": 2, - "react/no-redundant-should-component-update": 2, - "react/no-render-return-value": 2, - "react/no-set-state": 2, - "react/no-string-refs": 2, - "react/no-this-in-sfc": 2, - "react/no-typos": 2, - "react/no-unescaped-entities": 2, - "react/no-unknown-property": 2, - "react/no-unsafe": 2, - "react/no-unstable-nested-components": 2, - "react/no-unused-class-component-methods": 2, - "react/no-unused-prop-types": 2, - "react/no-unused-state": 2, - "react/no-will-update-set-state": 2, - "react/prefer-es6-class": 2, - "react/prefer-exact-props": 2, - "react/prefer-read-only-props": 2, - "react/prefer-stateless-function": 2, - "react/prop-types": 2, - "react/react-in-jsx-scope": 2, - "react/require-default-props": 2, - "react/require-optimization": 2, - "react/require-render-return": 2, - "react/self-closing-comp": 2, - "react/sort-comp": 2, - "react/sort-default-props": 2, - "react/sort-prop-types": 2, - "react/state-in-constructor": 2, - "react/static-property-placement": 2, - "react/style-prop-object": 2, - "react/void-dom-elements-no-children": 2, - }, - }, - "jsx-runtime": { - "languageOptions": { - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - "jsxPragma": null, - }, - }, - "plugins": { - "react": [Circular], - }, - "rules": { - "react/jsx-uses-react": 0, - "react/react-in-jsx-scope": 0, - }, - }, - "recommended": [Circular], - }, - "jsx-runtime": { - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - "jsxPragma": null, - }, - "plugins": [ - "react", - ], - "rules": { - "react/jsx-uses-react": 0, - "react/react-in-jsx-scope": 0, - }, - }, - "recommended": { - "parserOptions": { - "ecmaFeatures": { - "jsx": true, - }, - }, - "plugins": [ - "react", - ], - "rules": { - "react/display-name": 2, - "react/jsx-key": 2, - "react/jsx-no-comment-textnodes": 2, - "react/jsx-no-duplicate-props": 2, - "react/jsx-no-target-blank": 2, - "react/jsx-no-undef": 2, - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/no-children-prop": 2, - "react/no-danger-with-children": 2, - "react/no-deprecated": 2, - "react/no-direct-mutation-state": 2, - "react/no-find-dom-node": 2, - "react/no-is-mounted": 2, - "react/no-render-return-value": 2, - "react/no-string-refs": 2, - "react/no-unescaped-entities": 2, - "react/no-unknown-property": 2, - "react/no-unsafe": 0, - "react/prop-types": 2, - "react/react-in-jsx-scope": 2, - "react/require-render-return": 2, - }, - }, - }, - "deprecatedRules": { - "jsx-sort-default-props": { - "create": [Function], - "meta": { - "deprecated": true, - "docs": { - "category": "Stylistic Issues", - "description": "Enforce defaultProps declarations alphabetical sorting", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-sort-default-props.md", - }, - "messages": { - "propsNotSorted": "Default prop types declarations should be sorted alphabetically", - }, - "replacedBy": [ - "sort-default-props", - ], - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreCase": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-space-before-closing": { - "create": [Function], - "meta": { - "deprecated": true, - "docs": { - "category": "Stylistic Issues", - "description": "Enforce spacing before closing bracket in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-space-before-closing.md", - }, - "fixable": "code", - "messages": { - "needSpaceBeforeClose": "A space is required before closing bracket", - "noSpaceBeforeClose": "A space is forbidden before closing bracket", - }, - "replacedBy": [ - "jsx-tag-spacing", - ], - "schema": [ - { - "enum": [ - "always", - "never", - ], - }, - ], - }, - }, - }, - "rules": { - "boolean-prop-naming": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforces consistent naming for boolean props", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/boolean-prop-naming.md", - }, - "messages": { - "patternMismatch": "Prop name \`{{propName}}\` doesn’t match rule \`{{pattern}}\`", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "message": { - "minLength": 1, - "type": "string", - }, - "propTypeNames": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "rule": { - "default": "^(is|has)[A-Z]([A-Za-z0-9]?)+", - "minLength": 1, - "type": "string", - }, - "validateNested": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "button-has-type": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow usage of \`button\` elements without an explicit \`type\` attribute", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/button-has-type.md", - }, - "messages": { - "complexType": "The button type attribute must be specified by a static string or a trivial ternary expression", - "forbiddenValue": ""{{value}}" is an invalid value for button type attribute", - "invalidValue": ""{{value}}" is an invalid value for button type attribute", - "missingType": "Missing an explicit type attribute for button", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "button": { - "default": true, - "type": "boolean", - }, - "reset": { - "default": true, - "type": "boolean", - }, - "submit": { - "default": true, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "checked-requires-onchange-or-readonly": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Enforce using \`onChange\` or \`readonly\` attribute when \`checked\` is used", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/checked-requires-onchange-or-readonly.md", - }, - "messages": { - "exclusiveCheckedAttribute": "Use either \`checked\` or \`defaultChecked\`, but not both.", - "missingProperty": "\`checked\` should be used with either \`onChange\` or \`readOnly\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreExclusiveCheckedAttribute": { - "type": "boolean", - }, - "ignoreMissingProperties": { - "type": "boolean", - }, - }, - }, - ], - }, - }, - "default-props-match-prop-types": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Enforce all defaultProps have a corresponding non-required PropType", - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/default-props-match-prop-types.md", - }, - "messages": { - "defaultHasNoType": "defaultProp "{{name}}" has no corresponding propTypes declaration.", - "requiredHasDefault": "defaultProp "{{name}}" defined for isRequired propType.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowRequiredDefaults": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "destructuring-assignment": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce consistent usage of destructuring assignment of props, state, and context", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/destructuring-assignment.md", - }, - "fixable": "code", - "messages": { - "destructureInSignature": "Must destructure props in the function signature.", - "noDestructAssignment": "Must never use destructuring {{type}} assignment", - "noDestructContextInSFCArg": "Must never use destructuring context assignment in SFC argument", - "noDestructPropsInSFCArg": "Must never use destructuring props assignment in SFC argument", - "useDestructAssignment": "Must use destructuring {{type}} assignment", - }, - "schema": [ - { - "enum": [ - "always", - "never", - ], - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "destructureInSignature": { - "enum": [ - "always", - "ignore", - ], - "type": "string", - }, - "ignoreClassFields": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "display-name": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow missing displayName in a React component definition", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/display-name.md", - }, - "messages": { - "noContextDisplayName": "Context definition is missing display name", - "noDisplayName": "Component definition is missing display name", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "checkContextObjects": { - "type": "boolean", - }, - "ignoreTranspilerName": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "forbid-component-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow certain props on components", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-component-props.md", - }, - "messages": { - "propIsForbidden": "Prop "{{prop}}" is forbidden on Components", - }, - "schema": [ - { - "properties": { - "forbid": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "allowedFor": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "allowedForPatterns": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "message": { - "type": "string", - }, - "propName": { - "type": "string", - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "disallowedFor", - ], - }, - { - "required": [ - "disallowedForPatterns", - ], - }, - ], - "properties": { - "disallowedFor": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "disallowedForPatterns": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "message": { - "type": "string", - }, - "propName": { - "type": "string", - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "allowedFor": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "allowedForPatterns": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "message": { - "type": "string", - }, - "propNamePattern": { - "type": "string", - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "disallowedFor", - ], - }, - { - "required": [ - "disallowedForPatterns", - ], - }, - ], - "properties": { - "disallowedFor": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "disallowedForPatterns": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "message": { - "type": "string", - }, - "propNamePattern": { - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "forbid-dom-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow certain props on DOM Nodes", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-dom-props.md", - }, - "messages": { - "propIsForbidden": "Prop "{{prop}}" is forbidden on DOM Nodes", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "forbid": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "properties": { - "disallowedFor": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "message": { - "type": "string", - }, - "propName": { - "type": "string", - }, - }, - "type": "object", - }, - ], - "minLength": 1, - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - }, - }, - "forbid-elements": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow certain elements", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-elements.md", - }, - "messages": { - "forbiddenElement": "<{{element}}> is forbidden", - "forbiddenElement_message": "<{{element}}> is forbidden, {{message}}", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "forbid": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "element": { - "type": "string", - }, - "message": { - "type": "string", - }, - }, - "required": [ - "element", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "forbid-foreign-prop-types": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow using another component's propTypes", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-foreign-prop-types.md", - }, - "messages": { - "forbiddenPropType": "Using propTypes from another component is not safe because they may be removed in production builds", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowInPropTypes": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "forbid-prop-types": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow certain propTypes", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forbid-prop-types.md", - }, - "messages": { - "forbiddenPropType": "Prop type "{{target}}" is forbidden", - }, - "schema": [ - { - "additionalProperties": true, - "properties": { - "checkChildContextTypes": { - "type": "boolean", - }, - "checkContextTypes": { - "type": "boolean", - }, - "forbid": { - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "forward-ref-uses-ref": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Require all forwardRef components include a ref parameter", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/forward-ref-uses-ref.md", - }, - "hasSuggestions": true, - "messages": { - "addRefParameter": "Add a ref parameter", - "missingRefParameter": "forwardRef is used with this component but no ref parameter is set", - "removeForwardRef": "Remove forwardRef wrapper", - }, - "schema": [], - "type": "suggestion", - }, - }, - "function-component-definition": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce a specific function type for function components", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/function-component-definition.md", - }, - "fixable": "code", - "messages": { - "arrow-function": "Function component is not an arrow function", - "function-declaration": "Function component is not a function declaration", - "function-expression": "Function component is not a function expression", - }, - "schema": [ - { - "properties": { - "namedComponents": { - "anyOf": [ - { - "enum": [ - "function-declaration", - "arrow-function", - "function-expression", - ], - }, - { - "items": { - "enum": [ - "function-declaration", - "arrow-function", - "function-expression", - ], - "type": "string", - }, - "type": "array", - }, - ], - }, - "unnamedComponents": { - "anyOf": [ - { - "enum": [ - "arrow-function", - "function-expression", - ], - }, - { - "items": { - "enum": [ - "arrow-function", - "function-expression", - ], - "type": "string", - }, - "type": "array", - }, - ], - }, - }, - "type": "object", - }, - ], - }, - }, - "hook-use-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Ensure destructuring and symmetric naming of useState hook value and setter variables", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/hook-use-state.md", - }, - "hasSuggestions": true, - "messages": { - "suggestMemo": "Replace useState call with useMemo", - "suggestPair": "Destructure useState call into value + setter pair", - "useStateErrorMessage": "useState call is not destructured into value + setter pair", - "useStateErrorMessageOrAddOption": "useState call is not destructured into value + setter pair (you can allow destructuring by enabling "allowDestructuredState" option)", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowDestructuredState": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "iframe-missing-sandbox": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Enforce sandbox attribute on iframe elements", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/iframe-missing-sandbox.md", - }, - "messages": { - "attributeMissing": "An iframe element is missing a sandbox attribute", - "invalidCombination": "An iframe element defines a sandbox attribute with both allow-scripts and allow-same-origin which is invalid", - "invalidValue": "An iframe element defines a sandbox attribute with invalid value "{{ value }}"", - }, - "schema": [], - }, - }, - "jsx-boolean-value": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce boolean attributes notation in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-boolean-value.md", - }, - "fixable": "code", - "messages": { - "omitBoolean": "Value must be omitted for boolean attribute \`{{propName}}\`", - "omitPropAndBoolean": "Value must be omitted for \`false\` attribute: \`{{propName}}\`", - "setBoolean": "Value must be set for boolean attribute \`{{propName}}\`", - }, - "schema": { - "anyOf": [ - { - "additionalItems": false, - "items": [ - { - "enum": [ - "always", - "never", - ], - }, - ], - "type": "array", - }, - { - "additionalItems": false, - "items": [ - { - "enum": [ - "always", - ], - }, - { - "additionalProperties": false, - "properties": { - "assumeUndefinedIsFalse": { - "type": "boolean", - }, - "never": { - "items": { - "minLength": 1, - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - { - "additionalItems": false, - "items": [ - { - "enum": [ - "never", - ], - }, - { - "additionalProperties": false, - "properties": { - "always": { - "items": { - "minLength": 1, - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "assumeUndefinedIsFalse": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - ], - }, - }, - }, - "jsx-child-element-spacing": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce or disallow spaces inside of curly braces in JSX attributes and expressions", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-child-element-spacing.md", - }, - "fixable": null, - "messages": { - "spacingAfterPrev": "Ambiguous spacing after previous element {{element}}", - "spacingBeforeNext": "Ambiguous spacing before next element {{element}}", - }, - "schema": [], - }, - }, - "jsx-closing-bracket-location": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce closing bracket location in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-closing-bracket-location.md", - }, - "fixable": "code", - "messages": { - "bracketLocation": "The closing bracket must be {{location}}{{details}}", - }, - "schema": [ - { - "anyOf": [ - { - "enum": [ - "after-props", - "props-aligned", - "tag-aligned", - "line-aligned", - ], - }, - { - "additionalProperties": false, - "properties": { - "location": { - "enum": [ - "after-props", - "props-aligned", - "tag-aligned", - "line-aligned", - ], - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "nonEmpty": { - "enum": [ - "after-props", - "props-aligned", - "tag-aligned", - "line-aligned", - false, - ], - }, - "selfClosing": { - "enum": [ - "after-props", - "props-aligned", - "tag-aligned", - "line-aligned", - false, - ], - }, - }, - "type": "object", - }, - ], - }, - ], - }, - }, - "jsx-closing-tag-location": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce closing tag location for multiline JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-closing-tag-location.md", - }, - "fixable": "whitespace", - "messages": { - "alignWithOpening": "Expected closing tag to be aligned with the line containing the opening tag", - "matchIndent": "Expected closing tag to match indentation of opening.", - "onOwnLine": "Closing tag of a multiline JSX expression must be on its own line.", - }, - "schema": [ - { - "anyOf": [ - { - "enum": [ - "tag-aligned", - "line-aligned", - ], - }, - { - "additionalProperties": false, - "properties": { - "location": { - "enum": [ - "tag-aligned", - "line-aligned", - ], - }, - }, - "type": "object", - }, - ], - }, - ], - }, - }, - "jsx-curly-brace-presence": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow unnecessary JSX expressions when literals alone are sufficient or enforce JSX expressions on literals in JSX children or attributes", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-curly-brace-presence.md", - }, - "fixable": "code", - "messages": { - "missingCurly": "Need to wrap this literal in a JSX expression.", - "unnecessaryCurly": "Curly braces are unnecessary here.", - }, - "schema": [ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "children": { - "enum": [ - "always", - "never", - "ignore", - ], - }, - "propElementValues": { - "enum": [ - "always", - "never", - "ignore", - ], - }, - "props": { - "enum": [ - "always", - "never", - "ignore", - ], - }, - }, - "type": "object", - }, - { - "enum": [ - "always", - "never", - "ignore", - ], - }, - ], - }, - ], - }, - }, - "jsx-curly-newline": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce consistent linebreaks in curly braces in JSX attributes and expressions", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-curly-newline.md", - }, - "fixable": "whitespace", - "messages": { - "expectedAfter": "Expected newline after '{'.", - "expectedBefore": "Expected newline before '}'.", - "unexpectedAfter": "Unexpected newline after '{'.", - "unexpectedBefore": "Unexpected newline before '}'.", - }, - "schema": [ - { - "anyOf": [ - { - "enum": [ - "consistent", - "never", - ], - }, - { - "additionalProperties": false, - "properties": { - "multiline": { - "enum": [ - "consistent", - "require", - "forbid", - ], - }, - "singleline": { - "enum": [ - "consistent", - "require", - "forbid", - ], - }, - }, - "type": "object", - }, - ], - }, - ], - "type": "layout", - }, - }, - "jsx-curly-spacing": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce or disallow spaces inside of curly braces in JSX attributes and expressions", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-curly-spacing.md", - }, - "fixable": "code", - "messages": { - "noNewlineAfter": "There should be no newline after '{{token}}'", - "noNewlineBefore": "There should be no newline before '{{token}}'", - "noSpaceAfter": "There should be no space after '{{token}}'", - "noSpaceBefore": "There should be no space before '{{token}}'", - "spaceNeededAfter": "A space is required after '{{token}}'", - "spaceNeededBefore": "A space is required before '{{token}}'", - }, - "schema": { - "definitions": { - "basicConfig": { - "properties": { - "allowMultiline": { - "type": "boolean", - }, - "spacing": { - "properties": { - "objectLiterals": { - "enum": [ - "always", - "never", - ], - }, - }, - "type": "object", - }, - "when": { - "enum": [ - "always", - "never", - ], - }, - }, - "type": "object", - }, - "basicConfigOrBoolean": { - "anyOf": [ - { - "$ref": "#/definitions/basicConfig", - }, - { - "type": "boolean", - }, - ], - }, - }, - "items": [ - { - "anyOf": [ - { - "allOf": [ - { - "$ref": "#/definitions/basicConfig", - }, - { - "properties": { - "attributes": { - "$ref": "#/definitions/basicConfigOrBoolean", - }, - "children": { - "$ref": "#/definitions/basicConfigOrBoolean", - }, - }, - "type": "object", - }, - ], - }, - { - "enum": [ - "always", - "never", - ], - }, - ], - }, - { - "additionalProperties": false, - "properties": { - "allowMultiline": { - "type": "boolean", - }, - "spacing": { - "properties": { - "objectLiterals": { - "enum": [ - "always", - "never", - ], - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - }, - }, - "jsx-equals-spacing": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce or disallow spaces around equal signs in JSX attributes", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-equals-spacing.md", - }, - "fixable": "code", - "messages": { - "needSpaceAfter": "A space is required after '='", - "needSpaceBefore": "A space is required before '='", - "noSpaceAfter": "There should be no space after '='", - "noSpaceBefore": "There should be no space before '='", - }, - "schema": [ - { - "enum": [ - "always", - "never", - ], - }, - ], - }, - }, - "jsx-filename-extension": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow file extensions that may contain JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-filename-extension.md", - }, - "messages": { - "extensionOnlyForJSX": "Only files containing JSX may use the extension '{{ext}}'", - "noJSXWithExtension": "JSX not allowed in files with extension '{{ext}}'", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "enum": [ - "always", - "as-needed", - ], - }, - "extensions": { - "items": { - "type": "string", - }, - "type": "array", - }, - "ignoreFilesWithoutCode": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-first-prop-new-line": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce proper position of the first property in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-first-prop-new-line.md", - }, - "fixable": "code", - "messages": { - "propOnNewLine": "Property should be placed on a new line", - "propOnSameLine": "Property should be placed on the same line as the component declaration", - }, - "schema": [ - { - "enum": [ - "always", - "never", - "multiline", - "multiline-multiprop", - "multiprop", - ], - }, - ], - }, - }, - "jsx-fragments": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce shorthand or standard form for React fragments", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-fragments.md", - }, - "fixable": "code", - "messages": { - "fragmentsNotSupported": "Fragments are only supported starting from React v16.2. Please disable the \`react/jsx-fragments\` rule in \`eslint\` settings or upgrade your version of React.", - "preferFragment": "Prefer fragment shorthand over {{react}}.{{fragment}}", - "preferPragma": "Prefer {{react}}.{{fragment}} over fragment shorthand", - }, - "schema": [ - { - "enum": [ - "syntax", - "element", - ], - }, - ], - }, - }, - "jsx-handler-names": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce event handler naming conventions in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-handler-names.md", - }, - "messages": { - "badHandlerName": "Handler function for {{propKey}} prop key must be a camelCase name beginning with '{{handlerPrefix}}' only", - "badPropKey": "Prop key for {{propValue}} must begin with '{{handlerPropPrefix}}'", - }, - "schema": [ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "checkInlineFunction": { - "type": "boolean", - }, - "checkLocalVariables": { - "type": "boolean", - }, - "eventHandlerPrefix": { - "type": "string", - }, - "eventHandlerPropPrefix": { - "type": "string", - }, - "ignoreComponentNames": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "checkInlineFunction": { - "type": "boolean", - }, - "checkLocalVariables": { - "type": "boolean", - }, - "eventHandlerPrefix": { - "type": "string", - }, - "eventHandlerPropPrefix": { - "enum": [ - false, - ], - "type": "boolean", - }, - "ignoreComponentNames": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "checkInlineFunction": { - "type": "boolean", - }, - "checkLocalVariables": { - "type": "boolean", - }, - "eventHandlerPrefix": { - "enum": [ - false, - ], - "type": "boolean", - }, - "eventHandlerPropPrefix": { - "type": "string", - }, - "ignoreComponentNames": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "checkLocalVariables": { - "type": "boolean", - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "checkInlineFunction": { - "type": "boolean", - }, - }, - "type": "object", - }, - { - "properties": { - "ignoreComponentNames": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - }, - ], - }, - }, - "jsx-indent": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce JSX indentation", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-indent.md", - }, - "fixable": "whitespace", - "messages": { - "wrongIndent": "Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}.", - }, - "schema": [ - { - "anyOf": [ - { - "enum": [ - "tab", - ], - }, - { - "type": "integer", - }, - ], - }, - { - "additionalProperties": false, - "properties": { - "checkAttributes": { - "type": "boolean", - }, - "indentLogicalExpressions": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-indent-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce props indentation in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-indent-props.md", - }, - "fixable": "code", - "messages": { - "wrongIndent": "Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}.", - }, - "schema": [ - { - "anyOf": [ - { - "enum": [ - "tab", - "first", - ], - }, - { - "type": "integer", - }, - { - "properties": { - "ignoreTernaryOperator": { - "type": "boolean", - }, - "indentMode": { - "anyOf": [ - { - "enum": [ - "tab", - "first", - ], - }, - { - "type": "integer", - }, - ], - }, - }, - "type": "object", - }, - ], - }, - ], - }, - }, - "jsx-key": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow missing \`key\` props in iterators/collection literals", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-key.md", - }, - "messages": { - "keyBeforeSpread": "\`key\` prop must be placed before any \`{...spread}, to avoid conflicting with React’s new JSX transform: https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html\`", - "missingArrayKey": "Missing "key" prop for element in array", - "missingArrayKeyUsePrag": "Missing "key" prop for element in array. Shorthand fragment syntax does not support providing keys. Use {{reactPrag}}.{{fragPrag}} instead", - "missingIterKey": "Missing "key" prop for element in iterator", - "missingIterKeyUsePrag": "Missing "key" prop for element in iterator. Shorthand fragment syntax does not support providing keys. Use {{reactPrag}}.{{fragPrag}} instead", - "nonUniqueKeys": "\`key\` prop must be unique", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "checkFragmentShorthand": { - "default": false, - "type": "boolean", - }, - "checkKeyMustBeforeSpread": { - "default": false, - "type": "boolean", - }, - "warnOnDuplicates": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-max-depth": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce JSX maximum depth", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-max-depth.md", - }, - "messages": { - "wrongDepth": "Expected the depth of nested jsx elements to be <= {{needed}}, but found {{found}}.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "max": { - "minimum": 0, - "type": "integer", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-max-props-per-line": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce maximum of props on a single line in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-max-props-per-line.md", - }, - "fixable": "code", - "messages": { - "newLine": "Prop \`{{prop}}\` must be placed on a new line", - }, - "schema": [ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "maximum": { - "properties": { - "multi": { - "minimum": 1, - "type": "integer", - }, - "single": { - "minimum": 1, - "type": "integer", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "maximum": { - "minimum": 1, - "type": "number", - }, - "when": { - "enum": [ - "always", - "multiline", - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - ], - }, - }, - "jsx-newline": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Require or prevent a new line after jsx elements and expressions.", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-newline.md", - }, - "fixable": "code", - "messages": { - "allowMultilines": "Multiline JSX elements should start in a new line", - "prevent": "JSX element should not start in a new line", - "require": "JSX element should start in a new line", - }, - "schema": [ - { - "additionalProperties": false, - "if": { - "properties": { - "allowMultilines": { - "const": true, - }, - }, - }, - "properties": { - "allowMultilines": { - "default": false, - "type": "boolean", - }, - "prevent": { - "default": false, - "type": "boolean", - }, - }, - "then": { - "properties": { - "prevent": { - "const": true, - }, - }, - "required": [ - "prevent", - ], - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-bind": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow \`.bind()\` or arrow functions in JSX props", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-bind.md", - }, - "messages": { - "arrowFunc": "JSX props should not use arrow functions", - "bindCall": "JSX props should not use .bind()", - "bindExpression": "JSX props should not use ::", - "func": "JSX props should not use functions", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowArrowFunctions": { - "default": false, - "type": "boolean", - }, - "allowBind": { - "default": false, - "type": "boolean", - }, - "allowFunctions": { - "default": false, - "type": "boolean", - }, - "ignoreDOMComponents": { - "default": false, - "type": "boolean", - }, - "ignoreRefs": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-comment-textnodes": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow comments from being inserted as text nodes", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-comment-textnodes.md", - }, - "messages": { - "putCommentInBraces": "Comments inside children section of tag should be placed inside braces", - }, - "schema": [], - }, - }, - "jsx-no-constructed-context-values": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallows JSX context provider values from taking values that will cause needless rerenders", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-constructed-context-values.md", - }, - "messages": { - "defaultMsg": "The {{type}} passed as the value prop to the Context provider (at line {{nodeLine}}) changes every render. To fix this consider wrapping it in a useMemo hook.", - "defaultMsgFunc": "The {{type}} passed as the value prop to the Context provider (at line {{nodeLine}}) changes every render. To fix this consider wrapping it in a useCallback hook.", - "withIdentifierMsg": "The '{{variableName}}' {{type}} (at line {{nodeLine}}) passed as the value prop to the Context provider (at line {{usageLine}}) changes every render. To fix this consider wrapping it in a useMemo hook.", - "withIdentifierMsgFunc": "The '{{variableName}}' {{type}} (at line {{nodeLine}}) passed as the value prop to the Context provider (at line {{usageLine}}) changes every render. To fix this consider wrapping it in a useCallback hook.", - }, - "schema": false, - }, - }, - "jsx-no-duplicate-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow duplicate properties in JSX", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-duplicate-props.md", - }, - "messages": { - "noDuplicateProps": "No duplicate props allowed", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreCase": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-leaked-render": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow problematic leaked values from being rendered", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-leaked-render.md", - }, - "fixable": "code", - "messages": { - "noPotentialLeakedRender": "Potential leaked value that might cause unintentionally rendered values or rendering crashes", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "validStrategies": { - "default": [ - "ternary", - "coerce", - ], - "items": { - "enum": [ - "ternary", - "coerce", - ], - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-literals": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow usage of string literals in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-literals.md", - }, - "messages": { - "invalidPropValue": "Invalid prop value: "{{text}}"", - "invalidPropValueInElement": "Invalid prop value: "{{text}}" in {{element}}", - "literalNotInJSXExpression": "Missing JSX expression container around literal string: "{{text}}"", - "literalNotInJSXExpressionInElement": "Missing JSX expression container around literal string: "{{text}}" in {{element}}", - "noStringsInAttributes": "Strings not allowed in attributes: "{{text}}"", - "noStringsInAttributesInElement": "Strings not allowed in attributes: "{{text}}" in {{element}}", - "noStringsInJSX": "Strings not allowed in JSX files: "{{text}}"", - "noStringsInJSXInElement": "Strings not allowed in JSX files: "{{text}}" in {{element}}", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowedStrings": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "elementOverrides": { - "patternProperties": { - "^[A-Z][\\w.]*$": { - "properties": { - "allowedStrings": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "applyToNestedElements": { - "type": "boolean", - }, - "ignoreProps": { - "type": "boolean", - }, - "noAttributeStrings": { - "type": "boolean", - }, - "noStrings": { - "type": "boolean", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - "ignoreProps": { - "type": "boolean", - }, - "noAttributeStrings": { - "type": "boolean", - }, - "noStrings": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-script-url": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of \`javascript:\` URLs", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-script-url.md", - }, - "messages": { - "noScriptURL": "A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML, try using dangerouslySetInnerHTML instead.", - }, - "schema": { - "anyOf": [ - { - "additionalItems": false, - "items": [ - { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - }, - "props": { - "items": { - "type": "string", - "uniqueItems": true, - }, - "type": "array", - }, - }, - "required": [ - "name", - "props", - ], - "type": "object", - }, - "type": "array", - "uniqueItems": true, - }, - { - "additionalItems": false, - "properties": { - "includeFromSettings": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - { - "additionalItems": false, - "items": [ - { - "additionalItems": false, - "properties": { - "includeFromSettings": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - ], - }, - }, - }, - "jsx-no-target-blank": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow \`target="_blank"\` attribute without \`rel="noreferrer"\`", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-target-blank.md", - }, - "fixable": "code", - "messages": { - "noTargetBlankWithoutNoopener": "Using target="_blank" without rel="noreferrer" or rel="noopener" (the former implies the latter and is preferred due to wider support) is a security risk: see https://mathiasbynens.github.io/rel-noopener/#recommendations", - "noTargetBlankWithoutNoreferrer": "Using target="_blank" without rel="noreferrer" (which implies rel="noopener") is a security risk in older browsers: see https://mathiasbynens.github.io/rel-noopener/#recommendations", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowReferrer": { - "type": "boolean", - }, - "enforceDynamicLinks": { - "enum": [ - "always", - "never", - ], - }, - "forms": { - "default": false, - "type": "boolean", - }, - "links": { - "default": true, - "type": "boolean", - }, - "warnOnSpreadAttributes": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-undef": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow undeclared variables in JSX", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-undef.md", - }, - "messages": { - "undefined": "'{{identifier}}' is not defined.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowGlobals": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-no-useless-fragment": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow unnecessary fragments", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-no-useless-fragment.md", - }, - "fixable": "code", - "messages": { - "ChildOfHtmlElement": "Passing a fragment to an HTML element is useless.", - "NeedsMoreChildren": "Fragments should contain more than one child - otherwise, there’s no need for a Fragment at all.", - }, - "schema": [ - { - "properties": { - "allowExpressions": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "jsx-one-expression-per-line": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Require one JSX element per line", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-one-expression-per-line.md", - }, - "fixable": "whitespace", - "messages": { - "moveToNewLine": "\`{{descriptor}}\` must be placed on a new line", - }, - "schema": [ - { - "additionalProperties": false, - "default": { - "allow": "none", - }, - "properties": { - "allow": { - "enum": [ - "none", - "literal", - "single-child", - "non-jsx", - ], - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-pascal-case": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce PascalCase for user-defined JSX components", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-pascal-case.md", - }, - "messages": { - "usePascalCase": "Imported JSX component {{name}} must be in PascalCase", - "usePascalOrSnakeCase": "Imported JSX component {{name}} must be in PascalCase or SCREAMING_SNAKE_CASE", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowAllCaps": { - "type": "boolean", - }, - "allowLeadingUnderscore": { - "type": "boolean", - }, - "allowNamespace": { - "type": "boolean", - }, - "ignore": { - "items": [ - { - "type": "string", - }, - ], - "minItems": 0, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-props-no-multi-spaces": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow multiple spaces between inline JSX props", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-props-no-multi-spaces.md", - }, - "fixable": "code", - "messages": { - "noLineGap": "Expected no line gap between “{{prop1}}” and “{{prop2}}”", - "onlyOneSpace": "Expected only one space between “{{prop1}}” and “{{prop2}}”", - }, - "schema": [], - }, - }, - "jsx-props-no-spread-multi": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow JSX prop spreading the same identifier multiple times", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-props-no-spread-multi.md", - }, - "messages": { - "noMultiSpreading": "Spreading the same expression multiple times is forbidden", - }, - }, - }, - "jsx-props-no-spreading": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow JSX prop spreading", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-props-no-spreading.md", - }, - "messages": { - "noSpreading": "Prop spreading is forbidden", - }, - "schema": [ - { - "allOf": [ - { - "properties": { - "custom": { - "enum": [ - "enforce", - "ignore", - ], - }, - "exceptions": { - "items": { - "type": "string", - "uniqueItems": true, - }, - "type": "array", - }, - "explicitSpread": { - "enum": [ - "enforce", - "ignore", - ], - }, - "html": { - "enum": [ - "enforce", - "ignore", - ], - }, - }, - "type": "object", - }, - { - "not": { - "properties": { - "custom": { - "enum": [ - "ignore", - ], - }, - "exceptions": { - "maxItems": 0, - "minItems": 0, - "type": "array", - }, - "html": { - "enum": [ - "ignore", - ], - }, - }, - "required": [ - "html", - "custom", - ], - "type": "object", - }, - }, - ], - }, - ], - }, - }, - "jsx-sort-default-props": { - "create": [Function], - "meta": { - "deprecated": true, - "docs": { - "category": "Stylistic Issues", - "description": "Enforce defaultProps declarations alphabetical sorting", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-sort-default-props.md", - }, - "messages": { - "propsNotSorted": "Default prop types declarations should be sorted alphabetically", - }, - "replacedBy": [ - "sort-default-props", - ], - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreCase": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-sort-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce props alphabetical sorting", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-sort-props.md", - }, - "fixable": "code", - "messages": { - "listCallbacksLast": "Callbacks must be listed after all other props", - "listIsEmpty": "A customized reserved first list must not be empty", - "listMultilineFirst": "Multiline props must be listed before all other props", - "listMultilineLast": "Multiline props must be listed after all other props", - "listReservedPropsFirst": "Reserved props must be listed before all other props", - "listShorthandFirst": "Shorthand props must be listed before all other props", - "listShorthandLast": "Shorthand props must be listed after all other props", - "noUnreservedProps": "A customized reserved first list must only contain a subset of React reserved props. Remove: {{unreservedWords}}", - "sortPropsByAlpha": "Props should be sorted alphabetically", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "callbacksLast": { - "type": "boolean", - }, - "ignoreCase": { - "type": "boolean", - }, - "locale": { - "default": "auto", - "type": "string", - }, - "multiline": { - "default": "ignore", - "enum": [ - "ignore", - "first", - "last", - ], - }, - "noSortAlphabetically": { - "type": "boolean", - }, - "reservedFirst": { - "type": [ - "array", - "boolean", - ], - }, - "shorthandFirst": { - "type": "boolean", - }, - "shorthandLast": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-space-before-closing": { - "create": [Function], - "meta": { - "deprecated": true, - "docs": { - "category": "Stylistic Issues", - "description": "Enforce spacing before closing bracket in JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-space-before-closing.md", - }, - "fixable": "code", - "messages": { - "needSpaceBeforeClose": "A space is required before closing bracket", - "noSpaceBeforeClose": "A space is forbidden before closing bracket", - }, - "replacedBy": [ - "jsx-tag-spacing", - ], - "schema": [ - { - "enum": [ - "always", - "never", - ], - }, - ], - }, - }, - "jsx-tag-spacing": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce whitespace in and around the JSX opening and closing brackets", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-tag-spacing.md", - }, - "fixable": "whitespace", - "messages": { - "afterOpenNeedSpace": "A space is required after opening bracket", - "afterOpenNoSpace": "A space is forbidden after opening bracket", - "beforeCloseNeedNewline": "A newline is required before closing bracket", - "beforeCloseNeedSpace": "Whitespace is required before closing bracket", - "beforeCloseNoSpace": "A space is forbidden before closing bracket", - "beforeSelfCloseNeedNewline": "A newline is required before closing bracket", - "beforeSelfCloseNeedSpace": "A space is required before closing bracket", - "beforeSelfCloseNoSpace": "A space is forbidden before closing bracket", - "closeSlashNeedSpace": "Whitespace is required between \`<\` and \`/\`; write \`< /\`", - "closeSlashNoSpace": "Whitespace is forbidden between \`<\` and \`/\`; write \`\`; write \`/ >\`", - "selfCloseSlashNoSpace": "Whitespace is forbidden between \`/\` and \`>\`; write \`/>\`", - }, - "schema": [ - { - "additionalProperties": false, - "default": { - "afterOpening": "never", - "beforeClosing": "allow", - "beforeSelfClosing": "always", - "closingSlash": "never", - }, - "properties": { - "afterOpening": { - "enum": [ - "always", - "allow-multiline", - "never", - "allow", - ], - }, - "beforeClosing": { - "enum": [ - "always", - "proportional-always", - "never", - "allow", - ], - }, - "beforeSelfClosing": { - "enum": [ - "always", - "proportional-always", - "never", - "allow", - ], - }, - "closingSlash": { - "enum": [ - "always", - "never", - "allow", - ], - }, - }, - "type": "object", - }, - ], - }, - }, - "jsx-uses-react": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow React to be incorrectly marked as unused", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-uses-react.md", - }, - "schema": [], - }, - }, - "jsx-uses-vars": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow variables used in JSX to be incorrectly marked as unused", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-uses-vars.md", - }, - "schema": [], - }, - }, - "jsx-wrap-multilines": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow missing parentheses around multiline JSX", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/jsx-wrap-multilines.md", - }, - "fixable": "code", - "messages": { - "extraParens": "Expected no parentheses around multilines JSX", - "missingParens": "Missing parentheses around multilines JSX", - "parensOnNewLines": "Parentheses around JSX should be on separate lines", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "arrow": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - "assignment": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - "condition": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - "declaration": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - "logical": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - "prop": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - "return": { - "enum": [ - true, - false, - "ignore", - "parens", - "parens-new-line", - "never", - ], - }, - }, - "type": "object", - }, - ], - }, - }, - "no-access-state-in-setstate": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow when this.state is accessed within setState", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-access-state-in-setstate.md", - }, - "messages": { - "useCallback": "Use callback in setState when referencing the previous state.", - }, - }, - }, - "no-adjacent-inline-elements": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow adjacent inline elements not separated by whitespace.", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-adjacent-inline-elements.md", - }, - "messages": { - "inlineElement": "Child elements which render as inline HTML elements should be separated by a space or wrapped in block level elements.", - }, - "schema": [], - }, - }, - "no-array-index-key": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of Array index in keys", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-array-index-key.md", - }, - "messages": { - "noArrayIndex": "Do not use Array index in keys", - }, - "schema": [], - }, - }, - "no-arrow-function-lifecycle": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Lifecycle methods should be methods on the prototype, not class fields", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-arrow-function-lifecycle.md", - }, - "fixable": "code", - "messages": { - "lifecycle": "{{propertyName}} is a React lifecycle method, and should not be an arrow function or in a class field. Use an instance method instead.", - }, - "schema": [], - }, - }, - "no-children-prop": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow passing of children as props", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-children-prop.md", - }, - "messages": { - "nestChildren": "Do not pass children as props. Instead, nest children between the opening and closing tags.", - "nestFunction": "Do not nest a function between the opening and closing tags. Instead, pass it as a prop.", - "passChildrenAsArgs": "Do not pass children as props. Instead, pass them as additional arguments to React.createElement.", - "passFunctionAsArgs": "Do not pass a function as an additional argument to React.createElement. Instead, pass it as a prop.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowFunctions": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-danger": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of dangerous JSX properties", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-danger.md", - }, - "messages": { - "dangerousProp": "Dangerous property '{{name}}' found", - }, - "schema": [ - { - "properties": { - "customComponentNames": { - "items": { - "type": "string", - }, - "minItems": 0, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - }, - }, - "no-danger-with-children": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow when a DOM element is using both children and dangerouslySetInnerHTML", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-danger-with-children.md", - }, - "messages": { - "dangerWithChildren": "Only set one of \`children\` or \`props.dangerouslySetInnerHTML\`", - }, - "schema": [], - }, - }, - "no-deprecated": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of deprecated methods", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-deprecated.md", - }, - "messages": { - "deprecated": "{{oldMethod}} is deprecated since React {{version}}{{newMethod}}{{refs}}", - }, - "schema": [], - }, - }, - "no-did-mount-set-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of setState in componentDidMount", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-did-mount-set-state.md", - }, - "messages": { - "noSetState": "Do not use setState in {{name}}", - }, - "schema": [ - { - "enum": [ - "disallow-in-func", - ], - }, - ], - }, - }, - "no-did-update-set-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of setState in componentDidUpdate", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-did-update-set-state.md", - }, - "messages": { - "noSetState": "Do not use setState in {{name}}", - }, - "schema": [ - { - "enum": [ - "disallow-in-func", - ], - }, - ], - }, - }, - "no-direct-mutation-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow direct mutation of this.state", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-direct-mutation-state.md", - }, - "messages": { - "noDirectMutation": "Do not mutate state directly. Use setState().", - }, - }, - }, - "no-find-dom-node": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of findDOMNode", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-find-dom-node.md", - }, - "messages": { - "noFindDOMNode": "Do not use findDOMNode. It doesn’t work with function components and is deprecated in StrictMode. See https://reactjs.org/docs/react-dom.html#finddomnode", - }, - "schema": [], - }, - }, - "no-invalid-html-attribute": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow usage of invalid attributes", - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-invalid-html-attribute.md", - }, - "hasSuggestions": true, - "messages": { - "emptyIsMeaningless": "An empty “{{attributeName}}” attribute is meaningless.", - "neverValid": "“{{reportingValue}}” is never a valid “{{attributeName}}” attribute value.", - "noEmpty": "An empty “{{attributeName}}” attribute is meaningless.", - "noMethod": "The ”{{attributeName}}“ attribute cannot be a method.", - "notAlone": "“{{reportingValue}}” must be directly followed by “{{missingValue}}”.", - "notPaired": "“{{reportingValue}}” can not be directly followed by “{{secondValue}}” without “{{missingValue}}”.", - "notValidFor": "“{{reportingValue}}” is not a valid “{{attributeName}}” attribute value for <{{elementName}}>.", - "onlyMeaningfulFor": "The ”{{attributeName}}“ attribute only has meaning on the tags: {{tagNames}}", - "onlyStrings": "“{{attributeName}}” attribute only supports strings.", - "spaceDelimited": "”{{attributeName}}“ attribute values should be space delimited.", - "suggestRemoveDefault": ""remove {{attributeName}}"", - "suggestRemoveEmpty": ""remove empty attribute {{attributeName}}"", - "suggestRemoveInvalid": "“remove invalid attribute {{reportingValue}}”", - "suggestRemoveNonString": "remove non-string value in “{{attributeName}}”", - "suggestRemoveWhitespaces": "remove whitespaces in “{{attributeName}}”", - }, - "schema": [ - { - "items": { - "enum": [ - "rel", - ], - }, - "type": "array", - "uniqueItems": true, - }, - ], - "type": "suggestion", - }, - }, - "no-is-mounted": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of isMounted", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-is-mounted.md", - }, - "messages": { - "noIsMounted": "Do not use isMounted", - }, - "schema": [], - }, - }, - "no-multi-comp": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow multiple component definition per file", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-multi-comp.md", - }, - "messages": { - "onlyOneComponent": "Declare only one React component per file", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreStateless": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-namespace": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Enforce that namespaces are not used in React elements", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-namespace.md", - }, - "messages": { - "noNamespace": "React component {{name}} must not be in a namespace, as React does not support them", - }, - "schema": [], - }, - }, - "no-object-type-as-default-prop": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of referential-type variables as default param in functional component", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-object-type-as-default-prop.md", - }, - "messages": { - "forbiddenTypeDefaultParam": "{{propName}} has a/an {{forbiddenType}} as default prop. This could lead to potential infinite render loop in React. Use a variable reference instead of {{forbiddenType}}.", - }, - }, - }, - "no-redundant-should-component-update": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow usage of shouldComponentUpdate when extending React.PureComponent", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-redundant-should-component-update.md", - }, - "messages": { - "noShouldCompUpdate": "{{component}} does not need shouldComponentUpdate when extending React.PureComponent.", - }, - "schema": [], - }, - }, - "no-render-return-value": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of the return value of ReactDOM.render", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-render-return-value.md", - }, - "messages": { - "noReturnValue": "Do not depend on the return value from {{node}}.render", - }, - "schema": [], - }, - }, - "no-set-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow usage of setState", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-set-state.md", - }, - "messages": { - "noSetState": "Do not use setState", - }, - "schema": [], - }, - }, - "no-string-refs": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow using string references", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-string-refs.md", - }, - "messages": { - "stringInRefDeprecated": "Using string literals in ref attributes is deprecated.", - "thisRefsDeprecated": "Using this.refs is deprecated.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "noTemplateLiterals": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-this-in-sfc": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow \`this\` from being used in stateless functional components", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-this-in-sfc.md", - }, - "messages": { - "noThisInSFC": "Stateless functional components should not use \`this\`", - }, - "schema": [], - }, - }, - "no-typos": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow common typos", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-typos.md", - }, - "messages": { - "noPropTypesBinding": "\`'prop-types'\` imported without a local \`PropTypes\` binding.", - "noReactBinding": "\`'react'\` imported without a local \`React\` binding.", - "staticLifecycleMethod": "Lifecycle method should be static: {{method}}", - "typoLifecycleMethod": "Typo in component lifecycle method declaration: {{actual}} should be {{expected}}", - "typoPropDeclaration": "Typo in property declaration", - "typoPropType": "Typo in declared prop type: {{name}}", - "typoPropTypeChain": "Typo in prop type chain qualifier: {{name}}", - "typoStaticClassProp": "Typo in static class property declaration", - }, - "schema": [], - }, - }, - "no-unescaped-entities": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow unescaped HTML entities from appearing in markup", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unescaped-entities.md", - }, - "hasSuggestions": true, - "messages": { - "replaceWithAlt": "Replace with \`{{alt}}\`.", - "unescapedEntity": "HTML entity, \`{{entity}}\` , must be escaped.", - "unescapedEntityAlts": "\`{{entity}}\` can be escaped with {{alts}}.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "forbid": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "properties": { - "alternatives": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "char": { - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-unknown-property": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow usage of unknown DOM property", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unknown-property.md", - }, - "fixable": "code", - "messages": { - "dataLowercaseRequired": "React does not recognize data-* props with uppercase characters on a DOM element. Found '{{name}}', use '{{lowerCaseName}}' instead", - "invalidPropOnTag": "Invalid property '{{name}}' found on tag '{{tagName}}', but it is only allowed on: {{allowedTags}}", - "unknownProp": "Unknown property '{{name}}' found", - "unknownPropWithStandardName": "Unknown property '{{name}}' found, use '{{standardName}}' instead", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignore": { - "items": { - "type": "string", - }, - "type": "array", - }, - "requireDataLowercase": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-unsafe": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of unsafe lifecycle methods", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unsafe.md", - }, - "messages": { - "unsafeMethod": "{{method}} is unsafe for use in async rendering. Update the component to use {{newMethod}} instead. {{details}}", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "checkAliases": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-unstable-nested-components": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow creating unstable components inside components", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unstable-nested-components.md", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowAsProps": { - "type": "boolean", - }, - "customValidators": { - "items": { - "type": "string", - }, - "type": "array", - }, - "propNamePattern": { - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-unused-class-component-methods": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow declaring unused methods of component class", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unused-class-component-methods.md", - }, - "messages": { - "unused": "Unused method or property "{{name}}"", - "unusedWithClass": "Unused method or property "{{name}}" of class "{{className}}"", - }, - "schema": [], - }, - }, - "no-unused-prop-types": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow definitions of unused propTypes", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unused-prop-types.md", - }, - "messages": { - "unusedPropType": "'{{name}}' PropType is defined but prop is never used", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "customValidators": { - "items": { - "type": "string", - }, - "type": "array", - }, - "ignore": { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - "skipShapeProps": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "no-unused-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow definitions of unused state", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-unused-state.md", - }, - "messages": { - "unusedStateField": "Unused state field: '{{name}}'", - }, - "schema": [], - }, - }, - "no-will-update-set-state": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow usage of setState in componentWillUpdate", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/no-will-update-set-state.md", - }, - "messages": { - "noSetState": "Do not use setState in {{name}}", - }, - "schema": [ - { - "enum": [ - "disallow-in-func", - ], - }, - ], - }, - }, - "prefer-es6-class": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce ES5 or ES6 class for React Components", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-es6-class.md", - }, - "messages": { - "shouldUseCreateClass": "Component should use createClass instead of es6 class", - "shouldUseES6Class": "Component should use es6 class instead of createClass", - }, - "schema": [ - { - "enum": [ - "always", - "never", - ], - }, - ], - }, - }, - "prefer-exact-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Prefer exact proptype definitions", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-exact-props.md", - }, - "messages": { - "flow": "Component flow props should be set with exact objects.", - "propTypes": "Component propTypes should be exact by using {{exactPropWrappers}}.", - }, - "schema": [], - }, - }, - "prefer-read-only-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce that props are read-only", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-read-only-props.md", - }, - "fixable": "code", - "messages": { - "readOnlyProp": "Prop '{{name}}' should be read-only.", - }, - "schema": [], - }, - }, - "prefer-stateless-function": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce stateless components to be written as a pure function", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prefer-stateless-function.md", - }, - "messages": { - "componentShouldBePure": "Component should be written as a pure function", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignorePureComponents": { - "default": false, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "prop-types": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow missing props validation in a React component definition", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/prop-types.md", - }, - "messages": { - "missingPropType": "'{{name}}' is missing in props validation", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "customValidators": { - "items": { - "type": "string", - }, - "type": "array", - }, - "ignore": { - "items": { - "type": "string", - }, - "type": "array", - }, - "skipUndeclared": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "react-in-jsx-scope": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Disallow missing React when using JSX", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/react-in-jsx-scope.md", - }, - "messages": { - "notInScope": "'{{name}}' must be in scope when using JSX", - }, - "schema": [], - }, - }, - "require-default-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Enforce a defaultProps definition for every prop that is not a required prop", - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/require-default-props.md", - }, - "messages": { - "destructureInSignature": "Must destructure props in the function signature to initialize an optional prop.", - "noDefaultPropsWithFunction": "Don’t use defaultProps with function components.", - "noDefaultWithRequired": "propType "{{name}}" is required and should not have a defaultProps declaration.", - "shouldAssignObjectDefault": "propType "{{name}}" is not required, but has no corresponding default argument value.", - "shouldHaveDefault": "propType "{{name}}" is not required, but has no corresponding defaultProps declaration.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "classes": { - "enum": [ - "defaultProps", - "ignore", - ], - }, - "forbidDefaultForRequired": { - "type": "boolean", - }, - "functions": { - "enum": [ - "defaultArguments", - "defaultProps", - "ignore", - ], - }, - "ignoreFunctionalComponents": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "require-optimization": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Enforce React components to have a shouldComponentUpdate method", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/require-optimization.md", - }, - "messages": { - "noShouldComponentUpdate": "Component is not optimized. Please add a shouldComponentUpdate method.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowDecorators": { - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "require-render-return": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Enforce ES5 or ES6 class for returning value in render function", - "recommended": true, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/require-render-return.md", - }, - "messages": { - "noRenderReturn": "Your render method should have a return statement", - }, - "schema": [], - }, - }, - "self-closing-comp": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Disallow extra closing tags for components without children", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/self-closing-comp.md", - }, - "fixable": "code", - "messages": { - "notSelfClosing": "Empty components are self-closing", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "component": { - "default": true, - "type": "boolean", - }, - "html": { - "default": true, - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "sort-comp": { - "create": [Function], - "defaultConfig": { - "groups": { - "lifecycle": [ - "displayName", - "propTypes", - "contextTypes", - "childContextTypes", - "mixins", - "statics", - "defaultProps", - "constructor", - "getDefaultProps", - "state", - "getInitialState", - "getChildContext", - "getDerivedStateFromProps", - "componentWillMount", - "UNSAFE_componentWillMount", - "componentDidMount", - "componentWillReceiveProps", - "UNSAFE_componentWillReceiveProps", - "shouldComponentUpdate", - "componentWillUpdate", - "UNSAFE_componentWillUpdate", - "getSnapshotBeforeUpdate", - "componentDidUpdate", - "componentDidCatch", - "componentWillUnmount", - ], - }, - "order": [ - "static-methods", - "lifecycle", - "everything-else", - "render", - ], - }, - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce component methods order", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/sort-comp.md", - }, - "messages": { - "unsortedProps": "{{propA}} should be placed {{position}} {{propB}}", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "groups": { - "patternProperties": { - "^.*$": { - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - "order": { - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "sort-default-props": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce defaultProps declarations alphabetical sorting", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/sort-default-props.md", - }, - "messages": { - "propsNotSorted": "Default prop types declarations should be sorted alphabetically", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreCase": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "sort-prop-types": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce propTypes declarations alphabetical sorting", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/sort-prop-types.md", - }, - "fixable": "code", - "messages": { - "callbackPropsLast": "Callback prop types must be listed after all other prop types", - "propsNotSorted": "Prop types declarations should be sorted alphabetically", - "requiredPropsFirst": "Required prop types must be listed before all other prop types", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "callbacksLast": { - "type": "boolean", - }, - "checkTypes": { - "type": "boolean", - }, - "ignoreCase": { - "type": "boolean", - }, - "noSortAlphabetically": { - "type": "boolean", - }, - "requiredFirst": { - "type": "boolean", - }, - "sortShapeProp": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "state-in-constructor": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforce class component state initialization style", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/state-in-constructor.md", - }, - "messages": { - "stateInitClassProp": "State initialization should be in a class property", - "stateInitConstructor": "State initialization should be in a constructor", - }, - "schema": [ - { - "enum": [ - "always", - "never", - ], - }, - ], - }, - }, - "static-property-placement": { - "create": [Function], - "meta": { - "docs": { - "category": "Stylistic Issues", - "description": "Enforces where React component static properties should be positioned.", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/static-property-placement.md", - }, - "fixable": null, - "messages": { - "declareOutsideClass": "'{{name}}' should be declared outside the class body.", - "notGetterClassFunc": "'{{name}}' should be declared as a static getter class function.", - "notStaticClassProp": "'{{name}}' should be declared as a static class property.", - }, - "schema": [ - { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - { - "additionalProperties": false, - "properties": { - "childContextTypes": { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - "contextType": { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - "contextTypes": { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - "defaultProps": { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - "displayName": { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - "propTypes": { - "enum": [ - "static public field", - "static getter", - "property assignment", - ], - }, - }, - "type": "object", - }, - ], - }, - }, - "style-prop-object": { - "create": [Function], - "meta": { - "docs": { - "category": "Possible Errors", - "description": "Enforce style prop value is an object", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/style-prop-object.md", - }, - "messages": { - "stylePropNotObject": "Style prop value must be an object", - }, - "schema": [ - { - "properties": { - "allow": { - "additionalItems": false, - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - }, - }, - "void-dom-elements-no-children": { - "create": [Function], - "meta": { - "docs": { - "category": "Best Practices", - "description": "Disallow void DOM elements (e.g. \`\`, \`
\`) from receiving children", - "recommended": false, - "url": "https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules/void-dom-elements-no-children.md", - }, - "messages": { - "noChildrenInVoidEl": "Void DOM element <{{element}} /> cannot receive children.", - }, - "schema": [], - }, - }, - }, - }, - }, - "rules": { - "react/display-name": 2, - "react/jsx-key": 2, - "react/jsx-no-comment-textnodes": 2, - "react/jsx-no-duplicate-props": 2, - "react/jsx-no-target-blank": 2, - "react/jsx-no-undef": 2, - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/no-children-prop": 2, - "react/no-danger-with-children": 2, - "react/no-deprecated": 2, - "react/no-direct-mutation-state": 2, - "react/no-find-dom-node": 2, - "react/no-is-mounted": 2, - "react/no-render-return-value": 2, - "react/no-string-refs": 2, - "react/no-unescaped-entities": 2, - "react/no-unknown-property": 2, - "react/no-unsafe": 0, - "react/prop-types": 2, - "react/react-in-jsx-scope": 2, - "react/require-render-return": 2, - }, - }, - { - "rules": { - "constructor-super": "error", - "for-direction": "error", - "getter-return": "error", - "no-async-promise-executor": "error", - "no-case-declarations": "error", - "no-class-assign": "error", - "no-compare-neg-zero": "error", - "no-cond-assign": "error", - "no-const-assign": "error", - "no-constant-binary-expression": "error", - "no-constant-condition": "error", - "no-control-regex": "error", - "no-debugger": "error", - "no-delete-var": "error", - "no-dupe-args": "error", - "no-dupe-class-members": "error", - "no-dupe-else-if": "error", - "no-dupe-keys": "error", - "no-duplicate-case": "error", - "no-empty": "error", - "no-empty-character-class": "error", - "no-empty-pattern": "error", - "no-empty-static-block": "error", - "no-ex-assign": "error", - "no-extra-boolean-cast": "error", - "no-fallthrough": "error", - "no-func-assign": "error", - "no-global-assign": "error", - "no-import-assign": "error", - "no-invalid-regexp": "error", - "no-irregular-whitespace": "error", - "no-loss-of-precision": "error", - "no-misleading-character-class": "error", - "no-new-native-nonconstructor": "error", - "no-nonoctal-decimal-escape": "error", - "no-obj-calls": "error", - "no-octal": "error", - "no-prototype-builtins": "error", - "no-redeclare": "error", - "no-regex-spaces": "error", - "no-self-assign": "error", - "no-setter-return": "error", - "no-shadow-restricted-names": "error", - "no-sparse-arrays": "error", - "no-this-before-super": "error", - "no-undef": "error", - "no-unexpected-multiline": "error", - "no-unreachable": "error", - "no-unsafe-finally": "error", - "no-unsafe-negation": "error", - "no-unsafe-optional-chaining": "error", - "no-unused-labels": "error", - "no-unused-private-class-members": "error", - "no-unused-vars": "error", - "no-useless-backreference": "error", - "no-useless-catch": "error", - "no-useless-escape": "error", - "no-with": "error", - "require-yield": "error", - "use-isnan": "error", - "valid-typeof": "error", - }, - }, - { - "name": "eslint-plugin-prettier/recommended", - "plugins": { - "prettier": { - "configs": { - "recommended": { - "extends": [ - "prettier", - ], - "plugins": [ - "prettier", - ], - "rules": { - "arrow-body-style": "off", - "prefer-arrow-callback": "off", - "prettier/prettier": "error", - }, - }, - }, - "meta": { - "name": "eslint-plugin-prettier", - "version": "5.2.3", - }, - "rules": { - "prettier": { - "create": [Function], - "meta": { - "docs": { - "url": "https://github.com/prettier/eslint-plugin-prettier#options", - }, - "fixable": "code", - "messages": { - "delete": "Delete \`{{ deleteText }}\`", - "insert": "Insert \`{{ insertText }}\`", - "replace": "Replace \`{{ deleteText }}\` with \`{{ insertText }}\`", - }, - "schema": [ - { - "additionalProperties": true, - "properties": {}, - "type": "object", - }, - { - "additionalProperties": true, - "properties": { - "fileInfoOptions": { - "additionalProperties": true, - "properties": {}, - "type": "object", - }, - "usePrettierrc": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "layout", - }, - }, - }, - }, - }, - "rules": { - "@babel/object-curly-spacing": "off", - "@babel/semi": "off", - "@stylistic/array-bracket-newline": "off", - "@stylistic/array-bracket-spacing": "off", - "@stylistic/array-element-newline": "off", - "@stylistic/arrow-parens": "off", - "@stylistic/arrow-spacing": "off", - "@stylistic/block-spacing": "off", - "@stylistic/brace-style": "off", - "@stylistic/comma-dangle": "off", - "@stylistic/comma-spacing": "off", - "@stylistic/comma-style": "off", - "@stylistic/computed-property-spacing": "off", - "@stylistic/dot-location": "off", - "@stylistic/eol-last": "off", - "@stylistic/func-call-spacing": "off", - "@stylistic/function-call-argument-newline": "off", - "@stylistic/function-call-spacing": "off", - "@stylistic/function-paren-newline": "off", - "@stylistic/generator-star-spacing": "off", - "@stylistic/implicit-arrow-linebreak": "off", - "@stylistic/indent": "off", - "@stylistic/indent-binary-ops": "off", - "@stylistic/js/array-bracket-newline": "off", - "@stylistic/js/array-bracket-spacing": "off", - "@stylistic/js/array-element-newline": "off", - "@stylistic/js/arrow-parens": "off", - "@stylistic/js/arrow-spacing": "off", - "@stylistic/js/block-spacing": "off", - "@stylistic/js/brace-style": "off", - "@stylistic/js/comma-dangle": "off", - "@stylistic/js/comma-spacing": "off", - "@stylistic/js/comma-style": "off", - "@stylistic/js/computed-property-spacing": "off", - "@stylistic/js/dot-location": "off", - "@stylistic/js/eol-last": "off", - "@stylistic/js/func-call-spacing": "off", - "@stylistic/js/function-call-argument-newline": "off", - "@stylistic/js/function-call-spacing": "off", - "@stylistic/js/function-paren-newline": "off", - "@stylistic/js/generator-star-spacing": "off", - "@stylistic/js/implicit-arrow-linebreak": "off", - "@stylistic/js/indent": "off", - "@stylistic/js/jsx-quotes": "off", - "@stylistic/js/key-spacing": "off", - "@stylistic/js/keyword-spacing": "off", - "@stylistic/js/linebreak-style": "off", - "@stylistic/js/lines-around-comment": 0, - "@stylistic/js/max-len": 0, - "@stylistic/js/max-statements-per-line": "off", - "@stylistic/js/multiline-ternary": "off", - "@stylistic/js/new-parens": "off", - "@stylistic/js/newline-per-chained-call": "off", - "@stylistic/js/no-confusing-arrow": 0, - "@stylistic/js/no-extra-parens": "off", - "@stylistic/js/no-extra-semi": "off", - "@stylistic/js/no-floating-decimal": "off", - "@stylistic/js/no-mixed-operators": 0, - "@stylistic/js/no-mixed-spaces-and-tabs": "off", - "@stylistic/js/no-multi-spaces": "off", - "@stylistic/js/no-multiple-empty-lines": "off", - "@stylistic/js/no-tabs": 0, - "@stylistic/js/no-trailing-spaces": "off", - "@stylistic/js/no-whitespace-before-property": "off", - "@stylistic/js/nonblock-statement-body-position": "off", - "@stylistic/js/object-curly-newline": "off", - "@stylistic/js/object-curly-spacing": "off", - "@stylistic/js/object-property-newline": "off", - "@stylistic/js/one-var-declaration-per-line": "off", - "@stylistic/js/operator-linebreak": "off", - "@stylistic/js/padded-blocks": "off", - "@stylistic/js/quote-props": "off", - "@stylistic/js/quotes": 0, - "@stylistic/js/rest-spread-spacing": "off", - "@stylistic/js/semi": "off", - "@stylistic/js/semi-spacing": "off", - "@stylistic/js/semi-style": "off", - "@stylistic/js/space-before-blocks": "off", - "@stylistic/js/space-before-function-paren": "off", - "@stylistic/js/space-in-parens": "off", - "@stylistic/js/space-infix-ops": "off", - "@stylistic/js/space-unary-ops": "off", - "@stylistic/js/switch-colon-spacing": "off", - "@stylistic/js/template-curly-spacing": "off", - "@stylistic/js/template-tag-spacing": "off", - "@stylistic/js/wrap-iife": "off", - "@stylistic/js/wrap-regex": "off", - "@stylistic/js/yield-star-spacing": "off", - "@stylistic/jsx-child-element-spacing": "off", - "@stylistic/jsx-closing-bracket-location": "off", - "@stylistic/jsx-closing-tag-location": "off", - "@stylistic/jsx-curly-newline": "off", - "@stylistic/jsx-curly-spacing": "off", - "@stylistic/jsx-equals-spacing": "off", - "@stylistic/jsx-first-prop-new-line": "off", - "@stylistic/jsx-indent": "off", - "@stylistic/jsx-indent-props": "off", - "@stylistic/jsx-max-props-per-line": "off", - "@stylistic/jsx-newline": "off", - "@stylistic/jsx-one-expression-per-line": "off", - "@stylistic/jsx-props-no-multi-spaces": "off", - "@stylistic/jsx-quotes": "off", - "@stylistic/jsx-tag-spacing": "off", - "@stylistic/jsx-wrap-multilines": "off", - "@stylistic/jsx/jsx-child-element-spacing": "off", - "@stylistic/jsx/jsx-closing-bracket-location": "off", - "@stylistic/jsx/jsx-closing-tag-location": "off", - "@stylistic/jsx/jsx-curly-newline": "off", - "@stylistic/jsx/jsx-curly-spacing": "off", - "@stylistic/jsx/jsx-equals-spacing": "off", - "@stylistic/jsx/jsx-first-prop-new-line": "off", - "@stylistic/jsx/jsx-indent": "off", - "@stylistic/jsx/jsx-indent-props": "off", - "@stylistic/jsx/jsx-max-props-per-line": "off", - "@stylistic/key-spacing": "off", - "@stylistic/keyword-spacing": "off", - "@stylistic/linebreak-style": "off", - "@stylistic/lines-around-comment": 0, - "@stylistic/max-len": 0, - "@stylistic/max-statements-per-line": "off", - "@stylistic/member-delimiter-style": "off", - "@stylistic/multiline-ternary": "off", - "@stylistic/new-parens": "off", - "@stylistic/newline-per-chained-call": "off", - "@stylistic/no-confusing-arrow": 0, - "@stylistic/no-extra-parens": "off", - "@stylistic/no-extra-semi": "off", - "@stylistic/no-floating-decimal": "off", - "@stylistic/no-mixed-operators": 0, - "@stylistic/no-mixed-spaces-and-tabs": "off", - "@stylistic/no-multi-spaces": "off", - "@stylistic/no-multiple-empty-lines": "off", - "@stylistic/no-tabs": 0, - "@stylistic/no-trailing-spaces": "off", - "@stylistic/no-whitespace-before-property": "off", - "@stylistic/nonblock-statement-body-position": "off", - "@stylistic/object-curly-newline": "off", - "@stylistic/object-curly-spacing": "off", - "@stylistic/object-property-newline": "off", - "@stylistic/one-var-declaration-per-line": "off", - "@stylistic/operator-linebreak": "off", - "@stylistic/padded-blocks": "off", - "@stylistic/quote-props": "off", - "@stylistic/quotes": 0, - "@stylistic/rest-spread-spacing": "off", - "@stylistic/semi": "off", - "@stylistic/semi-spacing": "off", - "@stylistic/semi-style": "off", - "@stylistic/space-before-blocks": "off", - "@stylistic/space-before-function-paren": "off", - "@stylistic/space-in-parens": "off", - "@stylistic/space-infix-ops": "off", - "@stylistic/space-unary-ops": "off", - "@stylistic/switch-colon-spacing": "off", - "@stylistic/template-curly-spacing": "off", - "@stylistic/template-tag-spacing": "off", - "@stylistic/ts/block-spacing": "off", - "@stylistic/ts/brace-style": "off", - "@stylistic/ts/comma-dangle": "off", - "@stylistic/ts/comma-spacing": "off", - "@stylistic/ts/func-call-spacing": "off", - "@stylistic/ts/function-call-spacing": "off", - "@stylistic/ts/indent": "off", - "@stylistic/ts/key-spacing": "off", - "@stylistic/ts/keyword-spacing": "off", - "@stylistic/ts/lines-around-comment": 0, - "@stylistic/ts/member-delimiter-style": "off", - "@stylistic/ts/no-extra-parens": "off", - "@stylistic/ts/no-extra-semi": "off", - "@stylistic/ts/object-curly-spacing": "off", - "@stylistic/ts/quotes": 0, - "@stylistic/ts/semi": "off", - "@stylistic/ts/space-before-blocks": "off", - "@stylistic/ts/space-before-function-paren": "off", - "@stylistic/ts/space-infix-ops": "off", - "@stylistic/ts/type-annotation-spacing": "off", - "@stylistic/type-annotation-spacing": "off", - "@stylistic/type-generic-spacing": "off", - "@stylistic/type-named-tuple-spacing": "off", - "@stylistic/wrap-iife": "off", - "@stylistic/wrap-regex": "off", - "@stylistic/yield-star-spacing": "off", - "@typescript-eslint/block-spacing": "off", - "@typescript-eslint/brace-style": "off", - "@typescript-eslint/comma-dangle": "off", - "@typescript-eslint/comma-spacing": "off", - "@typescript-eslint/func-call-spacing": "off", - "@typescript-eslint/indent": "off", - "@typescript-eslint/key-spacing": "off", - "@typescript-eslint/keyword-spacing": "off", - "@typescript-eslint/lines-around-comment": 0, - "@typescript-eslint/member-delimiter-style": "off", - "@typescript-eslint/no-extra-parens": "off", - "@typescript-eslint/no-extra-semi": "off", - "@typescript-eslint/object-curly-spacing": "off", - "@typescript-eslint/quotes": 0, - "@typescript-eslint/semi": "off", - "@typescript-eslint/space-before-blocks": "off", - "@typescript-eslint/space-before-function-paren": "off", - "@typescript-eslint/space-infix-ops": "off", - "@typescript-eslint/type-annotation-spacing": "off", - "array-bracket-newline": "off", - "array-bracket-spacing": "off", - "array-element-newline": "off", - "arrow-body-style": "off", - "arrow-parens": "off", - "arrow-spacing": "off", - "babel/object-curly-spacing": "off", - "babel/quotes": 0, - "babel/semi": "off", - "block-spacing": "off", - "brace-style": "off", - "comma-dangle": "off", - "comma-spacing": "off", - "comma-style": "off", - "computed-property-spacing": "off", - "curly": 0, - "dot-location": "off", - "eol-last": "off", - "flowtype/boolean-style": "off", - "flowtype/delimiter-dangle": "off", - "flowtype/generic-spacing": "off", - "flowtype/object-type-curly-spacing": "off", - "flowtype/object-type-delimiter": "off", - "flowtype/quotes": "off", - "flowtype/semi": "off", - "flowtype/space-after-type-colon": "off", - "flowtype/space-before-generic-bracket": "off", - "flowtype/space-before-type-colon": "off", - "flowtype/union-intersection-spacing": "off", - "func-call-spacing": "off", - "function-call-argument-newline": "off", - "function-paren-newline": "off", - "generator-star": "off", - "generator-star-spacing": "off", - "implicit-arrow-linebreak": "off", - "indent": "off", - "indent-legacy": "off", - "jsx-quotes": "off", - "key-spacing": "off", - "keyword-spacing": "off", - "linebreak-style": "off", - "lines-around-comment": 0, - "max-len": 0, - "max-statements-per-line": "off", - "multiline-ternary": "off", - "new-parens": "off", - "newline-per-chained-call": "off", - "no-arrow-condition": "off", - "no-comma-dangle": "off", - "no-confusing-arrow": 0, - "no-extra-parens": "off", - "no-extra-semi": "off", - "no-floating-decimal": "off", - "no-mixed-operators": 0, - "no-mixed-spaces-and-tabs": "off", - "no-multi-spaces": "off", - "no-multiple-empty-lines": "off", - "no-reserved-keys": "off", - "no-space-before-semi": "off", - "no-spaced-func": "off", - "no-tabs": 0, - "no-trailing-spaces": "off", - "no-unexpected-multiline": 0, - "no-whitespace-before-property": "off", - "no-wrap-func": "off", - "nonblock-statement-body-position": "off", - "object-curly-newline": "off", - "object-curly-spacing": "off", - "object-property-newline": "off", - "one-var-declaration-per-line": "off", - "operator-linebreak": "off", - "padded-blocks": "off", - "prefer-arrow-callback": "off", - "prettier/prettier": "error", - "quote-props": "off", - "quotes": 0, - "react/jsx-child-element-spacing": "off", - "react/jsx-closing-bracket-location": "off", - "react/jsx-closing-tag-location": "off", - "react/jsx-curly-newline": "off", - "react/jsx-curly-spacing": "off", - "react/jsx-equals-spacing": "off", - "react/jsx-first-prop-new-line": "off", - "react/jsx-indent": "off", - "react/jsx-indent-props": "off", - "react/jsx-max-props-per-line": "off", - "react/jsx-newline": "off", - "react/jsx-one-expression-per-line": "off", - "react/jsx-props-no-multi-spaces": "off", - "react/jsx-space-before-closing": "off", - "react/jsx-tag-spacing": "off", - "react/jsx-wrap-multilines": "off", - "rest-spread-spacing": "off", - "semi": "off", - "semi-spacing": "off", - "semi-style": "off", - "space-after-function-name": "off", - "space-after-keywords": "off", - "space-before-blocks": "off", - "space-before-function-paren": "off", - "space-before-function-parentheses": "off", - "space-before-keywords": "off", - "space-in-brackets": "off", - "space-in-parens": "off", - "space-infix-ops": "off", - "space-return-throw-case": "off", - "space-unary-ops": "off", - "space-unary-word-ops": "off", - "standard/array-bracket-even-spacing": "off", - "standard/computed-property-even-spacing": "off", - "standard/object-curly-even-spacing": "off", - "switch-colon-spacing": "off", - "template-curly-spacing": "off", - "template-tag-spacing": "off", - "unicorn/empty-brace-spaces": "off", - "unicorn/no-nested-ternary": "off", - "unicorn/number-literal-case": "off", - "unicorn/template-indent": 0, - "vue/array-bracket-newline": "off", - "vue/array-bracket-spacing": "off", - "vue/array-element-newline": "off", - "vue/arrow-spacing": "off", - "vue/block-spacing": "off", - "vue/block-tag-newline": "off", - "vue/brace-style": "off", - "vue/comma-dangle": "off", - "vue/comma-spacing": "off", - "vue/comma-style": "off", - "vue/dot-location": "off", - "vue/func-call-spacing": "off", - "vue/html-closing-bracket-newline": "off", - "vue/html-closing-bracket-spacing": "off", - "vue/html-end-tags": "off", - "vue/html-indent": "off", - "vue/html-quotes": "off", - "vue/html-self-closing": 0, - "vue/key-spacing": "off", - "vue/keyword-spacing": "off", - "vue/max-attributes-per-line": "off", - "vue/max-len": 0, - "vue/multiline-html-element-content-newline": "off", - "vue/multiline-ternary": "off", - "vue/mustache-interpolation-spacing": "off", - "vue/no-extra-parens": "off", - "vue/no-multi-spaces": "off", - "vue/no-spaces-around-equal-signs-in-attribute": "off", - "vue/object-curly-newline": "off", - "vue/object-curly-spacing": "off", - "vue/object-property-newline": "off", - "vue/operator-linebreak": "off", - "vue/quote-props": "off", - "vue/script-indent": "off", - "vue/singleline-html-element-content-newline": "off", - "vue/space-in-parens": "off", - "vue/space-infix-ops": "off", - "vue/space-unary-ops": "off", - "vue/template-curly-spacing": "off", - "wrap-iife": "off", - "wrap-regex": "off", - "yield-star-spacing": "off", - }, - }, - { - "languageOptions": { - "parser": { - "meta": { - "name": "typescript-eslint/parser", - "version": "8.27.0", - }, - "parseForESLint": [Function], - }, - "sourceType": "module", - }, - "name": "typescript-eslint/base", - "plugins": { - "@typescript-eslint": { - "configs": { - "all": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": "error", - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/ban-tslint-comment": "error", - "@typescript-eslint/class-literal-property-style": "error", - "@typescript-eslint/class-methods-use-this": "error", - "@typescript-eslint/consistent-generic-constructors": "error", - "@typescript-eslint/consistent-indexed-object-style": "error", - "@typescript-eslint/consistent-return": "error", - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/consistent-type-definitions": "error", - "@typescript-eslint/consistent-type-exports": "error", - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/default-param-last": "error", - "@typescript-eslint/dot-notation": "error", - "@typescript-eslint/explicit-function-return-type": "error", - "@typescript-eslint/explicit-member-accessibility": "error", - "@typescript-eslint/explicit-module-boundary-types": "error", - "@typescript-eslint/init-declarations": "error", - "@typescript-eslint/max-params": "error", - "@typescript-eslint/member-ordering": "error", - "@typescript-eslint/method-signature-style": "error", - "@typescript-eslint/naming-convention": "error", - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-array-delete": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-confusing-non-null-assertion": "error", - "@typescript-eslint/no-confusing-void-expression": "error", - "@typescript-eslint/no-deprecated": "error", - "@typescript-eslint/no-dupe-class-members": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", - "@typescript-eslint/no-dynamic-delete": "error", - "@typescript-eslint/no-empty-function": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-implied-eval": "error", - "@typescript-eslint/no-import-type-side-effects": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/no-invalid-this": "error", - "@typescript-eslint/no-invalid-void-type": "error", - "@typescript-eslint/no-loop-func": "error", - "@typescript-eslint/no-magic-numbers": "error", - "@typescript-eslint/no-meaningless-void-operator": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-misused-spread": "error", - "@typescript-eslint/no-mixed-enums": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-redeclare": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-restricted-imports": "error", - "@typescript-eslint/no-restricted-types": "error", - "@typescript-eslint/no-shadow": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", - "@typescript-eslint/no-unnecessary-condition": "error", - "@typescript-eslint/no-unnecessary-parameter-property-assignment": "error", - "@typescript-eslint/no-unnecessary-qualifier": "error", - "@typescript-eslint/no-unnecessary-template-expression": "error", - "@typescript-eslint/no-unnecessary-type-arguments": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unnecessary-type-parameters": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-enum-comparison": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-unsafe-type-assertion": "error", - "@typescript-eslint/no-unsafe-unary-minus": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-use-before-define": "error", - "@typescript-eslint/no-useless-constructor": "error", - "@typescript-eslint/no-useless-empty-export": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/non-nullable-type-assertion-style": "error", - "@typescript-eslint/only-throw-error": "error", - "@typescript-eslint/parameter-properties": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-destructuring": "error", - "@typescript-eslint/prefer-enum-initializers": "error", - "@typescript-eslint/prefer-find": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/prefer-includes": "error", - "@typescript-eslint/prefer-literal-enum-member": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/prefer-nullish-coalescing": "error", - "@typescript-eslint/prefer-optional-chain": "error", - "@typescript-eslint/prefer-promise-reject-errors": "error", - "@typescript-eslint/prefer-readonly": "error", - "@typescript-eslint/prefer-readonly-parameter-types": "error", - "@typescript-eslint/prefer-reduce-type-parameter": "error", - "@typescript-eslint/prefer-regexp-exec": "error", - "@typescript-eslint/prefer-return-this-type": "error", - "@typescript-eslint/prefer-string-starts-ends-with": "error", - "@typescript-eslint/promise-function-async": "error", - "@typescript-eslint/related-getter-setter-pairs": "error", - "@typescript-eslint/require-array-sort-compare": "error", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/restrict-plus-operands": "error", - "@typescript-eslint/restrict-template-expressions": "error", - "@typescript-eslint/return-await": "error", - "@typescript-eslint/strict-boolean-expressions": "error", - "@typescript-eslint/switch-exhaustiveness-check": "error", - "@typescript-eslint/triple-slash-reference": "error", - "@typescript-eslint/typedef": "error", - "@typescript-eslint/unbound-method": "error", - "@typescript-eslint/unified-signatures": "error", - "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", - "class-methods-use-this": "off", - "consistent-return": "off", - "default-param-last": "off", - "dot-notation": "off", - "init-declarations": "off", - "max-params": "off", - "no-array-constructor": "off", - "no-dupe-class-members": "off", - "no-empty-function": "off", - "no-implied-eval": "off", - "no-invalid-this": "off", - "no-loop-func": "off", - "no-magic-numbers": "off", - "no-redeclare": "off", - "no-restricted-imports": "off", - "no-return-await": "off", - "no-shadow": "off", - "no-throw-literal": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - "no-use-before-define": "off", - "no-useless-constructor": "off", - "prefer-destructuring": "off", - "prefer-promise-reject-errors": "off", - "require-await": "off", - }, - }, - "base": { - "parser": "@typescript-eslint/parser", - "parserOptions": { - "sourceType": "module", - }, - "plugins": [ - "@typescript-eslint", - ], - }, - "disable-type-checked": { - "parserOptions": { - "program": null, - "project": false, - "projectService": false, - }, - "rules": { - "@typescript-eslint/await-thenable": "off", - "@typescript-eslint/consistent-return": "off", - "@typescript-eslint/consistent-type-exports": "off", - "@typescript-eslint/dot-notation": "off", - "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/no-array-delete": "off", - "@typescript-eslint/no-base-to-string": "off", - "@typescript-eslint/no-confusing-void-expression": "off", - "@typescript-eslint/no-deprecated": "off", - "@typescript-eslint/no-duplicate-type-constituents": "off", - "@typescript-eslint/no-floating-promises": "off", - "@typescript-eslint/no-for-in-array": "off", - "@typescript-eslint/no-implied-eval": "off", - "@typescript-eslint/no-meaningless-void-operator": "off", - "@typescript-eslint/no-misused-promises": "off", - "@typescript-eslint/no-misused-spread": "off", - "@typescript-eslint/no-mixed-enums": "off", - "@typescript-eslint/no-redundant-type-constituents": "off", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "off", - "@typescript-eslint/no-unnecessary-condition": "off", - "@typescript-eslint/no-unnecessary-qualifier": "off", - "@typescript-eslint/no-unnecessary-template-expression": "off", - "@typescript-eslint/no-unnecessary-type-arguments": "off", - "@typescript-eslint/no-unnecessary-type-assertion": "off", - "@typescript-eslint/no-unnecessary-type-parameters": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-enum-comparison": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unsafe-type-assertion": "off", - "@typescript-eslint/no-unsafe-unary-minus": "off", - "@typescript-eslint/non-nullable-type-assertion-style": "off", - "@typescript-eslint/only-throw-error": "off", - "@typescript-eslint/prefer-destructuring": "off", - "@typescript-eslint/prefer-find": "off", - "@typescript-eslint/prefer-includes": "off", - "@typescript-eslint/prefer-nullish-coalescing": "off", - "@typescript-eslint/prefer-optional-chain": "off", - "@typescript-eslint/prefer-promise-reject-errors": "off", - "@typescript-eslint/prefer-readonly": "off", - "@typescript-eslint/prefer-readonly-parameter-types": "off", - "@typescript-eslint/prefer-reduce-type-parameter": "off", - "@typescript-eslint/prefer-regexp-exec": "off", - "@typescript-eslint/prefer-return-this-type": "off", - "@typescript-eslint/prefer-string-starts-ends-with": "off", - "@typescript-eslint/promise-function-async": "off", - "@typescript-eslint/related-getter-setter-pairs": "off", - "@typescript-eslint/require-array-sort-compare": "off", - "@typescript-eslint/require-await": "off", - "@typescript-eslint/restrict-plus-operands": "off", - "@typescript-eslint/restrict-template-expressions": "off", - "@typescript-eslint/return-await": "off", - "@typescript-eslint/strict-boolean-expressions": "off", - "@typescript-eslint/switch-exhaustiveness-check": "off", - "@typescript-eslint/unbound-method": "off", - "@typescript-eslint/use-unknown-in-catch-callback-variable": "off", - }, - }, - "eslint-recommended": { - "overrides": [ - { - "files": [ - "*.ts", - "*.tsx", - "*.mts", - "*.cts", - ], - "rules": { - "constructor-super": "off", - "getter-return": "off", - "no-class-assign": "off", - "no-const-assign": "off", - "no-dupe-args": "off", - "no-dupe-class-members": "off", - "no-dupe-keys": "off", - "no-func-assign": "off", - "no-import-assign": "off", - "no-new-native-nonconstructor": "off", - "no-new-symbol": "off", - "no-obj-calls": "off", - "no-redeclare": "off", - "no-setter-return": "off", - "no-this-before-super": "off", - "no-undef": "off", - "no-unreachable": "off", - "no-unsafe-negation": "off", - "no-var": "error", - "prefer-const": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - }, - }, - ], - }, - "recommended": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/triple-slash-reference": "error", - "no-array-constructor": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - }, - }, - "recommended-requiring-type-checking": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-array-delete": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-implied-eval": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-enum-comparison": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-unsafe-unary-minus": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/only-throw-error": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/prefer-promise-reject-errors": "error", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/restrict-plus-operands": "error", - "@typescript-eslint/restrict-template-expressions": "error", - "@typescript-eslint/triple-slash-reference": "error", - "@typescript-eslint/unbound-method": "error", - "no-array-constructor": "off", - "no-implied-eval": "off", - "no-throw-literal": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - "prefer-promise-reject-errors": "off", - "require-await": "off", - }, - }, - "recommended-type-checked": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-array-delete": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-implied-eval": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-enum-comparison": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-unsafe-unary-minus": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/only-throw-error": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/prefer-promise-reject-errors": "error", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/restrict-plus-operands": "error", - "@typescript-eslint/restrict-template-expressions": "error", - "@typescript-eslint/triple-slash-reference": "error", - "@typescript-eslint/unbound-method": "error", - "no-array-constructor": "off", - "no-implied-eval": "off", - "no-throw-literal": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - "prefer-promise-reject-errors": "off", - "require-await": "off", - }, - }, - "recommended-type-checked-only": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/no-array-delete": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-implied-eval": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-enum-comparison": "error", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-unsafe-unary-minus": "error", - "@typescript-eslint/only-throw-error": "error", - "@typescript-eslint/prefer-promise-reject-errors": "error", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/restrict-plus-operands": "error", - "@typescript-eslint/restrict-template-expressions": "error", - "@typescript-eslint/unbound-method": "error", - "no-implied-eval": "off", - "no-throw-literal": "off", - "prefer-promise-reject-errors": "off", - "require-await": "off", - }, - }, - "strict": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "minimumDescriptionLength": 10, - }, - ], - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-dynamic-delete": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-invalid-void-type": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-useless-constructor": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-literal-enum-member": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/triple-slash-reference": "error", - "@typescript-eslint/unified-signatures": "error", - "no-array-constructor": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - }, - }, - "strict-type-checked": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "minimumDescriptionLength": 10, - }, - ], - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-array-delete": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-confusing-void-expression": "error", - "@typescript-eslint/no-deprecated": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", - "@typescript-eslint/no-dynamic-delete": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-implied-eval": "error", - "@typescript-eslint/no-invalid-void-type": "error", - "@typescript-eslint/no-meaningless-void-operator": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-misused-spread": "error", - "@typescript-eslint/no-mixed-enums": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", - "@typescript-eslint/no-unnecessary-condition": "error", - "@typescript-eslint/no-unnecessary-template-expression": "error", - "@typescript-eslint/no-unnecessary-type-arguments": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unnecessary-type-parameters": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-enum-comparison": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-unsafe-unary-minus": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-useless-constructor": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/only-throw-error": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-literal-enum-member": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/prefer-promise-reject-errors": "error", - "@typescript-eslint/prefer-reduce-type-parameter": "error", - "@typescript-eslint/prefer-return-this-type": "error", - "@typescript-eslint/related-getter-setter-pairs": "error", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/restrict-plus-operands": [ - "error", - { - "allowAny": false, - "allowBoolean": false, - "allowNullish": false, - "allowNumberAndString": false, - "allowRegExp": false, - }, - ], - "@typescript-eslint/restrict-template-expressions": [ - "error", - { - "allowAny": false, - "allowBoolean": false, - "allowNever": false, - "allowNullish": false, - "allowNumber": false, - "allowRegExp": false, - }, - ], - "@typescript-eslint/return-await": [ - "error", - "error-handling-correctness-only", - ], - "@typescript-eslint/triple-slash-reference": "error", - "@typescript-eslint/unbound-method": "error", - "@typescript-eslint/unified-signatures": "error", - "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", - "no-array-constructor": "off", - "no-implied-eval": "off", - "no-return-await": "off", - "no-throw-literal": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - "no-useless-constructor": "off", - "prefer-promise-reject-errors": "off", - "require-await": "off", - }, - }, - "strict-type-checked-only": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/no-array-delete": "error", - "@typescript-eslint/no-base-to-string": "error", - "@typescript-eslint/no-confusing-void-expression": "error", - "@typescript-eslint/no-deprecated": "error", - "@typescript-eslint/no-duplicate-type-constituents": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-implied-eval": "error", - "@typescript-eslint/no-meaningless-void-operator": "error", - "@typescript-eslint/no-misused-promises": "error", - "@typescript-eslint/no-misused-spread": "error", - "@typescript-eslint/no-mixed-enums": "error", - "@typescript-eslint/no-redundant-type-constituents": "error", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", - "@typescript-eslint/no-unnecessary-condition": "error", - "@typescript-eslint/no-unnecessary-template-expression": "error", - "@typescript-eslint/no-unnecessary-type-arguments": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-unnecessary-type-parameters": "error", - "@typescript-eslint/no-unsafe-argument": "error", - "@typescript-eslint/no-unsafe-assignment": "error", - "@typescript-eslint/no-unsafe-call": "error", - "@typescript-eslint/no-unsafe-enum-comparison": "error", - "@typescript-eslint/no-unsafe-member-access": "error", - "@typescript-eslint/no-unsafe-return": "error", - "@typescript-eslint/no-unsafe-unary-minus": "error", - "@typescript-eslint/only-throw-error": "error", - "@typescript-eslint/prefer-promise-reject-errors": "error", - "@typescript-eslint/prefer-reduce-type-parameter": "error", - "@typescript-eslint/prefer-return-this-type": "error", - "@typescript-eslint/related-getter-setter-pairs": "error", - "@typescript-eslint/require-await": "error", - "@typescript-eslint/restrict-plus-operands": [ - "error", - { - "allowAny": false, - "allowBoolean": false, - "allowNullish": false, - "allowNumberAndString": false, - "allowRegExp": false, - }, - ], - "@typescript-eslint/restrict-template-expressions": [ - "error", - { - "allowAny": false, - "allowBoolean": false, - "allowNever": false, - "allowNullish": false, - "allowNumber": false, - "allowRegExp": false, - }, - ], - "@typescript-eslint/return-await": [ - "error", - "error-handling-correctness-only", - ], - "@typescript-eslint/unbound-method": "error", - "@typescript-eslint/use-unknown-in-catch-callback-variable": "error", - "no-implied-eval": "off", - "no-return-await": "off", - "no-throw-literal": "off", - "prefer-promise-reject-errors": "off", - "require-await": "off", - }, - }, - "stylistic": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": "error", - "@typescript-eslint/ban-tslint-comment": "error", - "@typescript-eslint/class-literal-property-style": "error", - "@typescript-eslint/consistent-generic-constructors": "error", - "@typescript-eslint/consistent-indexed-object-style": "error", - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/consistent-type-definitions": "error", - "@typescript-eslint/no-confusing-non-null-assertion": "error", - "@typescript-eslint/no-empty-function": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/prefer-function-type": "error", - "no-empty-function": "off", - }, - }, - "stylistic-type-checked": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": "error", - "@typescript-eslint/ban-tslint-comment": "error", - "@typescript-eslint/class-literal-property-style": "error", - "@typescript-eslint/consistent-generic-constructors": "error", - "@typescript-eslint/consistent-indexed-object-style": "error", - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/consistent-type-definitions": "error", - "@typescript-eslint/dot-notation": "error", - "@typescript-eslint/no-confusing-non-null-assertion": "error", - "@typescript-eslint/no-empty-function": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/non-nullable-type-assertion-style": "error", - "@typescript-eslint/prefer-find": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/prefer-includes": "error", - "@typescript-eslint/prefer-nullish-coalescing": "error", - "@typescript-eslint/prefer-optional-chain": "error", - "@typescript-eslint/prefer-regexp-exec": "error", - "@typescript-eslint/prefer-string-starts-ends-with": "error", - "dot-notation": "off", - "no-empty-function": "off", - }, - }, - "stylistic-type-checked-only": { - "extends": [ - "./configs/base", - "./configs/eslint-recommended", - ], - "rules": { - "@typescript-eslint/dot-notation": "error", - "@typescript-eslint/non-nullable-type-assertion-style": "error", - "@typescript-eslint/prefer-find": "error", - "@typescript-eslint/prefer-includes": "error", - "@typescript-eslint/prefer-nullish-coalescing": "error", - "@typescript-eslint/prefer-optional-chain": "error", - "@typescript-eslint/prefer-regexp-exec": "error", - "@typescript-eslint/prefer-string-starts-ends-with": "error", - "dot-notation": "off", - }, - }, - }, - "meta": { - "name": "@typescript-eslint/eslint-plugin", - "version": "8.27.0", - }, - "rules": { - "adjacent-overload-signatures": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Require that function overload signatures be consecutive", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/adjacent-overload-signatures", - }, - "messages": { - "adjacentSignature": "All {{name}} signatures should be adjacent.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "array-type": { - "create": [Function], - "defaultOptions": [ - { - "default": "array", - }, - ], - "meta": { - "docs": { - "description": "Require consistently using either \`T[]\` or \`Array\` for arrays", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/array-type", - }, - "fixable": "code", - "messages": { - "errorStringArray": "Array type using '{{className}}<{{type}}>' is forbidden. Use '{{readonlyPrefix}}{{type}}[]' instead.", - "errorStringArrayReadonly": "Array type using '{{className}}<{{type}}>' is forbidden. Use '{{readonlyPrefix}}{{type}}' instead.", - "errorStringArraySimple": "Array type using '{{className}}<{{type}}>' is forbidden for simple types. Use '{{readonlyPrefix}}{{type}}[]' instead.", - "errorStringArraySimpleReadonly": "Array type using '{{className}}<{{type}}>' is forbidden for simple types. Use '{{readonlyPrefix}}{{type}}' instead.", - "errorStringGeneric": "Array type using '{{readonlyPrefix}}{{type}}[]' is forbidden. Use '{{className}}<{{type}}>' instead.", - "errorStringGenericSimple": "Array type using '{{readonlyPrefix}}{{type}}[]' is forbidden for non-simple types. Use '{{className}}<{{type}}>' instead.", - }, - "schema": [ - { - "$defs": { - "arrayOption": { - "enum": [ - "array", - "generic", - "array-simple", - ], - "type": "string", - }, - }, - "additionalProperties": false, - "properties": { - "default": { - "$ref": "#/items/0/$defs/arrayOption", - "description": "The array type expected for mutable cases.", - }, - "readonly": { - "$ref": "#/items/0/$defs/arrayOption", - "description": "The array type expected for readonly cases. If omitted, the value for \`default\` will be used.", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "await-thenable": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow awaiting a value that is not a Thenable", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/await-thenable", - }, - "hasSuggestions": true, - "messages": { - "await": "Unexpected \`await\` of a non-Promise (non-"Thenable") value.", - "awaitUsingOfNonAsyncDisposable": "Unexpected \`await using\` of a value that is not async disposable.", - "convertToOrdinaryFor": "Convert to an ordinary \`for...of\` loop.", - "forAwaitOfNonAsyncIterable": "Unexpected \`for await...of\` of a value that is not async iterable.", - "removeAwait": "Remove unnecessary \`await\`.", - }, - "schema": [], - "type": "problem", - }, - }, - "ban-ts-comment": { - "create": [Function], - "defaultOptions": [ - { - "minimumDescriptionLength": 3, - "ts-check": false, - "ts-expect-error": "allow-with-description", - "ts-ignore": true, - "ts-nocheck": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow \`@ts-\` comments or require descriptions after directives", - "recommended": { - "recommended": true, - "strict": [ - { - "minimumDescriptionLength": 10, - }, - ], - }, - "url": "https://typescript-eslint.io/rules/ban-ts-comment", - }, - "hasSuggestions": true, - "messages": { - "replaceTsIgnoreWithTsExpectError": "Replace "@ts-ignore" with "@ts-expect-error".", - "tsDirectiveComment": "Do not use "@ts-{{directive}}" because it alters compilation errors.", - "tsDirectiveCommentDescriptionNotMatchPattern": "The description for the "@ts-{{directive}}" directive must match the {{format}} format.", - "tsDirectiveCommentRequiresDescription": "Include a description after the "@ts-{{directive}}" directive to explain why the @ts-{{directive}} is necessary. The description must be {{minimumDescriptionLength}} characters or longer.", - "tsIgnoreInsteadOfExpectError": "Use "@ts-expect-error" instead of "@ts-ignore", as "@ts-ignore" will do nothing if the following line is error-free.", - }, - "schema": [ - { - "$defs": { - "directiveConfigSchema": { - "oneOf": [ - { - "default": true, - "type": "boolean", - }, - { - "enum": [ - "allow-with-description", - ], - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "descriptionFormat": { - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - }, - "additionalProperties": false, - "properties": { - "minimumDescriptionLength": { - "default": 3, - "description": "A minimum character length for descriptions when \`allow-with-description\` is enabled.", - "type": "number", - }, - "ts-check": { - "$ref": "#/items/0/$defs/directiveConfigSchema", - }, - "ts-expect-error": { - "$ref": "#/items/0/$defs/directiveConfigSchema", - }, - "ts-ignore": { - "$ref": "#/items/0/$defs/directiveConfigSchema", - }, - "ts-nocheck": { - "$ref": "#/items/0/$defs/directiveConfigSchema", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "ban-tslint-comment": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow \`// tslint:\` comments", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/ban-tslint-comment", - }, - "fixable": "code", - "messages": { - "commentDetected": "tslint comment detected: "{{ text }}"", - }, - "schema": [], - "type": "suggestion", - }, - }, - "class-literal-property-style": { - "create": [Function], - "defaultOptions": [ - "fields", - ], - "meta": { - "docs": { - "description": "Enforce that literals on classes are exposed in a consistent style", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/class-literal-property-style", - }, - "hasSuggestions": true, - "messages": { - "preferFieldStyle": "Literals should be exposed using readonly fields.", - "preferFieldStyleSuggestion": "Replace the literals with readonly fields.", - "preferGetterStyle": "Literals should be exposed using getters.", - "preferGetterStyleSuggestion": "Replace the literals with getters.", - }, - "schema": [ - { - "description": "Which literal class member syntax to prefer.", - "enum": [ - "fields", - "getters", - ], - "type": "string", - }, - ], - "type": "problem", - }, - }, - "class-methods-use-this": { - "create": [Function], - "defaultOptions": [ - { - "enforceForClassFields": true, - "exceptMethods": [], - "ignoreClassesThatImplementAnInterface": false, - "ignoreOverrideMethods": false, - }, - ], - "meta": { - "docs": { - "description": "Enforce that class methods utilize \`this\`", - "extendsBaseRule": true, - "requiresTypeChecking": false, - "url": "https://typescript-eslint.io/rules/class-methods-use-this", - }, - "messages": { - "missingThis": "Expected 'this' to be used by class {{name}}.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "enforceForClassFields": { - "default": true, - "description": "Enforces that functions used as instance field initializers utilize \`this\`.", - "type": "boolean", - }, - "exceptMethods": { - "description": "Allows specified method names to be ignored with this rule.", - "items": { - "type": "string", - }, - "type": "array", - }, - "ignoreClassesThatImplementAnInterface": { - "description": "Whether to ignore class members that are defined within a class that \`implements\` a type.", - "oneOf": [ - { - "description": "Ignore all classes that implement an interface", - "type": "boolean", - }, - { - "description": "Ignore only the public fields of classes that implement an interface", - "enum": [ - "public-fields", - ], - "type": "string", - }, - ], - }, - "ignoreOverrideMethods": { - "description": "Whether to ignore members marked with the \`override\` modifier.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "consistent-generic-constructors": { - "create": [Function], - "defaultOptions": [ - "constructor", - ], - "meta": { - "docs": { - "description": "Enforce specifying generic type arguments on type annotation or constructor name of a constructor call", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/consistent-generic-constructors", - }, - "fixable": "code", - "messages": { - "preferConstructor": "The generic type arguments should be specified as part of the constructor type arguments.", - "preferTypeAnnotation": "The generic type arguments should be specified as part of the type annotation.", - }, - "schema": [ - { - "description": "Which constructor call syntax to prefer.", - "enum": [ - "type-annotation", - "constructor", - ], - "type": "string", - }, - ], - "type": "suggestion", - }, - }, - "consistent-indexed-object-style": { - "create": [Function], - "defaultOptions": [ - "record", - ], - "meta": { - "docs": { - "description": "Require or disallow the \`Record\` type", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/consistent-indexed-object-style", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "preferIndexSignature": "An index signature is preferred over a record.", - "preferIndexSignatureSuggestion": "Change into an index signature instead of a record.", - "preferRecord": "A record is preferred over an index signature.", - }, - "schema": [ - { - "description": "Which indexed object syntax to prefer.", - "enum": [ - "record", - "index-signature", - ], - "type": "string", - }, - ], - "type": "suggestion", - }, - }, - "consistent-return": { - "create": [Function], - "defaultOptions": [ - { - "treatUndefinedAsUnspecified": false, - }, - ], - "meta": { - "defaultOptions": [ - { - "treatUndefinedAsUnspecified": false, - }, - ], - "docs": { - "description": "Require \`return\` statements to either always or never specify values", - "extendsBaseRule": true, - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/consistent-return", - }, - "hasSuggestions": undefined, - "messages": { - "missingReturn": "Expected to return a value at the end of {{name}}.", - "missingReturnValue": "{{name}} expected a return value.", - "unexpectedReturnValue": "{{name}} expected no return value.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "treatUndefinedAsUnspecified": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "consistent-type-assertions": { - "create": [Function], - "defaultOptions": [ - { - "arrayLiteralTypeAssertions": "allow", - "assertionStyle": "as", - "objectLiteralTypeAssertions": "allow", - }, - ], - "meta": { - "docs": { - "description": "Enforce consistent usage of type assertions", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/consistent-type-assertions", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "angle-bracket": "Use '<{{cast}}>' instead of 'as {{cast}}'.", - "as": "Use 'as {{cast}}' instead of '<{{cast}}>'.", - "never": "Do not use any type assertions.", - "replaceArrayTypeAssertionWithAnnotation": "Use const x: {{cast}} = [ ... ] instead.", - "replaceArrayTypeAssertionWithSatisfies": "Use const x = [ ... ] satisfies {{cast}} instead.", - "replaceObjectTypeAssertionWithAnnotation": "Use const x: {{cast}} = { ... } instead.", - "replaceObjectTypeAssertionWithSatisfies": "Use const x = { ... } satisfies {{cast}} instead.", - "unexpectedArrayTypeAssertion": "Always prefer const x: T[] = [ ... ].", - "unexpectedObjectTypeAssertion": "Always prefer const x: T = { ... }.", - }, - "schema": [ - { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "assertionStyle": { - "description": "The expected assertion style to enforce.", - "enum": [ - "never", - ], - "type": "string", - }, - }, - "required": [ - "assertionStyle", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "arrayLiteralTypeAssertions": { - "description": "Whether to always prefer type declarations for array literals used as variable initializers, rather than type assertions.", - "enum": [ - "allow", - "allow-as-parameter", - "never", - ], - "type": "string", - }, - "assertionStyle": { - "description": "The expected assertion style to enforce.", - "enum": [ - "as", - "angle-bracket", - ], - "type": "string", - }, - "objectLiteralTypeAssertions": { - "description": "Whether to always prefer type declarations for object literals used as variable initializers, rather than type assertions.", - "enum": [ - "allow", - "allow-as-parameter", - "never", - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - ], - "type": "suggestion", - }, - }, - "consistent-type-definitions": { - "create": [Function], - "defaultOptions": [ - "interface", - ], - "meta": { - "docs": { - "description": "Enforce type definitions to consistently use either \`interface\` or \`type\`", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/consistent-type-definitions", - }, - "fixable": "code", - "messages": { - "interfaceOverType": "Use an \`interface\` instead of a \`type\`.", - "typeOverInterface": "Use a \`type\` instead of an \`interface\`.", - }, - "schema": [ - { - "description": "Which type definition syntax to prefer.", - "enum": [ - "interface", - "type", - ], - "type": "string", - }, - ], - "type": "suggestion", - }, - }, - "consistent-type-exports": { - "create": [Function], - "defaultOptions": [ - { - "fixMixedExportsWithInlineTypeSpecifier": false, - }, - ], - "meta": { - "docs": { - "description": "Enforce consistent usage of type exports", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/consistent-type-exports", - }, - "fixable": "code", - "messages": { - "multipleExportsAreTypes": "Type exports {{exportNames}} are not values and should be exported using \`export type\`.", - "singleExportIsType": "Type export {{exportNames}} is not a value and should be exported using \`export type\`.", - "typeOverValue": "All exports in the declaration are only used as types. Use \`export type\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "fixMixedExportsWithInlineTypeSpecifier": { - "description": "Whether the rule will autofix "mixed" export cases using TS inline type specifiers.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "consistent-type-imports": { - "create": [Function], - "defaultOptions": [ - { - "disallowTypeAnnotations": true, - "fixStyle": "separate-type-imports", - "prefer": "type-imports", - }, - ], - "meta": { - "docs": { - "description": "Enforce consistent usage of type imports", - "url": "https://typescript-eslint.io/rules/consistent-type-imports", - }, - "fixable": "code", - "messages": { - "avoidImportType": "Use an \`import\` instead of an \`import type\`.", - "noImportTypeAnnotations": "\`import()\` type annotations are forbidden.", - "someImportsAreOnlyTypes": "Imports {{typeImports}} are only used as type.", - "typeOverValue": "All imports in the declaration are only used as types. Use \`import type\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "disallowTypeAnnotations": { - "description": "Whether to disallow type imports in type annotations (\`import()\`).", - "type": "boolean", - }, - "fixStyle": { - "description": "The expected type modifier to be added when an import is detected as used only in the type position.", - "enum": [ - "separate-type-imports", - "inline-type-imports", - ], - "type": "string", - }, - "prefer": { - "description": "The expected import kind for type-only imports.", - "enum": [ - "type-imports", - "no-type-imports", - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "default-param-last": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce default parameters to be last", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/default-param-last", - }, - "messages": { - "shouldBeLast": "Default parameters should be last.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "dot-notation": { - "create": [Function], - "defaultOptions": [ - { - "allowIndexSignaturePropertyAccess": false, - "allowKeywords": true, - "allowPattern": "", - "allowPrivateClassPropertyAccess": false, - "allowProtectedClassPropertyAccess": false, - }, - ], - "meta": { - "defaultOptions": [ - { - "allowIndexSignaturePropertyAccess": false, - "allowKeywords": true, - "allowPattern": "", - "allowPrivateClassPropertyAccess": false, - "allowProtectedClassPropertyAccess": false, - }, - ], - "docs": { - "description": "Enforce dot notation whenever possible", - "extendsBaseRule": true, - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/dot-notation", - }, - "fixable": "code", - "hasSuggestions": undefined, - "messages": { - "useBrackets": ".{{key}} is a syntax error.", - "useDot": "[{{key}}] is better written in dot notation.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowIndexSignaturePropertyAccess": { - "default": false, - "description": "Whether to allow accessing properties matching an index signature with array notation.", - "type": "boolean", - }, - "allowKeywords": { - "default": true, - "description": "Whether to allow keywords such as ["class"]\`.", - "type": "boolean", - }, - "allowPattern": { - "default": "", - "description": "Regular expression of names to allow.", - "type": "string", - }, - "allowPrivateClassPropertyAccess": { - "default": false, - "description": "Whether to allow accessing class members marked as \`private\` with array notation.", - "type": "boolean", - }, - "allowProtectedClassPropertyAccess": { - "default": false, - "description": "Whether to allow accessing class members marked as \`protected\` with array notation.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "explicit-function-return-type": { - "create": [Function], - "defaultOptions": [ - { - "allowConciseArrowFunctionExpressionsStartingWithVoid": false, - "allowDirectConstAssertionInArrowFunctions": true, - "allowExpressions": false, - "allowFunctionsWithoutTypeParameters": false, - "allowHigherOrderFunctions": true, - "allowIIFEs": false, - "allowTypedFunctionExpressions": true, - "allowedNames": [], - }, - ], - "meta": { - "docs": { - "description": "Require explicit return types on functions and class methods", - "url": "https://typescript-eslint.io/rules/explicit-function-return-type", - }, - "messages": { - "missingReturnType": "Missing return type on function.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowConciseArrowFunctionExpressionsStartingWithVoid": { - "description": "Whether to allow arrow functions that start with the \`void\` keyword.", - "type": "boolean", - }, - "allowDirectConstAssertionInArrowFunctions": { - "description": "Whether to ignore arrow functions immediately returning a \`as const\` value.", - "type": "boolean", - }, - "allowExpressions": { - "description": "Whether to ignore function expressions (functions which are not part of a declaration).", - "type": "boolean", - }, - "allowFunctionsWithoutTypeParameters": { - "description": "Whether to ignore functions that don't have generic type parameters.", - "type": "boolean", - }, - "allowHigherOrderFunctions": { - "description": "Whether to ignore functions immediately returning another function expression.", - "type": "boolean", - }, - "allowIIFEs": { - "description": "Whether to ignore immediately invoked function expressions (IIFEs).", - "type": "boolean", - }, - "allowTypedFunctionExpressions": { - "description": "Whether to ignore type annotations on the variable of function expressions.", - "type": "boolean", - }, - "allowedNames": { - "description": "An array of function/method names that will not have their arguments or return values checked.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "explicit-member-accessibility": { - "create": [Function], - "defaultOptions": [ - { - "accessibility": "explicit", - }, - ], - "meta": { - "docs": { - "description": "Require explicit accessibility modifiers on class properties and methods", - "url": "https://typescript-eslint.io/rules/explicit-member-accessibility", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "addExplicitAccessibility": "Add '{{ type }}' accessibility modifier", - "missingAccessibility": "Missing accessibility modifier on {{type}} {{name}}.", - "unwantedPublicAccessibility": "Public accessibility modifier on {{type}} {{name}}.", - }, - "schema": [ - { - "$defs": { - "accessibilityLevel": { - "oneOf": [ - { - "description": "Always require an accessor.", - "enum": [ - "explicit", - ], - "type": "string", - }, - { - "description": "Require an accessor except when public.", - "enum": [ - "no-public", - ], - "type": "string", - }, - { - "description": "Never check whether there is an accessor.", - "enum": [ - "off", - ], - "type": "string", - }, - ], - }, - }, - "additionalProperties": false, - "properties": { - "accessibility": { - "$ref": "#/items/0/$defs/accessibilityLevel", - "description": "Which accessibility modifier is required to exist or not exist.", - }, - "ignoredMethodNames": { - "description": "Specific method names that may be ignored.", - "items": { - "type": "string", - }, - "type": "array", - }, - "overrides": { - "additionalProperties": false, - "description": "Changes to required accessibility modifiers for specific kinds of class members.", - "properties": { - "accessors": { - "$ref": "#/items/0/$defs/accessibilityLevel", - }, - "constructors": { - "$ref": "#/items/0/$defs/accessibilityLevel", - }, - "methods": { - "$ref": "#/items/0/$defs/accessibilityLevel", - }, - "parameterProperties": { - "$ref": "#/items/0/$defs/accessibilityLevel", - }, - "properties": { - "$ref": "#/items/0/$defs/accessibilityLevel", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "explicit-module-boundary-types": { - "create": [Function], - "defaultOptions": [ - { - "allowArgumentsExplicitlyTypedAsAny": false, - "allowDirectConstAssertionInArrowFunctions": true, - "allowHigherOrderFunctions": true, - "allowOverloadFunctions": false, - "allowTypedFunctionExpressions": true, - "allowedNames": [], - }, - ], - "meta": { - "docs": { - "description": "Require explicit return and argument types on exported functions' and classes' public class methods", - "url": "https://typescript-eslint.io/rules/explicit-module-boundary-types", - }, - "messages": { - "anyTypedArg": "Argument '{{name}}' should be typed with a non-any type.", - "anyTypedArgUnnamed": "{{type}} argument should be typed with a non-any type.", - "missingArgType": "Argument '{{name}}' should be typed.", - "missingArgTypeUnnamed": "{{type}} argument should be typed.", - "missingReturnType": "Missing return type on function.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowArgumentsExplicitlyTypedAsAny": { - "description": "Whether to ignore arguments that are explicitly typed as \`any\`.", - "type": "boolean", - }, - "allowDirectConstAssertionInArrowFunctions": { - "description": "Whether to ignore return type annotations on body-less arrow functions that return an \`as const\` type assertion. -You must still type the parameters of the function.", - "type": "boolean", - }, - "allowHigherOrderFunctions": { - "description": "Whether to ignore return type annotations on functions immediately returning another function expression. -You must still type the parameters of the function.", - "type": "boolean", - }, - "allowOverloadFunctions": { - "description": "Whether to ignore return type annotations on functions with overload signatures.", - "type": "boolean", - }, - "allowTypedFunctionExpressions": { - "description": "Whether to ignore type annotations on the variable of a function expression.", - "type": "boolean", - }, - "allowedNames": { - "description": "An array of function/method names that will not have their arguments or return values checked.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "init-declarations": { - "create": [Function], - "defaultOptions": [ - "always", - ], - "meta": { - "docs": { - "description": "Require or disallow initialization in variable declarations", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/init-declarations", - }, - "hasSuggestions": undefined, - "messages": { - "initialized": "Variable '{{idName}}' should be initialized on declaration.", - "notInitialized": "Variable '{{idName}}' should not be initialized on declaration.", - }, - "schema": { - "anyOf": [ - { - "items": [ - { - "enum": [ - "always", - ], - }, - ], - "maxItems": 1, - "minItems": 0, - "type": "array", - }, - { - "items": [ - { - "enum": [ - "never", - ], - }, - { - "additionalProperties": false, - "properties": { - "ignoreForLoopInit": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "maxItems": 2, - "minItems": 0, - "type": "array", - }, - ], - }, - "type": "suggestion", - }, - }, - "max-params": { - "create": [Function], - "defaultOptions": [ - { - "countVoidThis": false, - "max": 3, - }, - ], - "meta": { - "docs": { - "description": "Enforce a maximum number of parameters in function definitions", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/max-params", - }, - "messages": { - "exceed": "{{name}} has too many parameters ({{count}}). Maximum allowed is {{max}}.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "countVoidThis": { - "description": "Whether to count a \`this\` declaration when the type is \`void\`.", - "type": "boolean", - }, - "max": { - "description": "A maximum number of parameters in function definitions.", - "minimum": 0, - "type": "integer", - }, - "maximum": { - "description": "(deprecated) A maximum number of parameters in function definitions.", - "minimum": 0, - "type": "integer", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "member-ordering": { - "create": [Function], - "defaultOptions": [ - { - "default": { - "memberTypes": [ - "signature", - "call-signature", - "public-static-field", - "protected-static-field", - "private-static-field", - "#private-static-field", - "public-decorated-field", - "protected-decorated-field", - "private-decorated-field", - "public-instance-field", - "protected-instance-field", - "private-instance-field", - "#private-instance-field", - "public-abstract-field", - "protected-abstract-field", - "public-field", - "protected-field", - "private-field", - "#private-field", - "static-field", - "instance-field", - "abstract-field", - "decorated-field", - "field", - "static-initialization", - "public-constructor", - "protected-constructor", - "private-constructor", - "constructor", - "public-static-accessor", - "protected-static-accessor", - "private-static-accessor", - "#private-static-accessor", - "public-decorated-accessor", - "protected-decorated-accessor", - "private-decorated-accessor", - "public-instance-accessor", - "protected-instance-accessor", - "private-instance-accessor", - "#private-instance-accessor", - "public-abstract-accessor", - "protected-abstract-accessor", - "public-accessor", - "protected-accessor", - "private-accessor", - "#private-accessor", - "static-accessor", - "instance-accessor", - "abstract-accessor", - "decorated-accessor", - "accessor", - "public-static-get", - "protected-static-get", - "private-static-get", - "#private-static-get", - "public-decorated-get", - "protected-decorated-get", - "private-decorated-get", - "public-instance-get", - "protected-instance-get", - "private-instance-get", - "#private-instance-get", - "public-abstract-get", - "protected-abstract-get", - "public-get", - "protected-get", - "private-get", - "#private-get", - "static-get", - "instance-get", - "abstract-get", - "decorated-get", - "get", - "public-static-set", - "protected-static-set", - "private-static-set", - "#private-static-set", - "public-decorated-set", - "protected-decorated-set", - "private-decorated-set", - "public-instance-set", - "protected-instance-set", - "private-instance-set", - "#private-instance-set", - "public-abstract-set", - "protected-abstract-set", - "public-set", - "protected-set", - "private-set", - "#private-set", - "static-set", - "instance-set", - "abstract-set", - "decorated-set", - "set", - "public-static-method", - "protected-static-method", - "private-static-method", - "#private-static-method", - "public-decorated-method", - "protected-decorated-method", - "private-decorated-method", - "public-instance-method", - "protected-instance-method", - "private-instance-method", - "#private-instance-method", - "public-abstract-method", - "protected-abstract-method", - "public-method", - "protected-method", - "private-method", - "#private-method", - "static-method", - "instance-method", - "abstract-method", - "decorated-method", - "method", - ], - }, - }, - ], - "meta": { - "docs": { - "description": "Require a consistent member declaration order", - "url": "https://typescript-eslint.io/rules/member-ordering", - }, - "messages": { - "incorrectGroupOrder": "Member {{name}} should be declared before all {{rank}} definitions.", - "incorrectOrder": "Member {{member}} should be declared before member {{beforeMember}}.", - "incorrectRequiredMembersOrder": "Member {{member}} should be declared after all {{optionalOrRequired}} members.", - }, - "schema": [ - { - "$defs": { - "allItems": { - "enum": [ - "readonly-signature", - "signature", - "readonly-field", - "public-readonly-field", - "public-decorated-readonly-field", - "decorated-readonly-field", - "static-readonly-field", - "public-static-readonly-field", - "instance-readonly-field", - "public-instance-readonly-field", - "abstract-readonly-field", - "public-abstract-readonly-field", - "protected-readonly-field", - "protected-decorated-readonly-field", - "protected-static-readonly-field", - "protected-instance-readonly-field", - "protected-abstract-readonly-field", - "private-readonly-field", - "private-decorated-readonly-field", - "private-static-readonly-field", - "private-instance-readonly-field", - "#private-readonly-field", - "#private-static-readonly-field", - "#private-instance-readonly-field", - "field", - "public-field", - "public-decorated-field", - "decorated-field", - "static-field", - "public-static-field", - "instance-field", - "public-instance-field", - "abstract-field", - "public-abstract-field", - "protected-field", - "protected-decorated-field", - "protected-static-field", - "protected-instance-field", - "protected-abstract-field", - "private-field", - "private-decorated-field", - "private-static-field", - "private-instance-field", - "#private-field", - "#private-static-field", - "#private-instance-field", - "method", - "public-method", - "public-decorated-method", - "decorated-method", - "static-method", - "public-static-method", - "instance-method", - "public-instance-method", - "abstract-method", - "public-abstract-method", - "protected-method", - "protected-decorated-method", - "protected-static-method", - "protected-instance-method", - "protected-abstract-method", - "private-method", - "private-decorated-method", - "private-static-method", - "private-instance-method", - "#private-method", - "#private-static-method", - "#private-instance-method", - "call-signature", - "constructor", - "public-constructor", - "protected-constructor", - "private-constructor", - "accessor", - "public-accessor", - "public-decorated-accessor", - "decorated-accessor", - "static-accessor", - "public-static-accessor", - "instance-accessor", - "public-instance-accessor", - "abstract-accessor", - "public-abstract-accessor", - "protected-accessor", - "protected-decorated-accessor", - "protected-static-accessor", - "protected-instance-accessor", - "protected-abstract-accessor", - "private-accessor", - "private-decorated-accessor", - "private-static-accessor", - "private-instance-accessor", - "#private-accessor", - "#private-static-accessor", - "#private-instance-accessor", - "get", - "public-get", - "public-decorated-get", - "decorated-get", - "static-get", - "public-static-get", - "instance-get", - "public-instance-get", - "abstract-get", - "public-abstract-get", - "protected-get", - "protected-decorated-get", - "protected-static-get", - "protected-instance-get", - "protected-abstract-get", - "private-get", - "private-decorated-get", - "private-static-get", - "private-instance-get", - "#private-get", - "#private-static-get", - "#private-instance-get", - "set", - "public-set", - "public-decorated-set", - "decorated-set", - "static-set", - "public-static-set", - "instance-set", - "public-instance-set", - "abstract-set", - "public-abstract-set", - "protected-set", - "protected-decorated-set", - "protected-static-set", - "protected-instance-set", - "protected-abstract-set", - "private-set", - "private-decorated-set", - "private-static-set", - "private-instance-set", - "#private-set", - "#private-static-set", - "#private-instance-set", - "static-initialization", - "static-static-initialization", - "public-static-static-initialization", - "instance-static-initialization", - "public-instance-static-initialization", - "abstract-static-initialization", - "public-abstract-static-initialization", - "protected-static-static-initialization", - "protected-instance-static-initialization", - "protected-abstract-static-initialization", - "private-static-static-initialization", - "private-instance-static-initialization", - "#private-static-static-initialization", - "#private-instance-static-initialization", - ], - "type": "string", - }, - "baseConfig": { - "oneOf": [ - { - "enum": [ - "never", - ], - "type": "string", - }, - { - "items": { - "oneOf": [ - { - "$ref": "#/items/0/$defs/allItems", - }, - { - "items": { - "$ref": "#/items/0/$defs/allItems", - }, - "type": "array", - }, - ], - }, - "type": "array", - }, - { - "additionalProperties": false, - "properties": { - "memberTypes": { - "oneOf": [ - { - "items": { - "oneOf": [ - { - "$ref": "#/items/0/$defs/allItems", - }, - { - "items": { - "$ref": "#/items/0/$defs/allItems", - }, - "type": "array", - }, - ], - }, - "type": "array", - }, - { - "enum": [ - "never", - ], - "type": "string", - }, - ], - }, - "optionalityOrder": { - "$ref": "#/items/0/$defs/optionalityOrderOptions", - }, - "order": { - "$ref": "#/items/0/$defs/orderOptions", - }, - }, - "type": "object", - }, - ], - }, - "optionalityOrderOptions": { - "enum": [ - "optional-first", - "required-first", - ], - "type": "string", - }, - "orderOptions": { - "enum": [ - "alphabetically", - "alphabetically-case-insensitive", - "as-written", - "natural", - "natural-case-insensitive", - ], - "type": "string", - }, - "typeItems": { - "enum": [ - "readonly-signature", - "signature", - "readonly-field", - "field", - "method", - "constructor", - ], - "type": "string", - }, - "typesConfig": { - "oneOf": [ - { - "enum": [ - "never", - ], - "type": "string", - }, - { - "items": { - "oneOf": [ - { - "$ref": "#/items/0/$defs/typeItems", - }, - { - "items": { - "$ref": "#/items/0/$defs/typeItems", - }, - "type": "array", - }, - ], - }, - "type": "array", - }, - { - "additionalProperties": false, - "properties": { - "memberTypes": { - "oneOf": [ - { - "items": { - "oneOf": [ - { - "$ref": "#/items/0/$defs/typeItems", - }, - { - "items": { - "$ref": "#/items/0/$defs/typeItems", - }, - "type": "array", - }, - ], - }, - "type": "array", - }, - { - "enum": [ - "never", - ], - "type": "string", - }, - ], - }, - "optionalityOrder": { - "$ref": "#/items/0/$defs/optionalityOrderOptions", - }, - "order": { - "$ref": "#/items/0/$defs/orderOptions", - }, - }, - "type": "object", - }, - ], - }, - }, - "additionalProperties": false, - "properties": { - "classExpressions": { - "$ref": "#/items/0/$defs/baseConfig", - }, - "classes": { - "$ref": "#/items/0/$defs/baseConfig", - }, - "default": { - "$ref": "#/items/0/$defs/baseConfig", - }, - "interfaces": { - "$ref": "#/items/0/$defs/typesConfig", - }, - "typeLiterals": { - "$ref": "#/items/0/$defs/typesConfig", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "method-signature-style": { - "create": [Function], - "defaultOptions": [ - "property", - ], - "meta": { - "docs": { - "description": "Enforce using a particular method signature syntax", - "url": "https://typescript-eslint.io/rules/method-signature-style", - }, - "fixable": "code", - "messages": { - "errorMethod": "Shorthand method signature is forbidden. Use a function property instead.", - "errorProperty": "Function property signature is forbidden. Use a method shorthand instead.", - }, - "schema": [ - { - "enum": [ - "property", - "method", - ], - "type": "string", - }, - ], - "type": "suggestion", - }, - }, - "naming-convention": { - "create": [Function], - "defaultOptions": [ - { - "format": [ - "camelCase", - ], - "leadingUnderscore": "allow", - "selector": "default", - "trailingUnderscore": "allow", - }, - { - "format": [ - "camelCase", - "PascalCase", - ], - "selector": "import", - }, - { - "format": [ - "camelCase", - "UPPER_CASE", - ], - "leadingUnderscore": "allow", - "selector": "variable", - "trailingUnderscore": "allow", - }, - { - "format": [ - "PascalCase", - ], - "selector": "typeLike", - }, - ], - "meta": { - "docs": { - "description": "Enforce naming conventions for everything across a codebase", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/naming-convention", - }, - "messages": { - "doesNotMatchFormat": "{{type}} name \`{{name}}\` must match one of the following formats: {{formats}}", - "doesNotMatchFormatTrimmed": "{{type}} name \`{{name}}\` trimmed as \`{{processedName}}\` must match one of the following formats: {{formats}}", - "missingAffix": "{{type}} name \`{{name}}\` must have one of the following {{position}}es: {{affixes}}", - "missingUnderscore": "{{type}} name \`{{name}}\` must have {{count}} {{position}} underscore(s).", - "satisfyCustom": "{{type}} name \`{{name}}\` must {{regexMatch}} the RegExp: {{regex}}", - "unexpectedUnderscore": "{{type}} name \`{{name}}\` must not have a {{position}} underscore.", - }, - "schema": { - "$defs": { - "formatOptionsConfig": { - "oneOf": [ - { - "additionalItems": false, - "items": { - "$ref": "#/$defs/predefinedFormats", - }, - "type": "array", - }, - { - "type": "null", - }, - ], - }, - "matchRegexConfig": { - "additionalProperties": false, - "properties": { - "match": { - "type": "boolean", - }, - "regex": { - "type": "string", - }, - }, - "required": [ - "match", - "regex", - ], - "type": "object", - }, - "predefinedFormats": { - "enum": [ - "camelCase", - "strictCamelCase", - "PascalCase", - "StrictPascalCase", - "snake_case", - "UPPER_CASE", - ], - "type": "string", - }, - "prefixSuffixConfig": { - "additionalItems": false, - "items": { - "minLength": 1, - "type": "string", - }, - "type": "array", - }, - "typeModifiers": { - "enum": [ - "boolean", - "string", - "number", - "function", - "array", - ], - "type": "string", - }, - "underscoreOptions": { - "enum": [ - "forbid", - "allow", - "require", - "requireDouble", - "allowDouble", - "allowSingleOrDouble", - ], - "type": "string", - }, - }, - "additionalItems": false, - "items": { - "oneOf": [ - { - "additionalProperties": false, - "description": "Multiple selectors in one config", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "const", - "readonly", - "static", - "public", - "protected", - "private", - "#private", - "abstract", - "destructured", - "global", - "exported", - "unused", - "requiresQuotes", - "override", - "async", - "default", - "namespace", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "additionalItems": false, - "items": { - "enum": [ - "default", - "variableLike", - "memberLike", - "typeLike", - "method", - "property", - "accessor", - "variable", - "function", - "parameter", - "parameterProperty", - "classicAccessor", - "enumMember", - "classMethod", - "objectLiteralMethod", - "typeMethod", - "classProperty", - "objectLiteralProperty", - "typeProperty", - "autoAccessor", - "class", - "interface", - "typeAlias", - "enum", - "typeParameter", - "import", - ], - "type": "string", - }, - "type": "array", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'default'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "const", - "readonly", - "static", - "public", - "protected", - "private", - "#private", - "abstract", - "destructured", - "global", - "exported", - "unused", - "requiresQuotes", - "override", - "async", - "default", - "namespace", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "default", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'variableLike'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "unused", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "variableLike", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'variable'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "const", - "destructured", - "exported", - "global", - "unused", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "variable", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'function'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "exported", - "global", - "unused", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "function", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'parameter'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "destructured", - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "parameter", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'memberLike'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "#private", - "protected", - "public", - "readonly", - "requiresQuotes", - "static", - "override", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "memberLike", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'classProperty'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "#private", - "protected", - "public", - "readonly", - "requiresQuotes", - "static", - "override", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "classProperty", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'objectLiteralProperty'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "public", - "requiresQuotes", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "objectLiteralProperty", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'typeProperty'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "public", - "readonly", - "requiresQuotes", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "typeProperty", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'parameterProperty'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "private", - "protected", - "public", - "readonly", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "parameterProperty", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'property'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "#private", - "protected", - "public", - "readonly", - "requiresQuotes", - "static", - "override", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "property", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'classMethod'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "#private", - "protected", - "public", - "requiresQuotes", - "static", - "override", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "classMethod", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'objectLiteralMethod'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "public", - "requiresQuotes", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "objectLiteralMethod", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'typeMethod'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "public", - "requiresQuotes", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "typeMethod", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'method'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "#private", - "protected", - "public", - "requiresQuotes", - "static", - "override", - "async", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "method", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'classicAccessor'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "protected", - "public", - "requiresQuotes", - "static", - "override", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "classicAccessor", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'autoAccessor'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "protected", - "public", - "requiresQuotes", - "static", - "override", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "autoAccessor", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'accessor'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "private", - "protected", - "public", - "requiresQuotes", - "static", - "override", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "accessor", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "types": { - "additionalItems": false, - "items": { - "$ref": "#/$defs/typeModifiers", - }, - "type": "array", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'enumMember'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "requiresQuotes", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "enumMember", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'typeLike'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "exported", - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "typeLike", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'class'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "abstract", - "exported", - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "class", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'interface'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "exported", - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "interface", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'typeAlias'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "exported", - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "typeAlias", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'enum'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "exported", - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "enum", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'typeParameter'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "unused", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "typeParameter", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - { - "additionalProperties": false, - "description": "Selector 'import'", - "properties": { - "custom": { - "$ref": "#/$defs/matchRegexConfig", - }, - "failureMessage": { - "type": "string", - }, - "filter": { - "oneOf": [ - { - "minLength": 1, - "type": "string", - }, - { - "$ref": "#/$defs/matchRegexConfig", - }, - ], - }, - "format": { - "$ref": "#/$defs/formatOptionsConfig", - }, - "leadingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - "modifiers": { - "additionalItems": false, - "items": { - "enum": [ - "default", - "namespace", - ], - "type": "string", - }, - "type": "array", - }, - "prefix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "selector": { - "enum": [ - "import", - ], - "type": "string", - }, - "suffix": { - "$ref": "#/$defs/prefixSuffixConfig", - }, - "trailingUnderscore": { - "$ref": "#/$defs/underscoreOptions", - }, - }, - "required": [ - "selector", - "format", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - "type": "suggestion", - }, - }, - "no-array-constructor": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow generic \`Array\` constructors", - "extendsBaseRule": true, - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-array-constructor", - }, - "fixable": "code", - "messages": { - "useLiteral": "The array literal notation [] is preferable.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-array-delete": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow using the \`delete\` operator on array values", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-array-delete", - }, - "hasSuggestions": true, - "messages": { - "noArrayDelete": "Using the \`delete\` operator with an array expression is unsafe.", - "useSplice": "Use \`array.splice()\` instead.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-base-to-string": { - "create": [Function], - "defaultOptions": [ - { - "ignoredTypeNames": [ - "Error", - "RegExp", - "URL", - "URLSearchParams", - ], - }, - ], - "meta": { - "docs": { - "description": "Require \`.toString()\` and \`.toLocaleString()\` to only be called on objects which provide useful information when stringified", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-base-to-string", - }, - "messages": { - "baseArrayJoin": "Using \`join()\` for {{name}} {{certainty}} use Object's default stringification format ('[object Object]') when stringified.", - "baseToString": "'{{name}}' {{certainty}} use Object's default stringification format ('[object Object]') when stringified.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoredTypeNames": { - "description": "Stringified regular expressions of type names to ignore.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-confusing-non-null-assertion": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow non-null assertion in locations that may be confusing", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/no-confusing-non-null-assertion", - }, - "hasSuggestions": true, - "messages": { - "confusingAssign": "Confusing combination of non-null assertion and assignment like \`a! = b\`, which looks very similar to \`a != b\`.", - "confusingEqual": "Confusing combination of non-null assertion and equality test like \`a! == b\`, which looks very similar to \`a !== b\`.", - "confusingOperator": "Confusing combination of non-null assertion and \`{{operator}}\` operator like \`a! {{operator}} b\`, which might be misinterpreted as \`!(a {{operator}} b)\`.", - "notNeedInAssign": "Remove unnecessary non-null assertion (!) in assignment left-hand side.", - "notNeedInEqualTest": "Remove unnecessary non-null assertion (!) in equality test.", - "notNeedInOperator": "Remove possibly unnecessary non-null assertion (!) in the left operand of the \`{{operator}}\` operator.", - "wrapUpLeft": "Wrap the left-hand side in parentheses to avoid confusion with "{{operator}}" operator.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-confusing-void-expression": { - "create": [Function], - "defaultOptions": [ - { - "ignoreArrowShorthand": false, - "ignoreVoidOperator": false, - "ignoreVoidReturningFunctions": false, - }, - ], - "meta": { - "docs": { - "description": "Require expressions of type void to appear in statement position", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-confusing-void-expression", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "invalidVoidExpr": "Placing a void expression inside another expression is forbidden. Move it to its own statement instead.", - "invalidVoidExprArrow": "Returning a void expression from an arrow function shorthand is forbidden. Please add braces to the arrow function.", - "invalidVoidExprArrowWrapVoid": "Void expressions returned from an arrow function shorthand must be marked explicitly with the \`void\` operator.", - "invalidVoidExprReturn": "Returning a void expression from a function is forbidden. Please move it before the \`return\` statement.", - "invalidVoidExprReturnLast": "Returning a void expression from a function is forbidden. Please remove the \`return\` statement.", - "invalidVoidExprReturnWrapVoid": "Void expressions returned from a function must be marked explicitly with the \`void\` operator.", - "invalidVoidExprWrapVoid": "Void expressions used inside another expression must be moved to its own statement or marked explicitly with the \`void\` operator.", - "voidExprWrapVoid": "Mark with an explicit \`void\` operator.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreArrowShorthand": { - "description": "Whether to ignore "shorthand" \`() =>\` arrow functions: those without \`{ ... }\` braces.", - "type": "boolean", - }, - "ignoreVoidOperator": { - "description": "Whether to ignore returns that start with the \`void\` operator.", - "type": "boolean", - }, - "ignoreVoidReturningFunctions": { - "description": "Whether to ignore returns from functions with explicit \`void\` return types and functions with contextual \`void\` return types.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-deprecated": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - }, - ], - "meta": { - "docs": { - "description": "Disallow using code marked as \`@deprecated\`", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-deprecated", - }, - "messages": { - "deprecated": "\`{{name}}\` is deprecated.", - "deprecatedWithReason": "\`{{name}}\` is deprecated. {{reason}}", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Type specifiers that can be allowed.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-dupe-class-members": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow duplicate class members", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-dupe-class-members", - }, - "hasSuggestions": undefined, - "messages": { - "unexpected": "Duplicate name '{{name}}'.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-duplicate-enum-values": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow duplicate enum member values", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-duplicate-enum-values", - }, - "hasSuggestions": false, - "messages": { - "duplicateValue": "Duplicate enum member value {{value}}.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-duplicate-type-constituents": { - "create": [Function], - "defaultOptions": [ - { - "ignoreIntersections": false, - "ignoreUnions": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow duplicate constituents of union or intersection types", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-duplicate-type-constituents", - }, - "fixable": "code", - "messages": { - "duplicate": "{{type}} type constituent is duplicated with {{previous}}.", - "unnecessary": "Explicit undefined is unnecessary on an optional parameter.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreIntersections": { - "description": "Whether to ignore \`&\` intersections.", - "type": "boolean", - }, - "ignoreUnions": { - "description": "Whether to ignore \`|\` unions.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-dynamic-delete": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow using the \`delete\` operator on computed key expressions", - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/no-dynamic-delete", - }, - "fixable": "code", - "messages": { - "dynamicDelete": "Do not delete dynamically computed property keys.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-empty-function": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - }, - ], - "meta": { - "defaultOptions": [ - { - "allow": [], - }, - ], - "docs": { - "description": "Disallow empty functions", - "extendsBaseRule": true, - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/no-empty-function", - }, - "hasSuggestions": undefined, - "messages": { - "unexpected": "Unexpected empty {{name}}.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Locations and kinds of functions that are allowed to be empty.", - "items": { - "enum": [ - "functions", - "arrowFunctions", - "generatorFunctions", - "methods", - "generatorMethods", - "getters", - "setters", - "constructors", - "private-constructors", - "protected-constructors", - "asyncFunctions", - "asyncMethods", - "decoratedFunctions", - "overrideMethods", - ], - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-empty-interface": { - "create": [Function], - "defaultOptions": [ - { - "allowSingleExtends": false, - }, - ], - "meta": { - "deprecated": { - "deprecatedSince": "8.0.0", - "replacedBy": [ - { - "rule": { - "name": "@typescript-eslint/no-empty-object-type", - "url": "https://typescript-eslint.io/rules/no-empty-object-type", - }, - }, - ], - "url": "https://github.com/typescript-eslint/typescript-eslint/pull/8977", - }, - "docs": { - "description": "Disallow the declaration of empty interfaces", - "url": "https://typescript-eslint.io/rules/no-empty-interface", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "noEmpty": "An empty interface is equivalent to \`{}\`.", - "noEmptyWithSuper": "An interface declaring no members is equivalent to its supertype.", - }, - "replacedBy": [ - "@typescript-eslint/no-empty-object-type", - ], - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowSingleExtends": { - "description": "Whether to allow empty interfaces that extend a single other interface.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-empty-object-type": { - "create": [Function], - "defaultOptions": [ - { - "allowInterfaces": "never", - "allowObjectTypes": "never", - }, - ], - "meta": { - "docs": { - "description": "Disallow accidentally using the "empty object" type", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-empty-object-type", - }, - "hasSuggestions": true, - "messages": { - "noEmptyInterface": "An empty interface declaration allows any non-nullish value, including literals like \`0\` and \`""\`. -- If that's what you want, disable this lint rule with an inline comment or configure the '{{ option }}' rule option. -- If you want a type meaning "any object", you probably want \`object\` instead. -- If you want a type meaning "any value", you probably want \`unknown\` instead.", - "noEmptyInterfaceWithSuper": "An interface declaring no members is equivalent to its supertype.", - "noEmptyObject": "The \`{}\` ("empty object") type allows any non-nullish value, including literals like \`0\` and \`""\`. -- If that's what you want, disable this lint rule with an inline comment or configure the '{{ option }}' rule option. -- If you want a type meaning "any object", you probably want \`object\` instead. -- If you want a type meaning "any value", you probably want \`unknown\` instead.", - "replaceEmptyInterface": "Replace empty interface with \`{{replacement}}\`.", - "replaceEmptyInterfaceWithSuper": "Replace empty interface with a type alias.", - "replaceEmptyObjectType": "Replace \`{}\` with \`{{replacement}}\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowInterfaces": { - "description": "Whether to allow empty interfaces.", - "enum": [ - "always", - "never", - "with-single-extends", - ], - "type": "string", - }, - "allowObjectTypes": { - "description": "Whether to allow empty object type literals.", - "enum": [ - "always", - "never", - ], - "type": "string", - }, - "allowWithName": { - "description": "A stringified regular expression to allow interfaces and object type aliases with the configured name.", - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-explicit-any": { - "create": [Function], - "defaultOptions": [ - { - "fixToUnknown": false, - "ignoreRestArgs": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow the \`any\` type", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-explicit-any", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "suggestNever": "Use \`never\` instead, this is useful when instantiating generic type parameters that you don't need to know the type of.", - "suggestUnknown": "Use \`unknown\` instead, this will force you to explicitly, and safely assert the type is correct.", - "unexpectedAny": "Unexpected any. Specify a different type.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "fixToUnknown": { - "description": "Whether to enable auto-fixing in which the \`any\` type is converted to the \`unknown\` type.", - "type": "boolean", - }, - "ignoreRestArgs": { - "description": "Whether to ignore rest parameter arrays.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-extra-non-null-assertion": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow extra non-null assertions", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-extra-non-null-assertion", - }, - "fixable": "code", - "messages": { - "noExtraNonNullAssertion": "Forbidden extra non-null assertion.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-extraneous-class": { - "create": [Function], - "defaultOptions": [ - { - "allowConstructorOnly": false, - "allowEmpty": false, - "allowStaticOnly": false, - "allowWithDecorator": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow classes used as namespaces", - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/no-extraneous-class", - }, - "messages": { - "empty": "Unexpected empty class.", - "onlyConstructor": "Unexpected class with only a constructor.", - "onlyStatic": "Unexpected class with only static properties.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowConstructorOnly": { - "description": "Whether to allow extraneous classes that contain only a constructor.", - "type": "boolean", - }, - "allowEmpty": { - "description": "Whether to allow extraneous classes that have no body (i.e. are empty).", - "type": "boolean", - }, - "allowStaticOnly": { - "description": "Whether to allow extraneous classes that only contain static members.", - "type": "boolean", - }, - "allowWithDecorator": { - "description": "Whether to allow extraneous classes that include a decorator.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-floating-promises": { - "create": [Function], - "defaultOptions": [ - { - "allowForKnownSafeCalls": [], - "allowForKnownSafePromises": [], - "checkThenables": false, - "ignoreIIFE": false, - "ignoreVoid": true, - }, - ], - "meta": { - "docs": { - "description": "Require Promise-like statements to be handled appropriately", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-floating-promises", - }, - "hasSuggestions": true, - "messages": { - "floating": "Promises must be awaited, end with a call to .catch, or end with a call to .then with a rejection handler.", - "floatingFixAwait": "Add await operator.", - "floatingFixVoid": "Add void operator to ignore.", - "floatingPromiseArray": "An array of Promises may be unintentional. Consider handling the promises' fulfillment or rejection with Promise.all or similar.", - "floatingPromiseArrayVoid": "An array of Promises may be unintentional. Consider handling the promises' fulfillment or rejection with Promise.all or similar, or explicitly marking the expression as ignored with the \`void\` operator.", - "floatingUselessRejectionHandler": "Promises must be awaited, end with a call to .catch, or end with a call to .then with a rejection handler. A rejection handler that is not a function will be ignored.", - "floatingUselessRejectionHandlerVoid": "Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the \`void\` operator. A rejection handler that is not a function will be ignored.", - "floatingVoid": "Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the \`void\` operator.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowForKnownSafeCalls": { - "description": "Type specifiers of functions whose calls are safe to float.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - "allowForKnownSafePromises": { - "description": "Type specifiers that are known to be safe to float.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - "checkThenables": { - "description": "Whether to check all "Thenable"s, not just the built-in Promise type.", - "type": "boolean", - }, - "ignoreIIFE": { - "description": "Whether to ignore async IIFEs (Immediately Invoked Function Expressions).", - "type": "boolean", - }, - "ignoreVoid": { - "description": "Whether to ignore \`void\` expressions.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-for-in-array": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow iterating over an array with a for-in loop", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-for-in-array", - }, - "messages": { - "forInViolation": "For-in loops over arrays skips holes, returns indices as strings, and may visit the prototype chain or other enumerable properties. Use a more robust iteration method such as for-of or array.forEach instead.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-implied-eval": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow the use of \`eval()\`-like functions", - "extendsBaseRule": true, - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-implied-eval", - }, - "messages": { - "noFunctionConstructor": "Implied eval. Do not use the Function constructor to create functions.", - "noImpliedEvalError": "Implied eval. Consider passing a function.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-import-type-side-effects": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce the use of top-level import type qualifier when an import only has specifiers with inline type qualifiers", - "url": "https://typescript-eslint.io/rules/no-import-type-side-effects", - }, - "fixable": "code", - "messages": { - "useTopLevelQualifier": "TypeScript will only remove the inline type specifiers which will leave behind a side effect import at runtime. Convert this to a top-level type qualifier to properly remove the entire import.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-inferrable-types": { - "create": [Function], - "defaultOptions": [ - { - "ignoreParameters": false, - "ignoreProperties": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow explicit type declarations for variables or parameters initialized to a number, string, or boolean", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/no-inferrable-types", - }, - "fixable": "code", - "messages": { - "noInferrableType": "Type {{type}} trivially inferred from a {{type}} literal, remove type annotation.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreParameters": { - "description": "Whether to ignore function parameters.", - "type": "boolean", - }, - "ignoreProperties": { - "description": "Whether to ignore class properties.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-invalid-this": { - "create": [Function], - "defaultOptions": [ - { - "capIsConstructor": true, - }, - ], - "meta": { - "defaultOptions": [ - { - "capIsConstructor": true, - }, - ], - "docs": { - "description": "Disallow \`this\` keywords outside of classes or class-like objects", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-invalid-this", - }, - "hasSuggestions": undefined, - "messages": { - "unexpectedThis": "Unexpected 'this'.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "capIsConstructor": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-invalid-void-type": { - "create": [Function], - "defaultOptions": [ - { - "allowAsThisParameter": false, - "allowInGenericTypeArguments": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow \`void\` type outside of generic or return types", - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/no-invalid-void-type", - }, - "messages": { - "invalidVoidForGeneric": "{{ generic }} may not have void as a type argument.", - "invalidVoidNotReturn": "void is only valid as a return type.", - "invalidVoidNotReturnOrGeneric": "void is only valid as a return type or generic type argument.", - "invalidVoidNotReturnOrThisParam": "void is only valid as return type or type of \`this\` parameter.", - "invalidVoidNotReturnOrThisParamOrGeneric": "void is only valid as a return type or generic type argument or the type of a \`this\` parameter.", - "invalidVoidUnionConstituent": "void is not valid as a constituent in a union type", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowAsThisParameter": { - "description": "Whether a \`this\` parameter of a function may be \`void\`.", - "type": "boolean", - }, - "allowInGenericTypeArguments": { - "description": "Whether \`void\` can be used as a valid value for generic type parameters.", - "oneOf": [ - { - "description": "Whether \`void\` can be used as a valid value for all generic type parameters.", - "type": "boolean", - }, - { - "description": "Allowlist of types that may accept \`void\` as a generic type parameter.", - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - }, - ], - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-loop-func": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow function declarations that contain unsafe references inside loop statements", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-loop-func", - }, - "hasSuggestions": undefined, - "messages": { - "unsafeRefs": "Function declared in a loop contains unsafe references to variable(s) {{ varNames }}.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-loss-of-precision": { - "create": [Function], - "defaultOptions": [], - "meta": { - "deprecated": { - "deprecatedSince": "8.0.0", - "replacedBy": [ - { - "rule": { - "name": "no-loss-of-precision", - "url": "https://eslint.org/docs/latest/rules/no-loss-of-precision", - }, - }, - ], - "url": "https://github.com/typescript-eslint/typescript-eslint/pull/8832", - }, - "docs": { - "description": "Disallow literal numbers that lose precision", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-loss-of-precision", - }, - "hasSuggestions": undefined, - "messages": { - "noLossOfPrecision": "This number literal will lose precision at runtime.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-magic-numbers": { - "create": [Function], - "defaultOptions": [ - { - "detectObjects": false, - "enforceConst": false, - "ignore": [], - "ignoreArrayIndexes": false, - "ignoreEnums": false, - "ignoreNumericLiteralTypes": false, - "ignoreReadonlyClassProperties": false, - "ignoreTypeIndexes": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow magic numbers", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-magic-numbers", - }, - "messages": { - "noMagic": "No magic number: {{raw}}.", - "useConst": "Number constants declarations must use 'const'.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "detectObjects": { - "default": false, - "type": "boolean", - }, - "enforceConst": { - "default": false, - "type": "boolean", - }, - "ignore": { - "items": { - "anyOf": [ - { - "type": "number", - }, - { - "pattern": "^[+-]?(?:0|[1-9][0-9]*)n$", - "type": "string", - }, - ], - }, - "type": "array", - "uniqueItems": true, - }, - "ignoreArrayIndexes": { - "default": false, - "type": "boolean", - }, - "ignoreClassFieldInitialValues": { - "default": false, - "type": "boolean", - }, - "ignoreDefaultValues": { - "default": false, - "type": "boolean", - }, - "ignoreEnums": { - "description": "Whether enums used in TypeScript are considered okay.", - "type": "boolean", - }, - "ignoreNumericLiteralTypes": { - "description": "Whether numbers used in TypeScript numeric literal types are considered okay.", - "type": "boolean", - }, - "ignoreReadonlyClassProperties": { - "description": "Whether \`readonly\` class properties are considered okay.", - "type": "boolean", - }, - "ignoreTypeIndexes": { - "description": "Whether numbers used to index types are okay.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-meaningless-void-operator": { - "create": [Function], - "defaultOptions": [ - { - "checkNever": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow the \`void\` operator except when used to discard a value", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-meaningless-void-operator", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "meaninglessVoidOperator": "void operator shouldn't be used on {{type}}; it should convey that a return value is being ignored", - "removeVoid": "Remove 'void'", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "checkNever": { - "default": false, - "description": "Whether to suggest removing \`void\` when the argument has type \`never\`.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-misused-new": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce valid definition of \`new\` and \`constructor\`", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-misused-new", - }, - "messages": { - "errorMessageClass": "Class cannot have method named \`new\`.", - "errorMessageInterface": "Interfaces cannot be constructed, only classes.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-misused-promises": { - "create": [Function], - "defaultOptions": [ - { - "checksConditionals": true, - "checksSpreads": true, - "checksVoidReturn": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow Promises in places not designed to handle them", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-misused-promises", - }, - "messages": { - "conditional": "Expected non-Promise value in a boolean conditional.", - "predicate": "Expected a non-Promise value to be returned.", - "spread": "Expected a non-Promise value to be spreaded in an object.", - "voidReturnArgument": "Promise returned in function argument where a void return was expected.", - "voidReturnAttribute": "Promise-returning function provided to attribute where a void return was expected.", - "voidReturnInheritedMethod": "Promise-returning method provided where a void return was expected by extended/implemented type '{{ heritageTypeName }}'.", - "voidReturnProperty": "Promise-returning function provided to property where a void return was expected.", - "voidReturnReturnValue": "Promise-returning function provided to return value where a void return was expected.", - "voidReturnVariable": "Promise-returning function provided to variable where a void return was expected.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "checksConditionals": { - "description": "Whether to warn when a Promise is provided to conditional statements.", - "type": "boolean", - }, - "checksSpreads": { - "description": "Whether to warn when \`...\` spreading a \`Promise\`.", - "type": "boolean", - }, - "checksVoidReturn": { - "description": "Whether to warn when a Promise is returned from a function typed as returning \`void\`.", - "oneOf": [ - { - "description": "Whether to disable checking all asynchronous functions.", - "type": "boolean", - }, - { - "additionalProperties": false, - "description": "Which forms of functions may have checking disabled.", - "properties": { - "arguments": { - "description": "Disables checking an asynchronous function passed as argument where the parameter type expects a function that returns \`void\`.", - "type": "boolean", - }, - "attributes": { - "description": "Disables checking an asynchronous function passed as a JSX attribute expected to be a function that returns \`void\`.", - "type": "boolean", - }, - "inheritedMethods": { - "description": "Disables checking an asynchronous method in a type that extends or implements another type expecting that method to return \`void\`.", - "type": "boolean", - }, - "properties": { - "description": "Disables checking an asynchronous function passed as an object property expected to be a function that returns \`void\`.", - "type": "boolean", - }, - "returns": { - "description": "Disables checking an asynchronous function returned in a function whose return type is a function that returns \`void\`.", - "type": "boolean", - }, - "variables": { - "description": "Disables checking an asynchronous function used as a variable whose return type is a function that returns \`void\`.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-misused-spread": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - }, - ], - "meta": { - "docs": { - "description": "Disallow using the spread operator when it might cause unexpected behavior", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-misused-spread", - }, - "hasSuggestions": true, - "messages": { - "addAwait": "Add await operator.", - "noArraySpreadInObject": "Using the spread operator on an array in an object will result in a list of indices.", - "noClassDeclarationSpreadInObject": "Using the spread operator on class declarations will spread only their static properties, and will lose their class prototype.", - "noClassInstanceSpreadInObject": "Using the spread operator on class instances will lose their class prototype.", - "noFunctionSpreadInObject": "Using the spread operator on a function without additional properties can cause unexpected behavior. Did you forget to call the function?", - "noIterableSpreadInObject": "Using the spread operator on an Iterable in an object can cause unexpected behavior.", - "noMapSpreadInObject": "Using the spread operator on a Map in an object will result in an empty object. Did you mean to use \`Object.fromEntries(map)\` instead?", - "noPromiseSpreadInObject": "Using the spread operator on Promise in an object can cause unexpected behavior. Did you forget to await the promise?", - "noStringSpread": "Using the spread operator on a string can mishandle special characters, as can \`.split("")\`. -- \`...\` produces Unicode code points, which will decompose complex emojis into individual emojis -- .split("") produces UTF-16 code units, which breaks rich characters in many languages -Consider using \`Intl.Segmenter\` for locale-aware string decomposition. -Otherwise, if you don't need to preserve emojis or other non-Ascii characters, disable this lint rule on this line or configure the 'allow' rule option.", - "replaceMapSpreadInObject": "Replace map spread in object with \`Object.fromEntries()\`", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "An array of type specifiers that are known to be safe to spread.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-mixed-enums": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow enums from having both number and string members", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-mixed-enums", - }, - "messages": { - "mixed": "Mixing number and string enums can be confusing.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-namespace": { - "create": [Function], - "defaultOptions": [ - { - "allowDeclarations": false, - "allowDefinitionFiles": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow TypeScript namespaces", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-namespace", - }, - "messages": { - "moduleSyntaxIsPreferred": "ES2015 module syntax is preferred over namespaces.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowDeclarations": { - "description": "Whether to allow \`declare\` with custom TypeScript namespaces.", - "type": "boolean", - }, - "allowDefinitionFiles": { - "description": "Whether to allow \`declare\` with custom TypeScript namespaces inside definition files.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-non-null-asserted-nullish-coalescing": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow non-null assertions in the left operand of a nullish coalescing operator", - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/no-non-null-asserted-nullish-coalescing", - }, - "hasSuggestions": true, - "messages": { - "noNonNullAssertedNullishCoalescing": "The nullish coalescing operator is designed to handle undefined and null - using a non-null assertion is not needed.", - "suggestRemovingNonNull": "Remove the non-null assertion.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-non-null-asserted-optional-chain": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow non-null assertions after an optional chain expression", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-non-null-asserted-optional-chain", - }, - "hasSuggestions": true, - "messages": { - "noNonNullOptionalChain": "Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong.", - "suggestRemovingNonNull": "You should remove the non-null assertion.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-non-null-assertion": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow non-null assertions using the \`!\` postfix operator", - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/no-non-null-assertion", - }, - "hasSuggestions": true, - "messages": { - "noNonNull": "Forbidden non-null assertion.", - "suggestOptionalChain": "Consider using the optional chain operator \`?.\` instead. This operator includes runtime checks, so it is safer than the compile-only non-null assertion operator.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-redeclare": { - "create": [Function], - "defaultOptions": [ - { - "builtinGlobals": true, - "ignoreDeclarationMerge": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow variable redeclaration", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-redeclare", - }, - "messages": { - "redeclared": "'{{id}}' is already defined.", - "redeclaredAsBuiltin": "'{{id}}' is already defined as a built-in global variable.", - "redeclaredBySyntax": "'{{id}}' is already defined by a variable declaration.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "builtinGlobals": { - "description": "Whether to report shadowing of built-in global variables.", - "type": "boolean", - }, - "ignoreDeclarationMerge": { - "description": "Whether to ignore declaration merges between certain TypeScript declaration types.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-redundant-type-constituents": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow members of unions and intersections that do nothing or override type information", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-redundant-type-constituents", - }, - "messages": { - "errorTypeOverrides": "'{{typeName}}' is an 'error' type that acts as 'any' and overrides all other types in this {{container}} type.", - "literalOverridden": "{{literal}} is overridden by {{primitive}} in this union type.", - "overridden": "'{{typeName}}' is overridden by other types in this {{container}} type.", - "overrides": "'{{typeName}}' overrides all other types in this {{container}} type.", - "primitiveOverridden": "{{primitive}} is overridden by the {{literal}} in this intersection type.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-require-imports": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - "allowAsImport": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow invocation of \`require()\`", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-require-imports", - }, - "messages": { - "noRequireImports": "A \`require()\` style import is forbidden.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Patterns of import paths to allow requiring from.", - "items": { - "type": "string", - }, - "type": "array", - }, - "allowAsImport": { - "description": "Allows \`require\` statements in import declarations.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-restricted-imports": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow specified modules when loaded by \`import\`", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-restricted-imports", - }, - "fixable": undefined, - "messages": { - "allowedImportName": "'{{importName}}' import from '{{importSource}}' is restricted because only '{{allowedImportNames}}' import(s) is/are allowed.", - "allowedImportNamePattern": "'{{importName}}' import from '{{importSource}}' is restricted because only imports that match the pattern '{{allowedImportNamePattern}}' are allowed from '{{importSource}}'.", - "allowedImportNamePatternWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted because only imports that match the pattern '{{allowedImportNamePattern}}' are allowed from '{{importSource}}'. {{customMessage}}", - "allowedImportNameWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted because only '{{allowedImportNames}}' import(s) is/are allowed. {{customMessage}}", - "everything": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted.", - "everythingWithAllowImportNames": "* import is invalid because only '{{allowedImportNames}}' from '{{importSource}}' is/are allowed.", - "everythingWithAllowImportNamesAndCustomMessage": "* import is invalid because only '{{allowedImportNames}}' from '{{importSource}}' is/are allowed. {{customMessage}}", - "everythingWithAllowedImportNamePattern": "* import is invalid because only imports that match the pattern '{{allowedImportNamePattern}}' from '{{importSource}}' are allowed.", - "everythingWithAllowedImportNamePatternWithCustomMessage": "* import is invalid because only imports that match the pattern '{{allowedImportNamePattern}}' from '{{importSource}}' are allowed. {{customMessage}}", - "everythingWithCustomMessage": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted. {{customMessage}}", - "importName": "'{{importName}}' import from '{{importSource}}' is restricted.", - "importNameWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted. {{customMessage}}", - "path": "'{{importSource}}' import is restricted from being used.", - "pathWithCustomMessage": "'{{importSource}}' import is restricted from being used. {{customMessage}}", - "patternAndEverything": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted from being used by a pattern.", - "patternAndEverythingWithCustomMessage": "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted from being used by a pattern. {{customMessage}}", - "patternAndEverythingWithRegexImportName": "* import is invalid because import name matching '{{importNames}}' pattern from '{{importSource}}' is restricted from being used.", - "patternAndEverythingWithRegexImportNameAndCustomMessage": "* import is invalid because import name matching '{{importNames}}' pattern from '{{importSource}}' is restricted from being used. {{customMessage}}", - "patternAndImportName": "'{{importName}}' import from '{{importSource}}' is restricted from being used by a pattern.", - "patternAndImportNameWithCustomMessage": "'{{importName}}' import from '{{importSource}}' is restricted from being used by a pattern. {{customMessage}}", - "patternWithCustomMessage": "'{{importSource}}' import is restricted from being used by a pattern. {{customMessage}}", - "patterns": "'{{importSource}}' import is restricted from being used by a pattern.", - }, - "schema": { - "anyOf": [ - { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "allowImportNames": { - "items": { - "type": "string", - }, - "type": "array", - }, - "allowTypeImports": { - "description": "Whether to allow type-only imports for a path.", - "type": "boolean", - }, - "importNames": { - "items": { - "type": "string", - }, - "type": "array", - }, - "message": { - "minLength": 1, - "type": "string", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - ], - "type": "object", - }, - ], - }, - "type": "array", - "uniqueItems": true, - }, - { - "additionalItems": false, - "items": [ - { - "additionalProperties": false, - "properties": { - "paths": { - "items": { - "anyOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "allowImportNames": { - "items": { - "type": "string", - }, - "type": "array", - }, - "allowTypeImports": { - "description": "Whether to allow type-only imports for a path.", - "type": "boolean", - }, - "importNames": { - "items": { - "type": "string", - }, - "type": "array", - }, - "message": { - "minLength": 1, - "type": "string", - }, - "name": { - "type": "string", - }, - }, - "required": [ - "name", - ], - "type": "object", - }, - ], - }, - "type": "array", - "uniqueItems": true, - }, - "patterns": { - "anyOf": [ - { - "items": { - "type": "string", - }, - "type": "array", - "uniqueItems": true, - }, - { - "items": { - "additionalProperties": false, - "properties": { - "allowImportNamePattern": { - "type": "string", - }, - "allowImportNames": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "allowTypeImports": { - "description": "Whether to allow type-only imports for a path.", - "type": "boolean", - }, - "caseSensitive": { - "type": "boolean", - }, - "group": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "importNamePattern": { - "type": "string", - }, - "importNames": { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - "message": { - "minLength": 1, - "type": "string", - }, - "regex": { - "type": "string", - }, - }, - "required": undefined, - "type": "object", - }, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - ], - }, - "type": "suggestion", - }, - }, - "no-restricted-types": { - "create": [Function], - "defaultOptions": [ - {}, - ], - "meta": { - "docs": { - "description": "Disallow certain types", - "url": "https://typescript-eslint.io/rules/no-restricted-types", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "bannedTypeMessage": "Don't use \`{{name}}\` as a type.{{customMessage}}", - "bannedTypeReplacement": "Replace \`{{name}}\` with \`{{replacement}}\`.", - }, - "schema": [ - { - "$defs": { - "banConfig": { - "oneOf": [ - { - "description": "Bans the type with the default message.", - "enum": [ - true, - ], - "type": "boolean", - }, - { - "description": "Bans the type with a custom message.", - "type": "string", - }, - { - "additionalProperties": false, - "description": "Bans a type.", - "properties": { - "fixWith": { - "description": "Type to autofix replace with. Note that autofixers can be applied automatically - so you need to be careful with this option.", - "type": "string", - }, - "message": { - "description": "Custom error message.", - "type": "string", - }, - "suggest": { - "description": "Types to suggest replacing with.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - }, - }, - "additionalProperties": false, - "properties": { - "types": { - "additionalProperties": { - "$ref": "#/items/0/$defs/banConfig", - }, - "description": "An object whose keys are the types you want to ban, and the values are error messages.", - "type": "object", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-shadow": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - "builtinGlobals": false, - "hoist": "functions-and-types", - "ignoreFunctionTypeParameterNameValueShadow": true, - "ignoreOnInitialization": false, - "ignoreTypeValueShadow": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow variable declarations from shadowing variables declared in the outer scope", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-shadow", - }, - "messages": { - "noShadow": "'{{name}}' is already declared in the upper scope on line {{shadowedLine}} column {{shadowedColumn}}.", - "noShadowGlobal": "'{{name}}' is already a global variable.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Identifier names for which shadowing is allowed.", - "items": { - "type": "string", - }, - "type": "array", - }, - "builtinGlobals": { - "description": "Whether to report shadowing of built-in global variables.", - "type": "boolean", - }, - "hoist": { - "description": "Whether to report shadowing before outer functions or variables are defined.", - "enum": [ - "all", - "functions", - "functions-and-types", - "never", - "types", - ], - "type": "string", - }, - "ignoreFunctionTypeParameterNameValueShadow": { - "description": "Whether to ignore function parameters named the same as a variable.", - "type": "boolean", - }, - "ignoreOnInitialization": { - "description": "Whether to ignore the variable initializers when the shadowed variable is presumably still unitialized.", - "type": "boolean", - }, - "ignoreTypeValueShadow": { - "description": "Whether to ignore types named the same as a variable.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-this-alias": { - "create": [Function], - "defaultOptions": [ - { - "allowDestructuring": true, - "allowedNames": [], - }, - ], - "meta": { - "docs": { - "description": "Disallow aliasing \`this\`", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-this-alias", - }, - "messages": { - "thisAssignment": "Unexpected aliasing of 'this' to local variable.", - "thisDestructure": "Unexpected aliasing of members of 'this' to local variables.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowDestructuring": { - "description": "Whether to ignore destructurings, such as \`const { props, state } = this\`.", - "type": "boolean", - }, - "allowedNames": { - "description": "Names to ignore, such as ["self"] for \`const self = this;\`.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-type-alias": { - "create": [Function], - "defaultOptions": [ - { - "allowAliases": "never", - "allowCallbacks": "never", - "allowConditionalTypes": "never", - "allowConstructors": "never", - "allowGenerics": "never", - "allowLiterals": "never", - "allowMappedTypes": "never", - "allowTupleTypes": "never", - }, - ], - "meta": { - "deprecated": { - "deprecatedSince": "6.0.0", - "replacedBy": [ - { - "rule": { - "name": "@typescript-eslint/consistent-type-definitions", - "url": "https://typescript-eslint.io/rules/consistent-type-definitions", - }, - }, - ], - "url": "https://github.com/typescript-eslint/typescript-eslint/pull/6229", - }, - "docs": { - "description": "Disallow type aliases", - "url": "https://typescript-eslint.io/rules/no-type-alias", - }, - "messages": { - "noCompositionAlias": "{{typeName}} in {{compositionType}} types are not allowed.", - "noTypeAlias": "Type {{alias}} are not allowed.", - }, - "schema": [ - { - "$defs": { - "expandedOptions": { - "enum": [ - "always", - "never", - "in-unions", - "in-intersections", - "in-unions-and-intersections", - ], - "type": "string", - }, - "simpleOptions": { - "enum": [ - "always", - "never", - ], - "type": "string", - }, - }, - "additionalProperties": false, - "properties": { - "allowAliases": { - "$ref": "#/items/0/$defs/expandedOptions", - "description": "Whether to allow direct one-to-one type aliases.", - }, - "allowCallbacks": { - "$ref": "#/items/0/$defs/simpleOptions", - "description": "Whether to allow type aliases for callbacks.", - }, - "allowConditionalTypes": { - "$ref": "#/items/0/$defs/simpleOptions", - "description": "Whether to allow type aliases for conditional types.", - }, - "allowConstructors": { - "$ref": "#/items/0/$defs/simpleOptions", - "description": "Whether to allow type aliases with constructors.", - }, - "allowGenerics": { - "$ref": "#/items/0/$defs/simpleOptions", - "description": "Whether to allow type aliases with generic types.", - }, - "allowLiterals": { - "$ref": "#/items/0/$defs/expandedOptions", - "description": "Whether to allow type aliases with object literal types.", - }, - "allowMappedTypes": { - "$ref": "#/items/0/$defs/expandedOptions", - "description": "Whether to allow type aliases with mapped types.", - }, - "allowTupleTypes": { - "$ref": "#/items/0/$defs/expandedOptions", - "description": "Whether to allow type aliases with tuple types.", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-unnecessary-boolean-literal-compare": { - "create": [Function], - "defaultOptions": [ - { - "allowComparingNullableBooleansToFalse": true, - "allowComparingNullableBooleansToTrue": true, - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow unnecessary equality comparisons against boolean literals", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-boolean-literal-compare", - }, - "fixable": "code", - "messages": { - "comparingNullableToFalse": "This expression unnecessarily compares a nullable boolean value to false instead of using the ?? operator to provide a default.", - "comparingNullableToTrueDirect": "This expression unnecessarily compares a nullable boolean value to true instead of using it directly.", - "comparingNullableToTrueNegated": "This expression unnecessarily compares a nullable boolean value to true instead of negating it.", - "direct": "This expression unnecessarily compares a boolean value to a boolean instead of using it directly.", - "negated": "This expression unnecessarily compares a boolean value to a boolean instead of negating it.", - "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowComparingNullableBooleansToFalse": { - "description": "Whether to allow comparisons between nullable boolean variables and \`false\`.", - "type": "boolean", - }, - "allowComparingNullableBooleansToTrue": { - "description": "Whether to allow comparisons between nullable boolean variables and \`true\`.", - "type": "boolean", - }, - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { - "description": "Unless this is set to \`true\`, the rule will error on every file whose \`tsconfig.json\` does _not_ have the \`strictNullChecks\` compiler option (or \`strict\`) set to \`true\`.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-unnecessary-condition": { - "create": [Function], - "defaultOptions": [ - { - "allowConstantLoopConditions": "never", - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, - "checkTypePredicates": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow conditionals where the type is always truthy or always falsy", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-condition", - }, - "fixable": "code", - "messages": { - "alwaysFalsy": "Unnecessary conditional, value is always falsy.", - "alwaysFalsyFunc": "This callback should return a conditional, but return is always falsy.", - "alwaysNullish": "Unnecessary conditional, left-hand side of \`??\` operator is always \`null\` or \`undefined\`.", - "alwaysTruthy": "Unnecessary conditional, value is always truthy.", - "alwaysTruthyFunc": "This callback should return a conditional, but return is always truthy.", - "comparisonBetweenLiteralTypes": "Unnecessary conditional, comparison is always {{trueOrFalse}}, since \`{{left}} {{operator}} {{right}}\` is {{trueOrFalse}}.", - "never": "Unnecessary conditional, value is \`never\`.", - "neverNullish": "Unnecessary conditional, expected left-hand side of \`??\` operator to be possibly null or undefined.", - "neverOptionalChain": "Unnecessary optional chain on a non-nullish value.", - "noOverlapBooleanExpression": "Unnecessary conditional, the types have no overlap.", - "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", - "typeGuardAlreadyIsType": "Unnecessary conditional, expression already has the type being checked by the {{typeGuardOrAssertionFunction}}.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowConstantLoopConditions": { - "description": "Whether to ignore constant loop conditions, such as \`while (true)\`.", - "oneOf": [ - { - "type": "boolean", - }, - { - "enum": [ - "always", - "never", - "only-allowed-literals", - ], - "type": "string", - }, - ], - }, - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { - "description": "Whether to not error when running with a tsconfig that has strictNullChecks turned.", - "type": "boolean", - }, - "checkTypePredicates": { - "description": "Whether to check the asserted argument of a type predicate function for unnecessary conditions", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-unnecessary-parameter-property-assignment": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow unnecessary assignment of constructor property parameter", - "url": "https://typescript-eslint.io/rules/no-unnecessary-parameter-property-assignment", - }, - "messages": { - "unnecessaryAssign": "This assignment is unnecessary since it is already assigned by a parameter property.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-unnecessary-qualifier": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow unnecessary namespace qualifiers", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-qualifier", - }, - "fixable": "code", - "messages": { - "unnecessaryQualifier": "Qualifier is unnecessary since '{{ name }}' is in scope.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-unnecessary-template-expression": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow unnecessary template expressions", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-template-expression", - }, - "fixable": "code", - "messages": { - "noUnnecessaryTemplateExpression": "Template literal expression is unnecessary and can be simplified.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-unnecessary-type-arguments": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow type arguments that are equal to the default", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-type-arguments", - }, - "fixable": "code", - "messages": { - "unnecessaryTypeParameter": "This is the default value for this type parameter, so it can be omitted.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-unnecessary-type-assertion": { - "create": [Function], - "defaultOptions": [ - {}, - ], - "meta": { - "docs": { - "description": "Disallow type assertions that do not change the type of an expression", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-type-assertion", - }, - "fixable": "code", - "messages": { - "contextuallyUnnecessary": "This assertion is unnecessary since the receiver accepts the original type of the expression.", - "unnecessaryAssertion": "This assertion is unnecessary since it does not change the type of the expression.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "typesToIgnore": { - "description": "A list of type names to ignore.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-unnecessary-type-constraint": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow unnecessary constraints on generic types", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-unnecessary-type-constraint", - }, - "hasSuggestions": true, - "messages": { - "removeUnnecessaryConstraint": "Remove the unnecessary \`{{constraint}}\` constraint.", - "unnecessaryConstraint": "Constraining the generic type \`{{name}}\` to \`{{constraint}}\` does nothing and is unnecessary.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-unnecessary-type-parameters": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow type parameters that aren't used multiple times", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unnecessary-type-parameters", - }, - "hasSuggestions": true, - "messages": { - "replaceUsagesWithConstraint": "Replace all usages of type parameter with its constraint.", - "sole": "Type parameter {{name}} is {{uses}} in the {{descriptor}} signature.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-argument": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow calling a function with a value with type \`any\`", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-argument", - }, - "messages": { - "unsafeArgument": "Unsafe argument of type {{sender}} assigned to a parameter of type {{receiver}}.", - "unsafeArraySpread": "Unsafe spread of an {{sender}} array type.", - "unsafeSpread": "Unsafe spread of an {{sender}} type.", - "unsafeTupleSpread": "Unsafe spread of a tuple type. The argument is {{sender}} and is assigned to a parameter of type {{receiver}}.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-assignment": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow assigning a value with type \`any\` to variables and properties", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-assignment", - }, - "messages": { - "anyAssignment": "Unsafe assignment of an {{sender}} value.", - "anyAssignmentThis": "Unsafe assignment of an {{sender}} value. \`this\` is typed as \`any\`. -You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", - "unsafeArrayPattern": "Unsafe array destructuring of an {{sender}} array value.", - "unsafeArrayPatternFromTuple": "Unsafe array destructuring of a tuple element with an {{sender}} value.", - "unsafeArraySpread": "Unsafe spread of an {{sender}} value in an array.", - "unsafeAssignment": "Unsafe assignment of type {{sender}} to a variable of type {{receiver}}.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-call": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow calling a value with type \`any\`", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-call", - }, - "messages": { - "unsafeCall": "Unsafe call of a(n) {{type}} typed value.", - "unsafeCallThis": "Unsafe call of a(n) {{type}} typed value. \`this\` is typed as {{type}}. -You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", - "unsafeNew": "Unsafe construction of a(n) {{type}} typed value.", - "unsafeTemplateTag": "Unsafe use of a(n) {{type}} typed template tag.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-declaration-merging": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow unsafe declaration merging", - "recommended": "recommended", - "requiresTypeChecking": false, - "url": "https://typescript-eslint.io/rules/no-unsafe-declaration-merging", - }, - "messages": { - "unsafeMerging": "Unsafe declaration merging between classes and interfaces.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-enum-comparison": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow comparing an enum value with a non-enum value", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-enum-comparison", - }, - "hasSuggestions": true, - "messages": { - "mismatchedCase": "The case statement does not have a shared enum type with the switch predicate.", - "mismatchedCondition": "The two values in this comparison do not have a shared enum type.", - "replaceValueWithEnum": "Replace with an enum value comparison.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-unsafe-function-type": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow using the unsafe built-in Function type", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-unsafe-function-type", - }, - "fixable": "code", - "messages": { - "bannedFunctionType": "The \`Function\` type accepts any function-like value. -Prefer explicitly defining any function parameters and return type.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-member-access": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow member access on a value with type \`any\`", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-member-access", - }, - "messages": { - "unsafeComputedMemberAccess": "Computed name {{property}} resolves to an {{type}} value.", - "unsafeMemberExpression": "Unsafe member access {{property}} on an {{type}} value.", - "unsafeThisMemberExpression": "Unsafe member access {{property}} on an \`any\` value. \`this\` is typed as \`any\`. -You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-return": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow returning a value with type \`any\` from a function", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-return", - }, - "messages": { - "unsafeReturn": "Unsafe return of a value of type {{type}}.", - "unsafeReturnAssignment": "Unsafe return of type \`{{sender}}\` from function with return type \`{{receiver}}\`.", - "unsafeReturnThis": "Unsafe return of a value of type \`{{type}}\`. \`this\` is typed as \`any\`. -You can try to fix this by turning on the \`noImplicitThis\` compiler option, or adding a \`this\` parameter to the function.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-type-assertion": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow type assertions that narrow a type", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-type-assertion", - }, - "messages": { - "unsafeOfAnyTypeAssertion": "Unsafe assertion from {{type}} detected: consider using type guards or a safer assertion.", - "unsafeToAnyTypeAssertion": "Unsafe assertion to {{type}} detected: consider using a more specific type to ensure safety.", - "unsafeToUnconstrainedTypeAssertion": "Unsafe type assertion: '{{type}}' could be instantiated with an arbitrary type which could be unrelated to the original type.", - "unsafeTypeAssertion": "Unsafe type assertion: type '{{type}}' is more narrow than the original type.", - "unsafeTypeAssertionAssignableToConstraint": "Unsafe type assertion: the original type is assignable to the constraint of type '{{type}}', but '{{type}}' could be instantiated with a different subtype of its constraint.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unsafe-unary-minus": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Require unary negation to take a number", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/no-unsafe-unary-minus", - }, - "messages": { - "unaryMinus": "Argument of unary negation should be assignable to number | bigint but is {{type}} instead.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unused-expressions": { - "create": [Function], - "defaultOptions": [ - { - "allowShortCircuit": false, - "allowTaggedTemplates": false, - "allowTernary": false, - }, - ], - "meta": { - "defaultOptions": [ - { - "allowShortCircuit": false, - "allowTaggedTemplates": false, - "allowTernary": false, - }, - ], - "docs": { - "description": "Disallow unused expressions", - "extendsBaseRule": true, - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-unused-expressions", - }, - "hasSuggestions": undefined, - "messages": { - "unusedExpression": "Expected an assignment or function call and instead saw an expression.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowShortCircuit": { - "type": "boolean", - }, - "allowTaggedTemplates": { - "type": "boolean", - }, - "allowTernary": { - "type": "boolean", - }, - "enforceForJSX": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "no-unused-vars": { - "create": [Function], - "defaultOptions": [ - {}, - ], - "meta": { - "docs": { - "description": "Disallow unused variables", - "extendsBaseRule": true, - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-unused-vars", - }, - "messages": { - "unusedVar": "'{{varName}}' is {{action}} but never used{{additional}}.", - "usedIgnoredVar": "'{{varName}}' is marked as ignored but is used{{additional}}.", - "usedOnlyAsType": "'{{varName}}' is {{action}} but only used as a type{{additional}}.", - }, - "schema": [ - { - "oneOf": [ - { - "enum": [ - "all", - "local", - ], - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "args": { - "description": "Whether to check all, some, or no arguments.", - "enum": [ - "all", - "after-used", - "none", - ], - "type": "string", - }, - "argsIgnorePattern": { - "description": "Regular expressions of argument names to not check for usage.", - "type": "string", - }, - "caughtErrors": { - "description": "Whether to check catch block arguments.", - "enum": [ - "all", - "none", - ], - "type": "string", - }, - "caughtErrorsIgnorePattern": { - "description": "Regular expressions of catch block argument names to not check for usage.", - "type": "string", - }, - "destructuredArrayIgnorePattern": { - "description": "Regular expressions of destructured array variable names to not check for usage.", - "type": "string", - }, - "ignoreClassWithStaticInitBlock": { - "description": "Whether to ignore classes with at least one static initialization block.", - "type": "boolean", - }, - "ignoreRestSiblings": { - "description": "Whether to ignore sibling properties in \`...\` destructurings.", - "type": "boolean", - }, - "reportUsedIgnorePattern": { - "description": "Whether to report variables that match any of the valid ignore pattern options if they have been used.", - "type": "boolean", - }, - "vars": { - "description": "Whether to check all variables or only locally-declared variables.", - "enum": [ - "all", - "local", - ], - "type": "string", - }, - "varsIgnorePattern": { - "description": "Regular expressions of variable names to not check for usage.", - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - ], - "type": "problem", - }, - }, - "no-use-before-define": { - "create": [Function], - "defaultOptions": [ - { - "allowNamedExports": false, - "classes": true, - "enums": true, - "functions": true, - "ignoreTypeReferences": true, - "typedefs": true, - "variables": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow the use of variables before they are defined", - "extendsBaseRule": true, - "url": "https://typescript-eslint.io/rules/no-use-before-define", - }, - "messages": { - "noUseBeforeDefine": "'{{name}}' was used before it was defined.", - }, - "schema": [ - { - "oneOf": [ - { - "enum": [ - "nofunc", - ], - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "allowNamedExports": { - "description": "Whether to ignore named exports.", - "type": "boolean", - }, - "classes": { - "description": "Whether to ignore references to class declarations.", - "type": "boolean", - }, - "enums": { - "description": "Whether to check references to enums.", - "type": "boolean", - }, - "functions": { - "description": "Whether to ignore references to function declarations.", - "type": "boolean", - }, - "ignoreTypeReferences": { - "description": "Whether to ignore type references, such as in type annotations and assertions.", - "type": "boolean", - }, - "typedefs": { - "description": "Whether to check references to types.", - "type": "boolean", - }, - "variables": { - "description": "Whether to ignore references to variables.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - ], - "type": "problem", - }, - }, - "no-useless-constructor": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow unnecessary constructors", - "extendsBaseRule": true, - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/no-useless-constructor", - }, - "hasSuggestions": true, - "messages": { - "noUselessConstructor": "Useless constructor.", - "removeConstructor": "Remove the constructor.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-useless-empty-export": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow empty exports that don't change anything in a module file", - "url": "https://typescript-eslint.io/rules/no-useless-empty-export", - }, - "fixable": "code", - "hasSuggestions": false, - "messages": { - "uselessExport": "Empty export does nothing and can be removed.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "no-var-requires": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - }, - ], - "meta": { - "deprecated": { - "deprecatedSince": "8.0.0", - "replacedBy": [ - { - "rule": { - "name": "@typescript-eslint/no-require-imports", - "url": "https://typescript-eslint.io/rules/no-require-imports", - }, - }, - ], - "url": "https://github.com/typescript-eslint/typescript-eslint/pull/8334", - }, - "docs": { - "description": "Disallow \`require\` statements except in import statements", - "url": "https://typescript-eslint.io/rules/no-var-requires", - }, - "messages": { - "noVarReqs": "Require statement not part of import statement.", - }, - "replacedBy": [ - "@typescript-eslint/no-require-imports", - ], - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Patterns of import paths to allow requiring from.", - "items": { - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "no-wrapper-object-types": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow using confusing built-in primitive class wrappers", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/no-wrapper-object-types", - }, - "fixable": "code", - "messages": { - "bannedClassType": "Prefer using the primitive \`{{preferred}}\` as a type name, rather than the upper-cased \`{{typeName}}\`.", - }, - "schema": [], - "type": "problem", - }, - }, - "non-nullable-type-assertion-style": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce non-null assertions over explicit type assertions", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/non-nullable-type-assertion-style", - }, - "fixable": "code", - "messages": { - "preferNonNullAssertion": "Use a ! assertion to more succinctly remove null and undefined from the type.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "only-throw-error": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - "allowThrowingAny": true, - "allowThrowingUnknown": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow throwing non-\`Error\` values as exceptions", - "extendsBaseRule": "no-throw-literal", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/only-throw-error", - }, - "messages": { - "object": "Expected an error object to be thrown.", - "undef": "Do not throw undefined.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Type specifiers that can be thrown.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - "allowThrowingAny": { - "description": "Whether to always allow throwing values typed as \`any\`.", - "type": "boolean", - }, - "allowThrowingUnknown": { - "description": "Whether to always allow throwing values typed as \`unknown\`.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "parameter-properties": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - "prefer": "class-property", - }, - ], - "meta": { - "docs": { - "description": "Require or disallow parameter properties in class constructors", - "url": "https://typescript-eslint.io/rules/parameter-properties", - }, - "messages": { - "preferClassProperty": "Property {{parameter}} should be declared as a class property.", - "preferParameterProperty": "Property {{parameter}} should be declared as a parameter property.", - }, - "schema": [ - { - "$defs": { - "modifier": { - "enum": [ - "readonly", - "private", - "protected", - "public", - "private readonly", - "protected readonly", - "public readonly", - ], - "type": "string", - }, - }, - "additionalProperties": false, - "properties": { - "allow": { - "description": "Whether to allow certain kinds of properties to be ignored.", - "items": { - "$ref": "#/items/0/$defs/modifier", - }, - "type": "array", - }, - "prefer": { - "description": "Whether to prefer class properties or parameter properties.", - "enum": [ - "class-property", - "parameter-property", - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "prefer-as-const": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce the use of \`as const\` over literal type", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/prefer-as-const", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "preferConstAssertion": "Expected a \`const\` instead of a literal type assertion.", - "variableConstAssertion": "Expected a \`const\` assertion instead of a literal type annotation.", - "variableSuggest": "You should use \`as const\` instead of type annotation.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-destructuring": { - "create": [Function], - "defaultOptions": [ - { - "AssignmentExpression": { - "array": true, - "object": true, - }, - "VariableDeclarator": { - "array": true, - "object": true, - }, - }, - {}, - ], - "meta": { - "docs": { - "description": "Require destructuring from arrays and/or objects", - "extendsBaseRule": true, - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-destructuring", - }, - "fixable": "code", - "hasSuggestions": undefined, - "messages": { - "preferDestructuring": "Use {{type}} destructuring.", - }, - "schema": [ - { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "AssignmentExpression": { - "additionalProperties": false, - "properties": { - "array": { - "type": "boolean", - }, - "object": { - "type": "boolean", - }, - }, - "type": "object", - }, - "VariableDeclarator": { - "additionalProperties": false, - "properties": { - "array": { - "type": "boolean", - }, - "object": { - "type": "boolean", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "array": { - "type": "boolean", - }, - "object": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - }, - { - "properties": { - "enforceForDeclarationWithTypeAnnotation": { - "description": "Whether to enforce destructuring on variable declarations with type annotations.", - "type": "boolean", - }, - "enforceForRenamedProperties": { - "description": "Whether to enforce destructuring that use a different variable name than the property name.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-enum-initializers": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Require each enum member value to be explicitly initialized", - "url": "https://typescript-eslint.io/rules/prefer-enum-initializers", - }, - "hasSuggestions": true, - "messages": { - "defineInitializer": "The value of the member '{{ name }}' should be explicitly defined.", - "defineInitializerSuggestion": "Can be fixed to {{ name }} = {{ suggested }}", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-find": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce the use of Array.prototype.find() over Array.prototype.filter() followed by [0] when looking for a single result", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-find", - }, - "hasSuggestions": true, - "messages": { - "preferFind": "Prefer .find(...) instead of .filter(...)[0].", - "preferFindSuggestion": "Use .find(...) instead of .filter(...)[0].", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-for-of": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce the use of \`for-of\` loop over the standard \`for\` loop where possible", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/prefer-for-of", - }, - "messages": { - "preferForOf": "Expected a \`for-of\` loop instead of a \`for\` loop with this simple iteration.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-function-type": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce using function types instead of interfaces with call signatures", - "recommended": "stylistic", - "url": "https://typescript-eslint.io/rules/prefer-function-type", - }, - "fixable": "code", - "messages": { - "functionTypeOverCallableType": "{{ literalOrInterface }} only has a call signature, you should use a function type instead.", - "unexpectedThisOnFunctionOnlyInterface": "\`this\` refers to the function type '{{ interfaceName }}', did you intend to use a generic \`this\` parameter like \`(this: Self, ...) => Self\` instead?", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-includes": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce \`includes\` method over \`indexOf\` method", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-includes", - }, - "fixable": "code", - "messages": { - "preferIncludes": "Use 'includes()' method instead.", - "preferStringIncludes": "Use \`String#includes()\` method with a string instead.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-literal-enum-member": { - "create": [Function], - "defaultOptions": [ - { - "allowBitwiseExpressions": false, - }, - ], - "meta": { - "docs": { - "description": "Require all enum members to be literal values", - "recommended": "strict", - "requiresTypeChecking": false, - "url": "https://typescript-eslint.io/rules/prefer-literal-enum-member", - }, - "messages": { - "notLiteral": "Explicit enum value must only be a literal value (string or number).", - "notLiteralOrBitwiseExpression": "Explicit enum value must only be a literal value (string or number) or a bitwise expression.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowBitwiseExpressions": { - "description": "Whether to allow using bitwise expressions in enum initializers.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-namespace-keyword": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Require using \`namespace\` keyword over \`module\` keyword to declare custom TypeScript modules", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/prefer-namespace-keyword", - }, - "fixable": "code", - "messages": { - "useNamespace": "Use 'namespace' instead of 'module' to declare custom TypeScript modules.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-nullish-coalescing": { - "create": [Function], - "defaultOptions": [ - { - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, - "ignoreBooleanCoercion": false, - "ignoreConditionalTests": true, - "ignoreMixedLogicalExpressions": false, - "ignorePrimitives": { - "bigint": false, - "boolean": false, - "number": false, - "string": false, - }, - "ignoreTernaryTests": false, - }, - ], - "meta": { - "docs": { - "description": "Enforce using the nullish coalescing operator instead of logical assignments or chaining", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-nullish-coalescing", - }, - "hasSuggestions": true, - "messages": { - "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", - "preferNullishOverOr": "Prefer using nullish coalescing operator (\`??{{ equals }}\`) instead of a logical {{ description }} (\`||{{ equals }}\`), as it is a safer operator.", - "preferNullishOverTernary": "Prefer using nullish coalescing operator (\`??{{ equals }}\`) instead of a ternary expression, as it is simpler to read.", - "suggestNullish": "Fix to nullish coalescing operator (\`??{{ equals }}\`).", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { - "description": "Unless this is set to \`true\`, the rule will error on every file whose \`tsconfig.json\` does _not_ have the \`strictNullChecks\` compiler option (or \`strict\`) set to \`true\`.", - "type": "boolean", - }, - "ignoreBooleanCoercion": { - "description": "Whether to ignore arguments to the \`Boolean\` constructor", - "type": "boolean", - }, - "ignoreConditionalTests": { - "description": "Whether to ignore cases that are located within a conditional test.", - "type": "boolean", - }, - "ignoreMixedLogicalExpressions": { - "description": "Whether to ignore any logical or expressions that are part of a mixed logical expression (with \`&&\`).", - "type": "boolean", - }, - "ignorePrimitives": { - "description": "Whether to ignore all (\`true\`) or some (an object with properties) primitive types.", - "oneOf": [ - { - "description": "Which primitives types may be ignored.", - "properties": { - "bigint": { - "description": "Ignore bigint primitive types.", - "type": "boolean", - }, - "boolean": { - "description": "Ignore boolean primitive types.", - "type": "boolean", - }, - "number": { - "description": "Ignore number primitive types.", - "type": "boolean", - }, - "string": { - "description": "Ignore string primitive types.", - "type": "boolean", - }, - }, - "type": "object", - }, - { - "description": "Ignore all primitive types.", - "enum": [ - true, - ], - "type": "boolean", - }, - ], - }, - "ignoreTernaryTests": { - "description": "Whether to ignore any ternary expressions that could be simplified by using the nullish coalescing operator.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-optional-chain": { - "create": [Function], - "defaultOptions": [ - { - "allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing": false, - "checkAny": true, - "checkBigInt": true, - "checkBoolean": true, - "checkNumber": true, - "checkString": true, - "checkUnknown": true, - "requireNullish": false, - }, - ], - "meta": { - "docs": { - "description": "Enforce using concise optional chain expressions instead of chained logical ands, negated logical ors, or empty objects", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-optional-chain", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "optionalChainSuggest": "Change to an optional chain.", - "preferOptionalChain": "Prefer using an optional chain expression instead, as it's more concise and easier to read.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing": { - "description": "Allow autofixers that will change the return type of the expression. This option is considered unsafe as it may break the build.", - "type": "boolean", - }, - "checkAny": { - "description": "Check operands that are typed as \`any\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - "checkBigInt": { - "description": "Check operands that are typed as \`bigint\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - "checkBoolean": { - "description": "Check operands that are typed as \`boolean\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - "checkNumber": { - "description": "Check operands that are typed as \`number\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - "checkString": { - "description": "Check operands that are typed as \`string\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - "checkUnknown": { - "description": "Check operands that are typed as \`unknown\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - "requireNullish": { - "description": "Skip operands that are not typed with \`null\` and/or \`undefined\` when inspecting "loose boolean" operands.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-promise-reject-errors": { - "create": [Function], - "defaultOptions": [ - { - "allowEmptyReject": false, - "allowThrowingAny": false, - "allowThrowingUnknown": false, - }, - ], - "meta": { - "docs": { - "description": "Require using Error objects as Promise rejection reasons", - "extendsBaseRule": true, - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-promise-reject-errors", - }, - "messages": { - "rejectAnError": "Expected the Promise rejection reason to be an Error.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowEmptyReject": { - "description": "Whether to allow calls to \`Promise.reject()\` with no arguments.", - "type": "boolean", - }, - "allowThrowingAny": { - "description": "Whether to always allow throwing values typed as \`any\`.", - "type": "boolean", - }, - "allowThrowingUnknown": { - "description": "Whether to always allow throwing values typed as \`unknown\`.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-readonly": { - "create": [Function], - "defaultOptions": [ - { - "onlyInlineLambdas": false, - }, - ], - "meta": { - "docs": { - "description": "Require private members to be marked as \`readonly\` if they're never modified outside of the constructor", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-readonly", - }, - "fixable": "code", - "messages": { - "preferReadonly": "Member '{{name}}' is never reassigned; mark it as \`readonly\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "onlyInlineLambdas": { - "description": "Whether to restrict checking only to members immediately assigned a lambda value.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-readonly-parameter-types": { - "create": [Function], - "defaultOptions": [ - { - "allow": [], - "checkParameterProperties": true, - "ignoreInferredTypes": false, - "treatMethodsAsReadonly": false, - }, - ], - "meta": { - "docs": { - "description": "Require function parameters to be typed as \`readonly\` to prevent accidental mutation of inputs", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-readonly-parameter-types", - }, - "messages": { - "shouldBeReadonly": "Parameter should be a read only type.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "An array of type specifiers to ignore.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - "checkParameterProperties": { - "description": "Whether to check class parameter properties.", - "type": "boolean", - }, - "ignoreInferredTypes": { - "description": "Whether to ignore parameters which don't explicitly specify a type.", - "type": "boolean", - }, - "treatMethodsAsReadonly": { - "description": "Whether to treat all mutable methods as though they are readonly.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-reduce-type-parameter": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce using type parameter when calling \`Array#reduce\` instead of using a type assertion", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-reduce-type-parameter", - }, - "fixable": "code", - "messages": { - "preferTypeParameter": "Unnecessary assertion: Array#reduce accepts a type parameter for the default value.", - }, - "schema": [], - "type": "problem", - }, - }, - "prefer-regexp-exec": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce \`RegExp#exec\` over \`String#match\` if no global flag is provided", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-regexp-exec", - }, - "fixable": "code", - "messages": { - "regExpExecOverStringMatch": "Use the \`RegExp#exec()\` method instead.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-return-this-type": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce that \`this\` is used when only \`this\` type is returned", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-return-this-type", - }, - "fixable": "code", - "messages": { - "useThisType": "Use \`this\` type instead.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "prefer-string-starts-ends-with": { - "create": [Function], - "defaultOptions": [ - { - "allowSingleElementEquality": "never", - }, - ], - "meta": { - "docs": { - "description": "Enforce using \`String#startsWith\` and \`String#endsWith\` over other equivalent methods of checking substrings", - "recommended": "stylistic", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/prefer-string-starts-ends-with", - }, - "fixable": "code", - "messages": { - "preferEndsWith": "Use the 'String#endsWith' method instead.", - "preferStartsWith": "Use 'String#startsWith' method instead.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowSingleElementEquality": { - "description": "Whether to allow equality checks against the first or last element of a string.", - "enum": [ - "always", - "never", - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "prefer-ts-expect-error": { - "create": [Function], - "defaultOptions": [], - "meta": { - "deprecated": { - "deprecatedSince": "7.11.0", - "replacedBy": [ - { - "rule": { - "name": "@typescript-eslint/ban-ts-comment", - "url": "https://typescript-eslint.io/rules/ban-ts-comment", - }, - }, - ], - "url": "https://github.com/typescript-eslint/typescript-eslint/pull/9081", - }, - "docs": { - "description": "Enforce using \`@ts-expect-error\` over \`@ts-ignore\`", - "url": "https://typescript-eslint.io/rules/prefer-ts-expect-error", - }, - "fixable": "code", - "messages": { - "preferExpectErrorComment": "Use "@ts-expect-error" to ensure an error is actually being suppressed.", - }, - "replacedBy": [ - "@typescript-eslint/ban-ts-comment", - ], - "schema": [], - "type": "problem", - }, - }, - "promise-function-async": { - "create": [Function], - "defaultOptions": [ - { - "allowAny": true, - "allowedPromiseNames": [], - "checkArrowFunctions": true, - "checkFunctionDeclarations": true, - "checkFunctionExpressions": true, - "checkMethodDeclarations": true, - }, - ], - "meta": { - "docs": { - "description": "Require any function or method that returns a Promise to be marked async", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/promise-function-async", - }, - "fixable": "code", - "messages": { - "missingAsync": "Functions that return promises must be async.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowAny": { - "description": "Whether to consider \`any\` and \`unknown\` to be Promises.", - "type": "boolean", - }, - "allowedPromiseNames": { - "description": "Any extra names of classes or interfaces to be considered Promises.", - "items": { - "type": "string", - }, - "type": "array", - }, - "checkArrowFunctions": { - "description": "Whether to check arrow functions.", - "type": "boolean", - }, - "checkFunctionDeclarations": { - "description": "Whether to check standalone function declarations.", - "type": "boolean", - }, - "checkFunctionExpressions": { - "description": "Whether to check inline function expressions", - "type": "boolean", - }, - "checkMethodDeclarations": { - "description": "Whether to check methods on classes and object literals.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "related-getter-setter-pairs": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce that \`get()\` types should be assignable to their equivalent \`set()\` type", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/related-getter-setter-pairs", - }, - "messages": { - "mismatch": "\`get()\` type should be assignable to its equivalent \`set()\` type.", - }, - "schema": [], - "type": "problem", - }, - }, - "require-array-sort-compare": { - "create": [Function], - "defaultOptions": [ - { - "ignoreStringArrays": true, - }, - ], - "meta": { - "docs": { - "description": "Require \`Array#sort\` and \`Array#toSorted\` calls to always provide a \`compareFunction\`", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/require-array-sort-compare", - }, - "messages": { - "requireCompare": "Require 'compare' argument.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreStringArrays": { - "description": "Whether to ignore arrays in which all elements are strings.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "require-await": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow async functions which do not return promises and have no \`await\` expression", - "extendsBaseRule": true, - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/require-await", - }, - "hasSuggestions": true, - "messages": { - "missingAwait": "{{name}} has no 'await' expression.", - "removeAsync": "Remove 'async'.", - }, - "schema": [], - "type": "suggestion", - }, - }, - "restrict-plus-operands": { - "create": [Function], - "defaultOptions": [ - { - "allowAny": true, - "allowBoolean": true, - "allowNullish": true, - "allowNumberAndString": true, - "allowRegExp": true, - "skipCompoundAssignments": false, - }, - ], - "meta": { - "docs": { - "description": "Require both operands of addition to be the same type and be \`bigint\`, \`number\`, or \`string\`", - "recommended": { - "recommended": true, - "strict": [ - { - "allowAny": false, - "allowBoolean": false, - "allowNullish": false, - "allowNumberAndString": false, - "allowRegExp": false, - }, - ], - }, - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/restrict-plus-operands", - }, - "messages": { - "bigintAndNumber": "Numeric '+' operations must either be both bigints or both numbers. Got \`{{left}}\` + \`{{right}}\`.", - "invalid": "Invalid operand for a '+' operation. Operands must each be a number or {{stringLike}}. Got \`{{type}}\`.", - "mismatched": "Operands of '+' operations must be a number or {{stringLike}}. Got \`{{left}}\` + \`{{right}}\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowAny": { - "description": "Whether to allow \`any\` typed values.", - "type": "boolean", - }, - "allowBoolean": { - "description": "Whether to allow \`boolean\` typed values.", - "type": "boolean", - }, - "allowNullish": { - "description": "Whether to allow potentially \`null\` or \`undefined\` typed values.", - "type": "boolean", - }, - "allowNumberAndString": { - "description": "Whether to allow \`bigint\`/\`number\` typed values and \`string\` typed values to be added together.", - "type": "boolean", - }, - "allowRegExp": { - "description": "Whether to allow \`regexp\` typed values.", - "type": "boolean", - }, - "skipCompoundAssignments": { - "description": "Whether to skip compound assignments such as \`+=\`.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "restrict-template-expressions": { - "create": [Function], - "defaultOptions": [ - { - "allow": [ - { - "from": "lib", - "name": [ - "Error", - "URL", - "URLSearchParams", - ], - }, - ], - "allowAny": true, - "allowBoolean": true, - "allowNullish": true, - "allowNumber": true, - "allowRegExp": true, - }, - ], - "meta": { - "docs": { - "description": "Enforce template literal expressions to be of \`string\` type", - "recommended": { - "recommended": true, - "strict": [ - { - "allowAny": false, - "allowBoolean": false, - "allowNever": false, - "allowNullish": false, - "allowNumber": false, - "allowRegExp": false, - }, - ], - }, - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/restrict-template-expressions", - }, - "messages": { - "invalidType": "Invalid type "{{type}}" of template literal expression.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allow": { - "description": "Types to allow in template expressions.", - "items": { - "oneOf": [ - { - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "file", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "path": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "lib", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - }, - "required": [ - "from", - "name", - ], - "type": "object", - }, - { - "additionalProperties": false, - "properties": { - "from": { - "enum": [ - "package", - ], - "type": "string", - }, - "name": { - "oneOf": [ - { - "type": "string", - }, - { - "items": { - "type": "string", - }, - "minItems": 1, - "type": "array", - "uniqueItems": true, - }, - ], - }, - "package": { - "type": "string", - }, - }, - "required": [ - "from", - "name", - "package", - ], - "type": "object", - }, - ], - }, - "type": "array", - }, - "allowAny": { - "description": "Whether to allow \`any\` typed values in template expressions.", - "type": "boolean", - }, - "allowArray": { - "description": "Whether to allow \`array\` typed values in template expressions.", - "type": "boolean", - }, - "allowBoolean": { - "description": "Whether to allow \`boolean\` typed values in template expressions.", - "type": "boolean", - }, - "allowNever": { - "description": "Whether to allow \`never\` typed values in template expressions.", - "type": "boolean", - }, - "allowNullish": { - "description": "Whether to allow \`nullish\` typed values in template expressions.", - "type": "boolean", - }, - "allowNumber": { - "description": "Whether to allow \`number\` typed values in template expressions.", - "type": "boolean", - }, - "allowRegExp": { - "description": "Whether to allow \`regexp\` typed values in template expressions.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "return-await": { - "create": [Function], - "defaultOptions": [ - "in-try-catch", - ], - "meta": { - "docs": { - "description": "Enforce consistent awaiting of returned promises", - "recommended": { - "strict": [ - "error-handling-correctness-only", - ], - }, - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/return-await", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "disallowedPromiseAwait": "Returning an awaited promise is not allowed in this context.", - "disallowedPromiseAwaitSuggestion": "Remove \`await\` before the expression. Use caution as this may impact control flow.", - "nonPromiseAwait": "Returning an awaited value that is not a promise is not allowed.", - "requiredPromiseAwait": "Returning an awaited promise is required in this context.", - "requiredPromiseAwaitSuggestion": "Add \`await\` before the expression. Use caution as this may impact control flow.", - }, - "schema": [ - { - "oneOf": [ - { - "description": "Requires that all returned promises be awaited.", - "enum": [ - "always", - ], - "type": "string", - }, - { - "description": "In error-handling contexts, the rule enforces that returned promises must be awaited. In ordinary contexts, the rule does not enforce any particular behavior around whether returned promises are awaited.", - "enum": [ - "error-handling-correctness-only", - ], - "type": "string", - }, - { - "description": "In error-handling contexts, the rule enforces that returned promises must be awaited. In ordinary contexts, the rule enforces that returned promises _must not_ be awaited.", - "enum": [ - "in-try-catch", - ], - "type": "string", - }, - { - "description": "Disallows awaiting any returned promises.", - "enum": [ - "never", - ], - "type": "string", - }, - ], - "type": "string", - }, - ], - "type": "problem", - }, - }, - "sort-type-constituents": { - "create": [Function], - "defaultOptions": [ - { - "caseSensitive": false, - "checkIntersections": true, - "checkUnions": true, - "groupOrder": [ - "named", - "keyword", - "operator", - "literal", - "function", - "import", - "conditional", - "object", - "tuple", - "intersection", - "union", - "nullish", - ], - }, - ], - "meta": { - "deprecated": { - "deprecatedSince": "7.13.0", - "replacedBy": [ - { - "plugin": { - "name": "eslint-plugin-perfectionist", - "url": "https://perfectionist.dev", - }, - "rule": { - "name": "perfectionist/sort-intersection-types", - "url": "https://perfectionist.dev/rules/sort-intersection-types", - }, - }, - { - "plugin": { - "name": "eslint-plugin-perfectionist", - "url": "https://perfectionist.dev", - }, - "rule": { - "name": "perfectionist/sort-union-types", - "url": "https://perfectionist.dev/rules/sort-union-types", - }, - }, - ], - "url": "https://github.com/typescript-eslint/typescript-eslint/pull/9253", - }, - "docs": { - "description": "Enforce constituents of a type union/intersection to be sorted alphabetically", - "url": "https://typescript-eslint.io/rules/sort-type-constituents", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "notSorted": "{{type}} type constituents must be sorted.", - "notSortedNamed": "{{type}} type {{name}} constituents must be sorted.", - "suggestFix": "Sort constituents of type (removes all comments).", - }, - "replacedBy": [ - "perfectionist/sort-intersection-types", - "perfectionist/sort-union-types", - ], - "schema": [ - { - "additionalProperties": false, - "properties": { - "caseSensitive": { - "description": "Whether to sort using case sensitive string comparisons.", - "type": "boolean", - }, - "checkIntersections": { - "description": "Whether to check intersection types (\`&\`).", - "type": "boolean", - }, - "checkUnions": { - "description": "Whether to check union types (\`|\`).", - "type": "boolean", - }, - "groupOrder": { - "description": "Ordering of the groups.", - "items": { - "enum": [ - "conditional", - "function", - "import", - "intersection", - "keyword", - "nullish", - "literal", - "named", - "object", - "operator", - "tuple", - "union", - ], - "type": "string", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "strict-boolean-expressions": { - "create": [Function], - "defaultOptions": [ - { - "allowAny": false, - "allowNullableBoolean": false, - "allowNullableEnum": false, - "allowNullableNumber": false, - "allowNullableObject": true, - "allowNullableString": false, - "allowNumber": true, - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": false, - "allowString": true, - }, - ], - "meta": { - "docs": { - "description": "Disallow certain types in boolean expressions", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/strict-boolean-expressions", - }, - "hasSuggestions": true, - "messages": { - "conditionErrorAny": "Unexpected any value in {{context}}. An explicit comparison or type conversion is required.", - "conditionErrorNullableBoolean": "Unexpected nullable boolean value in {{context}}. Please handle the nullish case explicitly.", - "conditionErrorNullableEnum": "Unexpected nullable enum value in {{context}}. Please handle the nullish/zero/NaN cases explicitly.", - "conditionErrorNullableNumber": "Unexpected nullable number value in {{context}}. Please handle the nullish/zero/NaN cases explicitly.", - "conditionErrorNullableObject": "Unexpected nullable object value in {{context}}. An explicit null check is required.", - "conditionErrorNullableString": "Unexpected nullable string value in {{context}}. Please handle the nullish/empty cases explicitly.", - "conditionErrorNullish": "Unexpected nullish value in conditional. The condition is always false.", - "conditionErrorNumber": "Unexpected number value in {{context}}. An explicit zero/NaN check is required.", - "conditionErrorObject": "Unexpected object value in {{context}}. The condition is always true.", - "conditionErrorOther": "Unexpected value in conditional. A boolean expression is required.", - "conditionErrorString": "Unexpected string value in {{context}}. An explicit empty string check is required.", - "conditionFixCastBoolean": "Explicitly convert value to a boolean (\`Boolean(value)\`)", - "conditionFixCompareArrayLengthNonzero": "Change condition to check array's length (\`value.length > 0\`)", - "conditionFixCompareArrayLengthZero": "Change condition to check array's length (\`value.length === 0\`)", - "conditionFixCompareEmptyString": "Change condition to check for empty string (\`value !== ""\`)", - "conditionFixCompareFalse": "Change condition to check if false (\`value === false\`)", - "conditionFixCompareNaN": "Change condition to check for NaN (\`!Number.isNaN(value)\`)", - "conditionFixCompareNullish": "Change condition to check for null/undefined (\`value != null\`)", - "conditionFixCompareStringLength": "Change condition to check string's length (\`value.length !== 0\`)", - "conditionFixCompareTrue": "Change condition to check if true (\`value === true\`)", - "conditionFixCompareZero": "Change condition to check for 0 (\`value !== 0\`)", - "conditionFixDefaultEmptyString": "Explicitly treat nullish value the same as an empty string (\`value ?? ""\`)", - "conditionFixDefaultFalse": "Explicitly treat nullish value the same as false (\`value ?? false\`)", - "conditionFixDefaultZero": "Explicitly treat nullish value the same as 0 (\`value ?? 0\`)", - "explicitBooleanReturnType": "Add an explicit \`boolean\` return type annotation.", - "noStrictNullCheck": "This rule requires the \`strictNullChecks\` compiler option to be turned on to function correctly.", - "predicateCannotBeAsync": "Predicate function should not be 'async'; expected a boolean return type.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowAny": { - "description": "Whether to allow \`any\`s in a boolean context.", - "type": "boolean", - }, - "allowNullableBoolean": { - "description": "Whether to allow nullable \`boolean\`s in a boolean context.", - "type": "boolean", - }, - "allowNullableEnum": { - "description": "Whether to allow nullable \`enum\`s in a boolean context.", - "type": "boolean", - }, - "allowNullableNumber": { - "description": "Whether to allow nullable \`number\`s in a boolean context.", - "type": "boolean", - }, - "allowNullableObject": { - "description": "Whether to allow nullable \`object\`s, \`symbol\`s, and functions in a boolean context.", - "type": "boolean", - }, - "allowNullableString": { - "description": "Whether to allow nullable \`string\`s in a boolean context.", - "type": "boolean", - }, - "allowNumber": { - "description": "Whether to allow \`number\`s in a boolean context.", - "type": "boolean", - }, - "allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing": { - "description": "Unless this is set to \`true\`, the rule will error on every file whose \`tsconfig.json\` does _not_ have the \`strictNullChecks\` compiler option (or \`strict\`) set to \`true\`.", - "type": "boolean", - }, - "allowString": { - "description": "Whether to allow \`string\`s in a boolean context.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "switch-exhaustiveness-check": { - "create": [Function], - "defaultOptions": [ - { - "allowDefaultCaseForExhaustiveSwitch": true, - "considerDefaultExhaustiveForUnions": false, - "requireDefaultForNonUnion": false, - }, - ], - "meta": { - "docs": { - "description": "Require switch-case statements to be exhaustive", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/switch-exhaustiveness-check", - }, - "hasSuggestions": true, - "messages": { - "addMissingCases": "Add branches for missing cases.", - "dangerousDefaultCase": "The switch statement is exhaustive, so the default case is unnecessary.", - "switchIsNotExhaustive": "Switch is not exhaustive. Cases not matched: {{missingBranches}}", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "allowDefaultCaseForExhaustiveSwitch": { - "description": "If 'true', allow 'default' cases on switch statements with exhaustive cases.", - "type": "boolean", - }, - "considerDefaultExhaustiveForUnions": { - "description": "If 'true', the 'default' clause is used to determine whether the switch statement is exhaustive for union type", - "type": "boolean", - }, - "defaultCaseCommentPattern": { - "description": "Regular expression for a comment that can indicate an intentionally omitted default case.", - "type": "string", - }, - "requireDefaultForNonUnion": { - "description": "If 'true', require a 'default' clause for switches on non-union types.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "triple-slash-reference": { - "create": [Function], - "defaultOptions": [ - { - "lib": "always", - "path": "never", - "types": "prefer-import", - }, - ], - "meta": { - "docs": { - "description": "Disallow certain triple slash directives in favor of ES6-style import declarations", - "recommended": "recommended", - "url": "https://typescript-eslint.io/rules/triple-slash-reference", - }, - "messages": { - "tripleSlashReference": "Do not use a triple slash reference for {{module}}, use \`import\` style instead.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "lib": { - "description": "What to enforce for \`/// \` references.", - "enum": [ - "always", - "never", - ], - "type": "string", - }, - "path": { - "description": "What to enforce for \`/// \` references.", - "enum": [ - "always", - "never", - ], - "type": "string", - }, - "types": { - "description": "What to enforce for \`/// \` references.", - "enum": [ - "always", - "never", - "prefer-import", - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "typedef": { - "create": [Function], - "defaultOptions": [ - { - "arrayDestructuring": false, - "arrowParameter": false, - "memberVariableDeclaration": false, - "objectDestructuring": false, - "parameter": false, - "propertyDeclaration": false, - "variableDeclaration": false, - "variableDeclarationIgnoreFunction": false, - }, - ], - "meta": { - "docs": { - "description": "Require type annotations in certain places", - "url": "https://typescript-eslint.io/rules/typedef", - }, - "messages": { - "expectedTypedef": "Expected a type annotation.", - "expectedTypedefNamed": "Expected {{name}} to have a type annotation.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "arrayDestructuring": { - "description": "Whether to enforce type annotations on variables declared using array destructuring.", - "type": "boolean", - }, - "arrowParameter": { - "description": "Whether to enforce type annotations for parameters of arrow functions.", - "type": "boolean", - }, - "memberVariableDeclaration": { - "description": "Whether to enforce type annotations on member variables of classes.", - "type": "boolean", - }, - "objectDestructuring": { - "description": "Whether to enforce type annotations on variables declared using object destructuring.", - "type": "boolean", - }, - "parameter": { - "description": "Whether to enforce type annotations for parameters of functions and methods.", - "type": "boolean", - }, - "propertyDeclaration": { - "description": "Whether to enforce type annotations for properties of interfaces and types.", - "type": "boolean", - }, - "variableDeclaration": { - "description": "Whether to enforce type annotations for variable declarations, excluding array and object destructuring.", - "type": "boolean", - }, - "variableDeclarationIgnoreFunction": { - "description": "Whether to ignore variable declarations for non-arrow and arrow functions.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "unbound-method": { - "create": [Function], - "defaultOptions": [ - { - "ignoreStatic": false, - }, - ], - "meta": { - "docs": { - "description": "Enforce unbound methods are called with their expected scope", - "recommended": "recommended", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/unbound-method", - }, - "messages": { - "unbound": "Avoid referencing unbound methods which may cause unintentional scoping of \`this\`.", - "unboundWithoutThisAnnotation": "Avoid referencing unbound methods which may cause unintentional scoping of \`this\`. -If your function does not access \`this\`, you can annotate it with \`this: void\`, or consider using an arrow function instead.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreStatic": { - "description": "Whether to skip checking whether \`static\` methods are correctly bound.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "problem", - }, - }, - "unified-signatures": { - "create": [Function], - "defaultOptions": [ - { - "ignoreDifferentlyNamedParameters": false, - "ignoreOverloadsWithDifferentJSDoc": false, - }, - ], - "meta": { - "docs": { - "description": "Disallow two overloads that could be unified into one with a union or an optional/rest parameter", - "recommended": "strict", - "url": "https://typescript-eslint.io/rules/unified-signatures", - }, - "messages": { - "omittingRestParameter": "{{failureStringStart}} with a rest parameter.", - "omittingSingleParameter": "{{failureStringStart}} with an optional parameter.", - "singleParameterDifference": "{{failureStringStart}} taking \`{{type1}} | {{type2}}\`.", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "ignoreDifferentlyNamedParameters": { - "description": "Whether two parameters with different names at the same index should be considered different even if their types are the same.", - "type": "boolean", - }, - "ignoreOverloadsWithDifferentJSDoc": { - "description": "Whether two overloads with different JSDoc comments should be considered different even if their parameter and return types are the same.", - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "use-unknown-in-catch-callback-variable": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Enforce typing arguments in Promise rejection callbacks as \`unknown\`", - "recommended": "strict", - "requiresTypeChecking": true, - "url": "https://typescript-eslint.io/rules/use-unknown-in-catch-callback-variable", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "addUnknownRestTypeAnnotationSuggestion": "Add an explicit \`: [unknown]\` type annotation to the rejection callback rest variable.", - "addUnknownTypeAnnotationSuggestion": "Add an explicit \`: unknown\` type annotation to the rejection callback variable.", - "useUnknown": "Prefer the safe \`: unknown\` for a \`{{method}}\`{{append}} callback variable.", - "useUnknownArrayDestructuringPattern": "Prefer the safe \`: unknown\` for a \`{{method}}\`{{append}} callback variable. The thrown error may not be iterable.", - "useUnknownObjectDestructuringPattern": "Prefer the safe \`: unknown\` for a \`{{method}}\`{{append}} callback variable. The thrown error may be nullable, or may not have the expected shape.", - "wrongRestTypeAnnotationSuggestion": "Change existing type annotation to \`: [unknown]\`.", - "wrongTypeAnnotationSuggestion": "Change existing type annotation to \`: unknown\`.", - }, - "schema": [], - "type": "suggestion", - }, - }, - }, - }, - }, - }, - { - "files": [ - "**/*.ts", - "**/*.tsx", - "**/*.mts", - "**/*.cts", - ], - "name": "typescript-eslint/eslint-recommended", - "rules": { - "constructor-super": "off", - "getter-return": "off", - "no-class-assign": "off", - "no-const-assign": "off", - "no-dupe-args": "off", - "no-dupe-class-members": "off", - "no-dupe-keys": "off", - "no-func-assign": "off", - "no-import-assign": "off", - "no-new-native-nonconstructor": "off", - "no-new-symbol": "off", - "no-obj-calls": "off", - "no-redeclare": "off", - "no-setter-return": "off", - "no-this-before-super": "off", - "no-undef": "off", - "no-unreachable": "off", - "no-unsafe-negation": "off", - "no-var": "error", - "prefer-const": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - }, - }, - { - "name": "typescript-eslint/recommended", - "rules": { - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extra-non-null-assertion": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-type-constraint": "error", - "@typescript-eslint/no-unsafe-declaration-merging": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/prefer-as-const": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/triple-slash-reference": "error", - "no-array-constructor": "off", - "no-unused-expressions": "off", - "no-unused-vars": "off", - }, - }, - { - "name": "tanstack/query/flat/recommended", "plugins": { - "@tanstack/query": { - "configs": { - "flat/recommended": [ - { - "name": "tanstack/query/flat/recommended", - "plugins": [Circular], - "rules": { - "@tanstack/query/exhaustive-deps": "error", - "@tanstack/query/infinite-query-property-order": "error", - "@tanstack/query/no-rest-destructuring": "warn", - "@tanstack/query/no-unstable-deps": "error", - "@tanstack/query/stable-query-client": "error", - }, - }, - ], - "recommended": { - "plugins": [ - "@tanstack/query", - ], - "rules": { - "@tanstack/query/exhaustive-deps": "error", - "@tanstack/query/infinite-query-property-order": "error", - "@tanstack/query/no-rest-destructuring": "warn", - "@tanstack/query/no-unstable-deps": "error", - "@tanstack/query/stable-query-client": "error", - }, - }, - }, - "meta": { - "name": "@tanstack/eslint-plugin-query", - }, + "@devup-ui": { "rules": { - "exhaustive-deps": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Exhaustive deps rule for useQuery", - "recommended": "error", - "url": "https://tanstack.com/query/latest/docs/eslint/exhaustive-deps", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "fixTo": "Fix to {{result}}", - "missingDeps": "The following dependencies are missing in your queryKey: {{deps}}", - }, - "schema": [], - "type": "problem", - }, - }, - "infinite-query-property-order": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Ensure correct order of inference sensitive properties for infinite queries", - "recommended": "error", - "url": "https://tanstack.com/query/latest/docs/eslint/infinite-query-property-order", - }, - "fixable": "code", - "hasSuggestions": true, - "messages": { - "invalidOrder": "Invalid order of properties for \`{{function}}\`.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-rest-destructuring": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallows rest destructuring in queries", - "recommended": "warn", - "url": "https://tanstack.com/query/latest/docs/eslint/no-rest-destructuring", - }, - "messages": { - "objectRestDestructure": "Object rest destructuring on a query will observe all changes to the query, leading to excessive re-renders.", - }, - "schema": [], - "type": "problem", - }, - }, - "no-unstable-deps": { - "create": [Function], - "defaultOptions": [], - "meta": { - "docs": { - "description": "Disallow putting the result of query hooks directly in a React hook dependency array", - "recommended": "error", - "url": "https://tanstack.com/query/latest/docs/eslint/no-unstable-deps", - }, - "messages": { - "noUnstableDeps": "The result of {{queryHook}} is not referentially stable, so don't pass it directly into the dependencies array of {{reactHook}}. Instead, destructure the return value of {{queryHook}} and pass the destructured values into the dependency array of {{reactHook}}.", - }, - "schema": [], - "type": "problem", - }, - }, - "stable-query-client": { + "css-utils-literal-only": { "create": [Function], "defaultOptions": [], "meta": { "docs": { - "description": "Makes sure that QueryClient is stable", - "recommended": "error", - "url": "https://tanstack.com/query/latest/docs/eslint/stable-query-client", + "description": "CSS utils should only be used with literal values.", + "url": "https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/css-utils-literal-only", }, - "fixable": "code", - "hasSuggestions": true, "messages": { - "fixTo": "Fix to {{result}}", - "unstable": "QueryClient is not stable. It should be either extracted from the component or wrapped in React.useState. -See https://tkdodo.eu/blog/react-query-fa-qs#2-the-queryclient-is-not-stable", + "cssUtilsLiteralOnly": "CSS utils should only be used with literal values.", }, "schema": [], "type": "problem", }, }, - }, - }, - }, - "rules": { - "@tanstack/query/exhaustive-deps": "error", - "@tanstack/query/infinite-query-property-order": "error", - "@tanstack/query/no-rest-destructuring": "warn", - "@tanstack/query/no-unstable-deps": "error", - "@tanstack/query/stable-query-client": "error", - }, - }, - { - "plugins": { - "@devup": { - "rules": { - "app-page": { + "no-duplicate-value": { "create": [Function], "defaultOptions": [], "meta": { "docs": { - "description": "required 페이지나 레이아웃 컴포넌트는 반드시 export default로 내보내야 합니다.", - "url": "https://github.com/dev-five-git/devup/tree/main/packages/eslint-plugin/src/rules/app-page", + "description": "No duplicate value.", + "url": "https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/no-duplicate-value", }, "fixable": "code", "messages": { - "nameOfPageOrLayoutComponentShouldHaveSuffix": "페이지나 레이아웃 컴포넌트의 이름은 반드시 \`Page\`나 \`Layout\`으로 끝나야 합니다.", - "pageOrLayoutComponentShouldDefaultExport": "페이지나 레이아웃 컴포넌트는 반드시 \`export default\`로 내보내야 합니다.", - "pathParamsShouldExist": "경로 변수를 사용할 수 있을 경우 \`params\`는 반드시 존재해야 합니다.", + "duplicateValue": "Duplicate value found: {{value}}.", }, "schema": [], "type": "problem", }, }, - "component": { + "no-useless-responsive": { "create": [Function], "defaultOptions": [], "meta": { "docs": { - "description": "required 컴포넌트 이름은 디렉터리 혹은 파일명을 따라야 합니다.", - "url": "https://github.com/dev-five-git/devup/tree/main/packages/eslint-plugin/src/rules/component", + "description": "No useless responsive.", + "url": "https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/no-useless-responsive", }, "fixable": "code", "messages": { - "componentFileShouldExportComponent": "컴포넌트 파일은 컴포넌트를 내보내야 합니다.", - "componentNameShouldBeFollowDirectoryStructure": "컴포넌트 이름은 디렉토리명 혹은 파일명을 따라야 합니다.", + "uselessResponsive": "Responsive are useless. Remove them.", }, "schema": [], "type": "problem", }, }, - "component-interface": { + "no-useless-tailing-nulls": { "create": [Function], "defaultOptions": [], "meta": { "docs": { - "description": "required type annotation for component props when empty object pattern", - "url": "https://github.com/dev-five-git/devup/tree/main/packages/eslint-plugin/src/rules/component-interface", - }, - "fixable": "code", - "messages": { - "componentPropsShouldHaveTypeAnnotationWhenEmptyObjectPattern": "컴포넌트의 \`props\`가 비어있고 타입이 없을 경우 반드시 타입을 명시해야 합니다.", - }, - "schema": [], - "type": "problem", - }, - }, - "rsc-api": { - "create": [Function], - "meta": { - "docs": { - "description": "required 서버 컴포넌트에서는 반드시 cache 버전을 사용해야 합니다.", - "recommended": true, - }, - "fixable": "code", - "messages": { - "apiShouldBeCached": "\`{{ api }}\`는 서버 컴포넌트에서는 반드시 cache 버전을 사용해야 합니다.", - }, - "schema": [], - "type": "problem", - }, - }, - }, - }, - "react-hooks": { - "configs": { - "recommended": { - "plugins": [ - "react-hooks", - ], - "rules": { - "react-hooks/exhaustive-deps": "warn", - "react-hooks/rules-of-hooks": "error", - }, - }, - "recommended-latest": { - "name": "react-hooks/recommended", - "plugins": { - "react-hooks": { - "configs": [Circular], - "meta": { - "name": "eslint-plugin-react-hooks", - }, - "rules": { - "exhaustive-deps": { - "create": [Function], - "meta": { - "docs": { - "description": "verifies the list of dependencies for Hooks like useEffect and similar", - "recommended": true, - "url": "https://github.com/facebook/react/issues/14920", - }, - "fixable": "code", - "hasSuggestions": true, - "schema": [ - { - "additionalProperties": false, - "enableDangerousAutofixThisMayCauseInfiniteLoops": false, - "properties": { - "additionalHooks": { - "type": "string", - }, - "enableDangerousAutofixThisMayCauseInfiniteLoops": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "rules-of-hooks": { - "create": [Function], - "meta": { - "docs": { - "description": "enforces the Rules of Hooks", - "recommended": true, - "url": "https://reactjs.org/docs/hooks-rules.html", - }, - "type": "problem", - }, - }, - }, - }, - }, - "rules": { - "react-hooks/exhaustive-deps": "warn", - "react-hooks/rules-of-hooks": "error", - }, - }, - "recommended-legacy": { - "plugins": [ - "react-hooks", - ], - "rules": { - "react-hooks/exhaustive-deps": "warn", - "react-hooks/rules-of-hooks": "error", - }, - }, - }, - "meta": { - "name": "eslint-plugin-react-hooks", - }, - "rules": { - "exhaustive-deps": { - "create": [Function], - "meta": { - "docs": { - "description": "verifies the list of dependencies for Hooks like useEffect and similar", - "recommended": true, - "url": "https://github.com/facebook/react/issues/14920", - }, - "fixable": "code", - "hasSuggestions": true, - "schema": [ - { - "additionalProperties": false, - "enableDangerousAutofixThisMayCauseInfiniteLoops": false, - "properties": { - "additionalHooks": { - "type": "string", - }, - "enableDangerousAutofixThisMayCauseInfiniteLoops": { - "type": "boolean", - }, - }, - "type": "object", - }, - ], - "type": "suggestion", - }, - }, - "rules-of-hooks": { - "create": [Function], - "meta": { - "docs": { - "description": "enforces the Rules of Hooks", - "recommended": true, - "url": "https://reactjs.org/docs/hooks-rules.html", - }, - "type": "problem", - }, - }, - }, - }, - "simple-import-sort": { - "meta": { - "name": "eslint-plugin-simple-import-sort", - "version": "12.1.1", - }, - "rules": { - "exports": { - "create": [Function], - "meta": { - "docs": { - "description": "Automatically sort exports.", - "url": "https://github.com/lydell/eslint-plugin-simple-import-sort#sort-order", + "description": "No useless tailing nulls.", + "url": "https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/no-useless-tailing-nulls", }, "fixable": "code", "messages": { - "sort": "Run autofix to sort these exports!", + "uselessTailingNulls": "Trailing nulls are useless. Remove them.", }, "schema": [], - "type": "layout", - }, - }, - "imports": { - "create": [Function], - "meta": { - "docs": { - "description": "Automatically sort imports.", - "url": "https://github.com/lydell/eslint-plugin-simple-import-sort#sort-order", - }, - "fixable": "code", - "messages": { - "sort": "Run autofix to sort these imports!", - }, - "schema": [ - { - "additionalProperties": false, - "properties": { - "groups": { - "items": { - "items": { - "type": "string", - }, - "type": "array", - }, - "type": "array", - }, - }, - "type": "object", - }, - ], - "type": "layout", - }, - }, - }, - }, - "unused-imports": { - "meta": { - "name": "unused-imports", - }, - "rules": { - "no-unused-imports": { - "create": [Function], - "defaultOptions": [ - {}, - ], - "meta": { - "docs": { - "description": "Disallow unused variables", - "extendsBaseRule": true, - "recommended": "recommended", - "url": "https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/docs/rules/no-unused-imports.md", - }, - "fixable": "code", - "messages": { - "unusedVar": "'{{varName}}' is {{action}} but never used{{additional}}.", - "usedIgnoredVar": "'{{varName}}' is marked as ignored but is used{{additional}}.", - "usedOnlyAsType": "'{{varName}}' is {{action}} but only used as a type{{additional}}.", - }, - "schema": [ - { - "oneOf": [ - { - "enum": [ - "all", - "local", - ], - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "args": { - "description": "Whether to check all, some, or no arguments.", - "enum": [ - "all", - "after-used", - "none", - ], - "type": "string", - }, - "argsIgnorePattern": { - "description": "Regular expressions of argument names to not check for usage.", - "type": "string", - }, - "caughtErrors": { - "description": "Whether to check catch block arguments.", - "enum": [ - "all", - "none", - ], - "type": "string", - }, - "caughtErrorsIgnorePattern": { - "description": "Regular expressions of catch block argument names to not check for usage.", - "type": "string", - }, - "destructuredArrayIgnorePattern": { - "description": "Regular expressions of destructured array variable names to not check for usage.", - "type": "string", - }, - "ignoreClassWithStaticInitBlock": { - "description": "Whether to ignore classes with at least one static initialization block.", - "type": "boolean", - }, - "ignoreRestSiblings": { - "description": "Whether to ignore sibling properties in \`...\` destructurings.", - "type": "boolean", - }, - "reportUsedIgnorePattern": { - "description": "Whether to report variables that match any of the valid ignore pattern options if they have been used.", - "type": "boolean", - }, - "vars": { - "description": "Whether to check all variables or only locally-declared variables.", - "enum": [ - "all", - "local", - ], - "type": "string", - }, - "varsIgnorePattern": { - "description": "Regular expressions of variable names to not check for usage.", - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - ], - "type": "problem", - }, - }, - "no-unused-vars": { - "create": [Function], - "defaultOptions": [ - {}, - ], - "meta": { - "docs": { - "description": "Disallow unused variables", - "extendsBaseRule": true, - "recommended": "recommended", - "url": "https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/docs/rules/no-unused-vars.md", - }, - "fixable": "code", - "messages": { - "unusedVar": "'{{varName}}' is {{action}} but never used{{additional}}.", - "usedIgnoredVar": "'{{varName}}' is marked as ignored but is used{{additional}}.", - "usedOnlyAsType": "'{{varName}}' is {{action}} but only used as a type{{additional}}.", - }, - "schema": [ - { - "oneOf": [ - { - "enum": [ - "all", - "local", - ], - "type": "string", - }, - { - "additionalProperties": false, - "properties": { - "args": { - "description": "Whether to check all, some, or no arguments.", - "enum": [ - "all", - "after-used", - "none", - ], - "type": "string", - }, - "argsIgnorePattern": { - "description": "Regular expressions of argument names to not check for usage.", - "type": "string", - }, - "caughtErrors": { - "description": "Whether to check catch block arguments.", - "enum": [ - "all", - "none", - ], - "type": "string", - }, - "caughtErrorsIgnorePattern": { - "description": "Regular expressions of catch block argument names to not check for usage.", - "type": "string", - }, - "destructuredArrayIgnorePattern": { - "description": "Regular expressions of destructured array variable names to not check for usage.", - "type": "string", - }, - "ignoreClassWithStaticInitBlock": { - "description": "Whether to ignore classes with at least one static initialization block.", - "type": "boolean", - }, - "ignoreRestSiblings": { - "description": "Whether to ignore sibling properties in \`...\` destructurings.", - "type": "boolean", - }, - "reportUsedIgnorePattern": { - "description": "Whether to report variables that match any of the valid ignore pattern options if they have been used.", - "type": "boolean", - }, - "vars": { - "description": "Whether to check all variables or only locally-declared variables.", - "enum": [ - "all", - "local", - ], - "type": "string", - }, - "varsIgnorePattern": { - "description": "Regular expressions of variable names to not check for usage.", - "type": "string", - }, - }, - "type": "object", - }, - ], - }, - ], "type": "problem", }, }, @@ -14354,112 +73,10 @@ See https://tkdodo.eu/blog/react-query-fa-qs#2-the-queryclient-is-not-stable", }, }, "rules": { - "@devup/app-page": "error", - "@devup/component": "error", - "@devup/component-interface": "error", - "@devup/rsc-api": "error", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-expressions": [ - "error", - { - "allowShortCircuit": true, - "allowTernary": true, - }, - ], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "args": "all", - "argsIgnorePattern": "^_", - "caughtErrors": "all", - "caughtErrorsIgnorePattern": "^_", - "destructuredArrayIgnorePattern": "^_", - "ignoreRestSiblings": true, - "varsIgnorePattern": "^_", - }, - ], - "@typescript-eslint/no-var-requires": "off", - "camelcase": "off", - "comma-dangle": "off", - "no-console": [ - "error", - { - "allow": [ - "info", - "debug", - "warn", - "error", - ], - }, - ], - "no-constant-condition": [ - "error", - { - "checkLoops": false, - }, - ], - "no-trailing-spaces": "error", - "prettier/prettier": [ - "error", - { - "endOfLine": "auto", - "semi": false, - "singleQuote": true, - "trailingComma": "all", - }, - ], - "react-hooks/exhaustive-deps": [ - "warn", - { - "additionalHooks": "useSafeEffect", - }, - ], - "react-hooks/rules-of-hooks": "error", - "react/jsx-curly-brace-presence": "error", - "react/jsx-sort-props": [ - "error", - { - "callbacksLast": false, - "ignoreCase": false, - "noSortAlphabetically": false, - "reservedFirst": true, - "shorthandFirst": false, - "shorthandLast": false, - }, - ], - "react/prop-types": "off", - "react/react-in-jsx-scope": "off", - "react/sort-default-props": "error", - "require-jsdoc": "off", - "simple-import-sort/exports": "error", - "simple-import-sort/imports": "error", - "spaced-comment": [ - "error", - "always", - { - "markers": [ - "/", - ], - }, - ], - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": "off", - "valid-jsdoc": "off", - }, - "settings": { - "react": { - "version": "detect", - }, - }, - }, - { - "files": [ - "**/*.test-d.{ts,tsx}", - ], - "rules": { - "@typescript-eslint/no-unused-expressions": "off", + "@devup-ui/css-utils-literal-only": "error", + "@devup-ui/no-duplicate-value": "error", + "@devup-ui/no-useless-responsive": "error", + "@devup-ui/no-useless-tailing-nulls": "error", }, }, ] diff --git a/packages/eslint-plugin/src/configs/recommended.ts b/packages/eslint-plugin/src/configs/recommended.ts index 0e2a5f5a..7bfef860 100644 --- a/packages/eslint-plugin/src/configs/recommended.ts +++ b/packages/eslint-plugin/src/configs/recommended.ts @@ -1,33 +1,27 @@ -import { noUselessTailingNulls } from 'src/rules/no-useless-tailing-nulls' +import { + cssUtilsLiteralOnly, + noDuplicateValue, + noUselessResponsive, + noUselessTailingNulls, +} from '../rules' export default [ - { - ignores: [ - '**/node_modules/', - '**/build/', - '**/__snapshots__/', - '!**/src/**', - '!vite.config.ts', - '!**/.storybook/**', - '**/storybook-static/', - '**/dist/', - '**/next-env.d.ts', - '**/out/', - '**/.next/', - '**/public/', - '**/.df/', - ], - }, { plugins: { '@devup-ui': { rules: { 'no-useless-tailing-nulls': noUselessTailingNulls, + 'css-utils-literal-only': cssUtilsLiteralOnly, + 'no-duplicate-value': noDuplicateValue, + 'no-useless-responsive': noUselessResponsive, }, }, }, rules: { '@devup-ui/no-useless-tailing-nulls': 'error', + '@devup-ui/css-utils-literal-only': 'error', + '@devup-ui/no-duplicate-value': 'error', + '@devup-ui/no-useless-responsive': 'error', }, }, ] diff --git a/packages/eslint-plugin/src/rules/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/__tests__/index.test.ts index 04d32c17..787c17c4 100644 --- a/packages/eslint-plugin/src/rules/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/__tests__/index.test.ts @@ -3,6 +3,9 @@ describe('export index', () => { it('export', () => { expect({ ...index }).toEqual({ noUselessTailingNulls: expect.any(Object), + cssUtilsLiteralOnly: expect.any(Object), + noDuplicateValue: expect.any(Object), + noUselessResponsive: expect.any(Object), }) }) }) diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/README.md b/packages/eslint-plugin/src/rules/css-utils-literal-only/README.md index e69de29b..51ac0c67 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/README.md +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/README.md @@ -0,0 +1,98 @@ +# css-utils-literal-only + +Enforce that CSS utility functions only use literal values in devup-ui. + +## Rule Details + +This rule ensures that CSS utility functions (`css`, `globalCss`, `keyframes`) from devup-ui only receive literal values as property values. Using variables or expressions in CSS utilities can lead to runtime issues and prevents proper static analysis and optimization. + +### Examples + +#### ❌ Incorrect + +```tsx +import { css } from '@devup-ui/react' + +const v = 'some-value' + +// Variables are not allowed in CSS utilities +css({ w: v }) +css({ w: [v] }) +css({ w: [1, null, v] }) +``` + +```tsx +import { globalCss } from '@devup-ui/react' + +const dynamicValue = getValue() + +// Dynamic values are not allowed +globalCss({ color: dynamicValue }) +``` + +```tsx +import { keyframes } from '@devup-ui/react' + +const animationName = 'fade' + +// Variables in keyframes are not allowed +keyframes({ from: { opacity: animationName } }) +``` + +#### ✅ Correct + +```tsx +import { css } from '@devup-ui/react' + +// Only literal values are allowed +css({ w: 1 }) +css({ w: '1' }) +css({ w: [1] }) +css({ w: ['1'] }) +css({ w: [1, null, '2'] }) +``` + +```tsx +import { globalCss } from '@devup-ui/react' + +// Literal values only +globalCss({ color: 'red' }) +globalCss({ fontSize: 16 }) +``` + +```tsx +import { keyframes } from '@devup-ui/react' + +// Literal values in keyframes +keyframes({ from: { opacity: 0 }, to: { opacity: 1 } }) +``` + +```tsx +import { css } from 'other-package' + +// Only applies to devup-ui CSS utilities +css({ w: v }) // This is fine for other packages +``` + +## When Not To Use It + +This rule is specifically designed for devup-ui CSS utility functions. It only applies when: + +- Using devup-ui CSS utilities (`css`, `globalCss`, `keyframes`) +- The utility function is called with an object containing properties +- Property values contain variables or expressions + +The rule will not trigger for: + +- CSS utilities from other packages +- Literal values (strings, numbers, arrays of literals) +- Non-CSS utility functions + +## Why This Rule Exists + +CSS utilities in devup-ui are designed to work with static, literal values for optimal performance and build-time optimization. Using variables or dynamic expressions can: + +- Prevent proper static analysis +- Cause runtime errors +- Reduce build-time optimizations +- Make the code harder to understand and maintain diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts index 116129ca..0ffe2c38 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts @@ -2,18 +2,19 @@ import { RuleTester } from '@typescript-eslint/rule-tester' import { cssUtilsLiteralOnly } from '../index' -describe('css-utils-literal-only rule', () => { - const ruleTester = new RuleTester({ - languageOptions: { - ecmaVersion: 'latest', - parserOptions: { - ecmaFeatures: { - jsx: true, +describe.each(['css', 'globalCss', 'keyframes'])( + 'css-utils-literal-only rule', + (code) => { + const ruleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 'latest', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, }, }, - }, - }) - it.each(['css', 'globalCss'])('should pass', (code) => { + }) ruleTester.run('css-utils-literal-only rule', cssUtilsLiteralOnly, { valid: [ { @@ -44,7 +45,6 @@ describe('css-utils-literal-only rule', () => { invalid: [ { code: `import { ${code} } from "@devup-ui/react";\n${code}({w: v})`, - output: `import { ${code} } from "@devup-ui/react";\n${code}({w: v})`, filename: 'src/app/layout.tsx', errors: [ { @@ -54,7 +54,6 @@ describe('css-utils-literal-only rule', () => { }, { code: `import { ${code} } from "@devup-ui/react";\n${code}({w: [v]})`, - output: `import { ${code} } from "@devup-ui/react";\n${code}({w: [v]})`, filename: 'src/app/layout.tsx', errors: [ { @@ -64,7 +63,6 @@ describe('css-utils-literal-only rule', () => { }, { code: `import { ${code} } from "@devup-ui/react";\n${code}({w: [1, null, v]})`, - output: `import { ${code} } from "@devup-ui/react";\n${code}({w: [1, null, v]})`, filename: 'src/app/layout.tsx', errors: [ { @@ -74,7 +72,6 @@ describe('css-utils-literal-only rule', () => { }, { code: `import { ${code} as B } from "@devup-ui/react";\nB({w: [1, null, v]})`, - output: `import { ${code} as B } from "@devup-ui/react";\nB({w: [1, null, v]})`, filename: 'src/app/layout.tsx', errors: [ { @@ -84,5 +81,5 @@ describe('css-utils-literal-only rule', () => { }, ], }) - }) -}) + }, +) diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts index 50602b8d..dd6251f8 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts @@ -1,4 +1,10 @@ -import { ESLintUtils } from '@typescript-eslint/utils' +import { + AST_NODE_TYPES, + ESLintUtils, + type TSESTree, +} from '@typescript-eslint/utils' + +import { ImportStorage } from '../../utils/import-storage' const createRule = ESLintUtils.RuleCreator( (name) => @@ -14,12 +20,48 @@ export const cssUtilsLiteralOnly = createRule({ cssUtilsLiteralOnly: 'CSS utils should only be used with literal values.', }, type: 'problem', - fixable: 'code', docs: { description: 'CSS utils should only be used with literal values.', }, }, - create(_context) { - return {} + create(context) { + const importStorage = new ImportStorage() + let devupContext: + | TSESTree.CallExpression + | TSESTree.JSXOpeningElement + | null = null + return { + ImportDeclaration(node) { + importStorage.addImportByDeclaration(node) + }, + CallExpression(node) { + if ( + importStorage.checkContextType(node) === 'UTIL' && + node.arguments.length === 1 && + node.arguments[0].type === AST_NODE_TYPES.ObjectExpression + ) { + devupContext = node + } + }, + 'CallExpression:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + Identifier(node) { + if (!devupContext) return + + const an = context.sourceCode.getAncestors(node) + const property = an.find( + (ancestor) => ancestor.type === AST_NODE_TYPES.Property, + ) + if (!property || [...an, node].indexOf(property.value) === -1) return + + context.report({ + node, + messageId: 'cssUtilsLiteralOnly', + }) + }, + } }, }) diff --git a/packages/eslint-plugin/src/rules/index.ts b/packages/eslint-plugin/src/rules/index.ts index 9b1a6e10..2c7e3eb8 100644 --- a/packages/eslint-plugin/src/rules/index.ts +++ b/packages/eslint-plugin/src/rules/index.ts @@ -1 +1,4 @@ +export * from './css-utils-literal-only' +export * from './no-duplicate-value' +export * from './no-useless-responsive' export * from './no-useless-tailing-nulls' diff --git a/packages/eslint-plugin/src/rules/no-duplicate-value/README.md b/packages/eslint-plugin/src/rules/no-duplicate-value/README.md new file mode 100644 index 00000000..b5774d5b --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-duplicate-value/README.md @@ -0,0 +1,71 @@ +# no-duplicate-value + +Disallow consecutive duplicate values in arrays within devup-ui components and utilities. + +## Rule Details + +This rule prevents the use of consecutive duplicate literal values in arrays that are passed to devup-ui components or utilities. Consecutive duplicate values are considered redundant since they don't provide any additional styling information and can be replaced with `null` values. + +### Examples + +#### ❌ Incorrect + +```tsx +import { Box } from '@devup-ui/react' + +// Consecutive duplicate values are redundant +; +; +``` + +```tsx +import { css } from '@devup-ui/react' + +// Consecutive duplicates in css utility +css({ w: [1, 2, 2, 2, 3] }) +``` + +#### ✅ Correct + +```tsx +import { Box } from '@devup-ui/react' + +// No consecutive duplicates +; +; // null values are fine +; // null between different values +``` + +```tsx +import { Box } from 'other-package' + +// Only applies to devup-ui components +; +``` + +```tsx +import { css } from '@devup-ui/react' + +// No consecutive duplicates +css({ w: [1, 2, 3] }) +css({ w: [1, 2, null, null, 3] }) +``` + +## When Not To Use It + +This rule is specifically designed for devup-ui components and utilities. It only applies when: + +- Using devup-ui components (e.g., `Box`, `Flex`, etc.) +- Using devup-ui utilities (e.g., `css` function) +- The array contains consecutive literal values that are identical + +The rule will not trigger for: + +- Non-consecutive duplicate values (e.g., `[1, 2, 1]`) +- Arrays used with other libraries +- Non-literal values +- Arrays that are part of member expressions + +## Auto-fixable + +This rule is auto-fixable. ESLint will automatically replace consecutive duplicate values with `null` when possible. diff --git a/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts new file mode 100644 index 00000000..ab2b05cc --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts @@ -0,0 +1,77 @@ +import { RuleTester } from '@typescript-eslint/rule-tester' + +import { noDuplicateValue } from '../index' + +describe('no-duplicate-value rule', () => { + const ruleTester = new RuleTester({ + languageOptions: { + ecmaVersion: 'latest', + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }) + ruleTester.run('no-duplicate-value rule', noDuplicateValue, { + valid: [ + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "other-package";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { css } from "other-package";\ncss()', + filename: 'src/app/page.tsx', + }, + ], + invalid: [ + { + code: 'import { Box } from "@devup-ui/react";\n', + output: + 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'duplicateValue', + }, + { + messageId: 'duplicateValue', + }, + ], + }, + { + code: 'import { Box } from "@devup-ui/react";\n', + output: + 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + errors: [ + { + messageId: 'duplicateValue', + }, + ], + }, + { + code: 'import { css } from "@devup-ui/react";\ncss({w: [1, 2, 2, 2, 3]})', + output: + 'import { css } from "@devup-ui/react";\ncss({w: [1, 2, null, null, 3]})', + filename: 'src/app/page.tsx', + errors: [ + { + messageId: 'duplicateValue', + }, + { + messageId: 'duplicateValue', + }, + ], + }, + ], + }) +}) diff --git a/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts b/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts new file mode 100644 index 00000000..b5461fec --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts @@ -0,0 +1,96 @@ +import { + AST_NODE_TYPES, + ESLintUtils, + type TSESTree, +} from '@typescript-eslint/utils' +import type { RuleContext } from '@typescript-eslint/utils/ts-eslint' + +import { ImportStorage } from '../../utils/import-storage' + +const createRule = ESLintUtils.RuleCreator( + (name) => + `https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`, +) + +function checkDuplicateValue>( + node: TSESTree.ArrayExpression, + context: T, +) { + for (let i = 0; i < node.elements.length; i++) { + const element = node.elements[i] + if (element?.type === AST_NODE_TYPES.Literal) { + if (i === 0) continue + const prevElement = node.elements[i - 1] + if ( + prevElement?.type === AST_NODE_TYPES.Literal && + element.value === prevElement.value + ) { + context.report({ + node, + messageId: 'duplicateValue', + data: { + value: element.value, + }, + fix(fixer) { + return fixer.replaceText(element, 'null') + }, + }) + } + } + } +} + +export const noDuplicateValue = createRule({ + name: 'no-duplicate-value', + defaultOptions: [], + meta: { + schema: [], + messages: { + duplicateValue: 'Duplicate value found: {{value}}.', + }, + type: 'problem', + fixable: 'code', + docs: { + description: 'No duplicate value.', + }, + }, + create(context) { + const importStorage = new ImportStorage() + let devupContext: + | TSESTree.CallExpression + | TSESTree.JSXOpeningElement + | null = null + return { + ImportDeclaration(node) { + importStorage.addImportByDeclaration(node) + }, + CallExpression(node) { + if ( + importStorage.checkContextType(node) === 'UTIL' && + node.arguments.length === 1 && + node.arguments[0].type === AST_NODE_TYPES.ObjectExpression + ) { + devupContext = node + } + }, + 'CallExpression:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + JSXOpeningElement(node) { + if (importStorage.checkContextType(node) === 'COMPONENT') { + devupContext = node + } + }, + 'JSXOpeningElement:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + ArrayExpression(node) { + if (devupContext) checkDuplicateValue(node, context) + }, + } + }, +}) diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/README.md b/packages/eslint-plugin/src/rules/no-useless-responsive/README.md index e69de29b..481c4a36 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/README.md +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/README.md @@ -0,0 +1,79 @@ +# no-useless-responsive + +Disallow useless responsive arrays with single values in devup-ui components and utilities. + +## Rule Details + +This rule prevents the use of arrays with only one element when passed to devup-ui components or utilities. Single-element arrays are considered useless for responsive design since they don't provide any responsive behavior and can be simplified to just the value itself. + +### Examples + +#### ❌ Incorrect + +```tsx +import { Box } from '@devup-ui/react' + +// Single-element arrays are useless +; +; +``` + +```tsx +import { css } from '@devup-ui/react' + +// Single-element arrays in css utility +css({ w: [1] }) +``` + +```tsx +import { css as c } from '@devup-ui/react' + +// Works with aliased imports +c({ w: [1] }) +``` + +#### ✅ Correct + +```tsx +import { Box } from '@devup-ui/react' + +// Use the value directly instead of wrapping in array +; +; +; // Empty arrays are fine +``` + +```tsx +import { Box } from 'other-package' + +// Only applies to devup-ui components +; +; // Multi-element arrays are fine +``` + +```tsx +import { css } from '@devup-ui/react' + +// Use the value directly +css({ w: 1 }) +css({ w: '1' }) +``` + +## When Not To Use It + +This rule is specifically designed for devup-ui components and utilities. It only applies when: + +- Using devup-ui components (e.g., `Box`, `Flex`, etc.) +- Using devup-ui utilities (e.g., `css` function) +- The array contains exactly one element + +The rule will not trigger for: + +- Arrays with multiple elements (e.g., `[1, 2, 3]`) +- Empty arrays (e.g., `[]`) +- Arrays used with other libraries +- Non-array values + +## Auto-fixable + +This rule is auto-fixable. ESLint will automatically convert single-element arrays to their direct values when possible. diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts index b9b7e5f6..04184a57 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts @@ -23,10 +23,34 @@ describe('no-useless-responsive rule', () => { code: 'import { Box } from "@devup-ui/react";\n', filename: 'src/app/page.tsx', }, + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { "Box" as B } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import B from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import * as B from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, { code: 'import { Box } from "other-package";\n', filename: 'src/app/page.tsx', }, + { + code: 'import { Box } from "other-package";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "other-package";\n', + filename: 'src/app/page.tsx', + }, { code: 'import { css } from "@devup-ui/react";\ncss({w: 1})', filename: 'src/app/page.tsx', @@ -39,6 +63,10 @@ describe('no-useless-responsive rule', () => { code: 'import { css } from "other-package";\ncss({w: [1][0]})', filename: 'src/app/page.tsx', }, + { + code: 'import { css } from "other-package";\ncss()', + filename: 'src/app/page.tsx', + }, ], invalid: [ { @@ -51,6 +79,66 @@ describe('no-useless-responsive rule', () => { }, ], }, + { + code: 'import { Box } from "@devup-ui/react";\n', + output: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, + { + code: 'import A from "@devup-ui/react";\n', + output: 'import A from "@devup-ui/react";\n', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, + { + code: 'import { css } from "@devup-ui/react";\ncss({w: [1]})', + output: 'import { css } from "@devup-ui/react";\ncss({w: 1})', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, + { + code: 'import { css as c } from "@devup-ui/react";\nc({w: [1]})', + output: 'import { css as c } from "@devup-ui/react";\nc({w: 1})', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, + { + code: 'import c from "@devup-ui/react";\nc.css({w: [1]})', + output: 'import c from "@devup-ui/react";\nc.css({w: 1})', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, + { + code: 'import * as c from "@devup-ui/react";\nc.css({w: [1]})', + output: 'import * as c from "@devup-ui/react";\nc.css({w: 1})', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + ], + }, ], }) }) diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts index 3c1150e2..a97598f5 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts @@ -1,10 +1,33 @@ -import { ESLintUtils } from '@typescript-eslint/utils' +import { + AST_NODE_TYPES, + ESLintUtils, + type TSESTree, +} from '@typescript-eslint/utils' +import type { RuleContext } from '@typescript-eslint/utils/ts-eslint' + +import { ImportStorage } from '../../utils/import-storage' const createRule = ESLintUtils.RuleCreator( (name) => `https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`, ) +function checkUselessResponsive>( + node: TSESTree.ArrayExpression, + context: T, +) { + if (node.elements.length !== 1) return + + const element = node.elements[0]! + context.report({ + node, + messageId: 'uselessResponsive', + fix(fixer) { + return fixer.replaceText(node, context.sourceCode.getText(element!)) + }, + }) +} + export const noUselessResponsive = createRule({ name: 'no-useless-responsive', defaultOptions: [], @@ -19,7 +42,43 @@ export const noUselessResponsive = createRule({ description: 'No useless responsive.', }, }, - create(_context) { - return {} + create(context) { + const importStorage = new ImportStorage() + let devupContext: + | TSESTree.CallExpression + | TSESTree.JSXOpeningElement + | null = null + return { + ImportDeclaration(node) { + importStorage.addImportByDeclaration(node) + }, + CallExpression(node) { + if ( + importStorage.checkContextType(node) === 'UTIL' && + node.arguments.length === 1 && + node.arguments[0].type === AST_NODE_TYPES.ObjectExpression + ) { + devupContext = node + } + }, + 'CallExpression:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + JSXOpeningElement(node) { + if (importStorage.checkContextType(node) === 'COMPONENT') { + devupContext = node + } + }, + 'JSXOpeningElement:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + ArrayExpression(node) { + if (devupContext) checkUselessResponsive(node, context) + }, + } }, }) diff --git a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md index e69de29b..11a95db0 100644 --- a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md +++ b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/README.md @@ -0,0 +1,63 @@ +# no-useless-tailing-nulls + +Disallow useless trailing null values in arrays within devup-ui components and utilities. + +## Rule Details + +This rule prevents the use of trailing `null` values in arrays that are passed to devup-ui components or utilities. Trailing nulls are considered useless because they don't affect the styling behavior and can be safely removed. + +### Examples + +#### ❌ Incorrect + +```tsx +import { Box } from '@devup-ui/react' + +// Trailing nulls are useless +; +; +; +``` + +```tsx +import { css } from '@devup-ui/react' + +// Trailing nulls in css utility +css({ w: [1, 2, null, null] }) +``` + +#### ✅ Correct + +```tsx +import { Box } from '@devup-ui/react' + +// No trailing nulls +; +; // null in the middle is fine +; +``` + +```tsx +import { Box } from 'other-package' + +// Only applies to devup-ui components +; +``` + +## When Not To Use It + +This rule is specifically designed for devup-ui components and utilities. It only applies when: + +- Using devup-ui components (e.g., `Box`, `Flex`, etc.) +- Using devup-ui utilities (e.g., `css` function) +- The array is not part of a member expression (e.g., `array[1]`) + +The rule will not trigger for: + +- Arrays with null values in the middle +- Arrays used with other libraries +- Arrays that are part of member expressions + +## Auto-fixable + +This rule is auto-fixable. ESLint will automatically remove trailing null values when possible. diff --git a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts index cc7df679..d83b2815 100644 --- a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts @@ -24,7 +24,7 @@ describe('no-useless-tailing-nulls rule', () => { filename: 'src/app/page.tsx', }, { - code: 'import { Box } from "other-package";\n', + code: 'import { Box } from "other-package";\n', filename: 'src/app/page.tsx', }, ], @@ -59,6 +59,16 @@ describe('no-useless-tailing-nulls rule', () => { }, ], }, + { + code: 'import { Box } from "@devup-ui/react";\n', + output: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + errors: [ + { + messageId: 'uselessTailingNulls', + }, + ], + }, ], }) }) diff --git a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts index 0153c6d4..da79db55 100644 --- a/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts +++ b/packages/eslint-plugin/src/rules/no-useless-tailing-nulls/index.ts @@ -1,10 +1,46 @@ -import { ESLintUtils } from '@typescript-eslint/utils' +import { + AST_NODE_TYPES, + ESLintUtils, + type TSESTree, +} from '@typescript-eslint/utils' +import type { RuleContext } from '@typescript-eslint/utils/ts-eslint' + +import { ImportStorage } from '../../utils/import-storage' const createRule = ESLintUtils.RuleCreator( (name) => `https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`, ) +function checkUselessTailingNulls>( + node: TSESTree.ArrayExpression, + context: T, +) { + let nullCount = 0 + for (let i = node.elements.length - 1; i >= 0; i--) { + const element = node.elements[i] + if (element?.type === AST_NODE_TYPES.Literal && element.value === null) { + nullCount++ + } else { + break + } + } + if (nullCount === 0) return + context.report({ + node, + messageId: 'uselessTailingNulls', + fix(fixer) { + return fixer.removeRange([ + node.elements.length > nullCount + ? node.elements[node.elements.length - nullCount - 1]!.range[1] + : node.elements[0]!.range[0], + + node.elements[node.elements.length - 1]!.range[1], + ]) + }, + }) +} + export const noUselessTailingNulls = createRule({ name: 'no-useless-tailing-nulls', defaultOptions: [], @@ -19,7 +55,47 @@ export const noUselessTailingNulls = createRule({ description: 'No useless tailing nulls.', }, }, - create(_context) { - return {} + create(context) { + const importStorage = new ImportStorage() + let devupContext: + | TSESTree.CallExpression + | TSESTree.JSXOpeningElement + | null = null + return { + ImportDeclaration(node) { + importStorage.addImportByDeclaration(node) + }, + CallExpression(node) { + if ( + importStorage.checkContextType(node) === 'UTIL' && + node.arguments.length === 1 && + node.arguments[0].type === AST_NODE_TYPES.ObjectExpression + ) { + devupContext = node + } + }, + 'CallExpression:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + JSXOpeningElement(node) { + if (importStorage.checkContextType(node) === 'COMPONENT') { + devupContext = node + } + }, + 'JSXOpeningElement:exit'(node) { + if (devupContext === node) { + devupContext = null + } + }, + ArrayExpression(node) { + if ( + devupContext && + node.parent?.type !== AST_NODE_TYPES.MemberExpression + ) + checkUselessTailingNulls(node, context) + }, + } }, }) diff --git a/packages/eslint-plugin/src/utils/import-storage.ts b/packages/eslint-plugin/src/utils/import-storage.ts new file mode 100644 index 00000000..008fb21a --- /dev/null +++ b/packages/eslint-plugin/src/utils/import-storage.ts @@ -0,0 +1,87 @@ +import { AST_NODE_TYPES, type TSESTree } from '@typescript-eslint/utils' +const defaultImports = { + css: 'css', + globalCss: 'globalCss', + keyframes: 'keyframes', + Box: 'Box', + Button: 'Button', + Text: 'Text', + Image: 'Image', + Flex: 'Flex', + Grid: 'Grid', + Center: 'Center', + VStack: 'VStack', + Input: 'Input', +} + +export class ImportStorage { + private imports: Record = {} + private importObject: Set = new Set() + + public addImportByDeclaration(node: TSESTree.ImportDeclaration) { + if (node.source.value !== '@devup-ui/react') return + + for (const specifier of node.specifiers) { + switch (specifier.type) { + case AST_NODE_TYPES.ImportSpecifier: + this.addImport( + specifier.local.name, + specifier.imported.type === AST_NODE_TYPES.Literal + ? specifier.imported.value + : specifier.imported.name, + ) + break + case AST_NODE_TYPES.ImportDefaultSpecifier: + this.importObject.add(specifier.local.name) + break + case AST_NODE_TYPES.ImportNamespaceSpecifier: + this.importObject.add(specifier.local.name) + break + } + } + } + + public addImport(key: string, value: string) { + this.imports[key] = value + } + + public checkContextType(node: TSESTree.Node) { + switch (node.type) { + case AST_NODE_TYPES.JSXOpeningElement: { + if (this.checkDevupUIComponent(node.name)) { + return 'COMPONENT' + } + break + } + case AST_NODE_TYPES.CallExpression: { + if (this.checkDevupUIUtil(node)) { + return 'UTIL' + } + break + } + } + } + + private checkDevupUIUtil(node: TSESTree.CallExpression): boolean { + return ( + (node.callee.type === AST_NODE_TYPES.Identifier && + node.callee.name in this.imports) || + (node.callee.type === AST_NODE_TYPES.MemberExpression && + node.callee.object.type === AST_NODE_TYPES.Identifier && + this.importObject.has(node.callee.object.name) && + node.callee.property.type === AST_NODE_TYPES.Identifier && + node.callee.property.name in defaultImports) + ) + } + + private checkDevupUIComponent(node: TSESTree.JSXTagNameExpression): boolean { + return ( + (node.type === AST_NODE_TYPES.JSXIdentifier && + node.name in this.imports) || + (node.type === AST_NODE_TYPES.JSXMemberExpression && + node.object.type === AST_NODE_TYPES.JSXIdentifier && + this.importObject.has(node.object.name) && + node.property.name in defaultImports) + ) + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c23adae7..d66e8fec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,9 @@ importers: eslint-plugin-devup: specifier: ^2.0.5 version: 2.0.5(@types/eslint@9.6.1)(@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + eslint-plugin-eslint-plugin: + specifier: ^7.0.0 + version: 7.0.0(eslint@9.36.0(jiti@2.6.0)) eslint-plugin-jsonc: specifier: ^2.20.1 version: 2.20.1(eslint@9.36.0(jiti@2.6.0)) @@ -658,28 +661,16 @@ importers: packages/eslint-plugin: dependencies: + '@typescript-eslint/utils': + specifier: ^8.44 + version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) typescript-eslint: specifier: ^8.44 version: 8.44.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) devDependencies: - '@types/eslint': - specifier: ^9.6 - version: 9.6.1 - '@types/eslint__js': - specifier: ^9.14 - version: 9.14.0 '@typescript-eslint/rule-tester': specifier: ^8.44 version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': - specifier: ^8.44 - version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@vitest/coverage-v8': - specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) - eslint-plugin-eslint-plugin: - specifier: ^7.0.0 - version: 7.0.0(eslint@9.36.0(jiti@2.6.0)) typescript: specifier: ^5.9.2 version: 5.9.2 @@ -689,9 +680,6 @@ importers: vite-plugin-dts: specifier: ^4.5.4 version: 4.5.4(@types/node@24.5.2)(rollup@4.51.0)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1)) - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(happy-dom@19.0.1)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(yaml@2.8.1) packages/next-plugin: dependencies: @@ -3006,10 +2994,6 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/eslint__js@9.14.0': - resolution: {integrity: sha512-s0jepCjOJWB/GKcuba4jISaVpBudw3ClXJ3fUK4tugChUMQsp6kSwuA8Dcx6wFd/JsJqcY8n4rEpa5RTHs5ypA==} - deprecated: This is a stub types definition. @eslint/js provides its own type definitions, so you do not need this installed. - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -9966,10 +9950,6 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/eslint__js@9.14.0': - dependencies: - '@eslint/js': 9.36.0 - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 diff --git a/tsconfig.json b/tsconfig.json index 2c8f4962..f10ecddb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,4 +21,4 @@ "noEmit": true, "baseUrl": "." } -} \ No newline at end of file +} From ab42cd1de934d1e0e2b21f2fe0d2a96212d64125 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 00:05:30 +0900 Subject: [PATCH 3/9] Implement eslint rules --- apps/next/src/app/page.tsx | 2 +- .../next-devup-ui-single/src/app/page.tsx | 2 +- benchmark/next-devup-ui/src/app/page.tsx | 2 +- eslint.config.mjs | 8 +++++-- package.json | 1 + .../eslint-plugin/src/__tests__/index.test.ts | 5 ++++ packages/eslint-plugin/src/index.ts | 4 ++++ .../__tests__/index.test.ts | 19 ++++++++++++++- .../src/rules/css-utils-literal-only/index.ts | 24 ++++++++++++++++--- .../__tests__/index.test.ts | 8 +++++++ .../src/rules/no-duplicate-value/index.ts | 3 ++- pnpm-lock.yaml | 3 +++ 12 files changed, 71 insertions(+), 10 deletions(-) diff --git a/apps/next/src/app/page.tsx b/apps/next/src/app/page.tsx index d9519efc..b667af0f 100644 --- a/apps/next/src/app/page.tsx +++ b/apps/next/src/app/page.tsx @@ -43,7 +43,7 @@ export default function HomePage() { text typo text - + hello hello diff --git a/benchmark/next-devup-ui-single/src/app/page.tsx b/benchmark/next-devup-ui-single/src/app/page.tsx index ab9216cc..310fa7e7 100644 --- a/benchmark/next-devup-ui-single/src/app/page.tsx +++ b/benchmark/next-devup-ui-single/src/app/page.tsx @@ -34,7 +34,7 @@ export default function HomePage() { hello text - + hello hello diff --git a/benchmark/next-devup-ui/src/app/page.tsx b/benchmark/next-devup-ui/src/app/page.tsx index ab9216cc..310fa7e7 100644 --- a/benchmark/next-devup-ui/src/app/page.tsx +++ b/benchmark/next-devup-ui/src/app/page.tsx @@ -34,7 +34,7 @@ export default function HomePage() { hello text - + hello hello diff --git a/eslint.config.mjs b/eslint.config.mjs index 73066a39..92a0b094 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,13 +1,13 @@ +import devupUIEslintPlugin from '@devup-ui/eslint-plugin' import { configs } from 'eslint-plugin-devup' import eslintPlugin from 'eslint-plugin-eslint-plugin' import jsonc from 'eslint-plugin-jsonc' import * as mdx from 'eslint-plugin-mdx' import globals from 'globals' - export default [ { ignores: [ - 'coverage', + '**/coverage', 'target', 'benchmark/next-panda-css/styled-system', 'bindings/devup-ui-wasm/pkg', @@ -75,4 +75,8 @@ export default [ ...eslintPlugin.configs.recommended, // files: ['packages/eslint-plugin/**/*.{js,jsx,ts,tsx}'], }, + { + ignores: ['**/*.md'], + }, + ...devupUIEslintPlugin.configs.recommended, ] diff --git a/package.json b/package.json index 3f133b4b..5a045dc3 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "devDependencies": { "@changesets/cli": "^2.29.7", "@devup-ui/vite-plugin": "workspace:*", + "@devup-ui/eslint-plugin": "workspace:*", "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "14.6.1", diff --git a/packages/eslint-plugin/src/__tests__/index.test.ts b/packages/eslint-plugin/src/__tests__/index.test.ts index e163ea00..d5aa2587 100644 --- a/packages/eslint-plugin/src/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/__tests__/index.test.ts @@ -6,6 +6,11 @@ describe('export index', () => { configs: { recommended: expect.any(Object), }, + default: { + configs: { + recommended: expect.any(Object), + }, + }, }) }) }) diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 5ce6fd5a..6342f5ac 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -4,3 +4,7 @@ export * as rules from './rules' export const configs = { recommended, } + +export default { + configs, +} diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts index 0ffe2c38..bd4fc429 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts @@ -2,7 +2,7 @@ import { RuleTester } from '@typescript-eslint/rule-tester' import { cssUtilsLiteralOnly } from '../index' -describe.each(['css', 'globalCss', 'keyframes'])( +describe.each(['css' /* 'globalCss', 'keyframes'*/])( 'css-utils-literal-only rule', (code) => { const ruleTester = new RuleTester({ @@ -41,6 +41,14 @@ describe.each(['css', 'globalCss', 'keyframes'])( code: `import { ${code} as B } from "@devup-ui/react";\nB({w: ["1"]})`, filename: 'src/app/page.tsx', }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({_hover: {w: ["1"]}})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({ w: v ? 1 : null})`, + filename: 'src/app/page.tsx', + }, ], invalid: [ { @@ -79,6 +87,15 @@ describe.each(['css', 'globalCss', 'keyframes'])( }, ], }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({w: v ? 1 : v})`, + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'cssUtilsLiteralOnly', + }, + ], + }, ], }) }, diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts index dd6251f8..dcc5e49c 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts @@ -51,11 +51,29 @@ export const cssUtilsLiteralOnly = createRule({ Identifier(node) { if (!devupContext) return - const an = context.sourceCode.getAncestors(node) - const property = an.find( + const ancestors = context.sourceCode.getAncestors(devupContext) + const an = context.sourceCode.getAncestors(node).slice(ancestors.length) + const properties = an.filter( (ancestor) => ancestor.type === AST_NODE_TYPES.Property, ) - if (!property || [...an, node].indexOf(property.value) === -1) return + if ( + !properties.length || + properties.some( + (property) => [...an, node].indexOf(property.key) !== -1, + ) + ) + return + const conditionals = an.filter( + (ancestor) => ancestor.type === AST_NODE_TYPES.ConditionalExpression, + ) + if ( + conditionals.length && + conditionals.some( + (conditional) => [...an, node].indexOf(conditional.test) !== -1, + ) + ) { + return + } context.report({ node, diff --git a/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts index ab2b05cc..b16070cd 100644 --- a/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts @@ -27,6 +27,14 @@ describe('no-duplicate-value rule', () => { code: 'import { Box } from "other-package";\n', filename: 'src/app/page.tsx', }, + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, { code: 'import { css } from "other-package";\ncss()', filename: 'src/app/page.tsx', diff --git a/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts b/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts index b5461fec..0875d444 100644 --- a/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts +++ b/packages/eslint-plugin/src/rules/no-duplicate-value/index.ts @@ -23,7 +23,8 @@ function checkDuplicateValue>( const prevElement = node.elements[i - 1] if ( prevElement?.type === AST_NODE_TYPES.Literal && - element.value === prevElement.value + element.value === prevElement.value && + element.value !== null ) { context.report({ node, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d66e8fec..9ca913e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@changesets/cli': specifier: ^2.29.7 version: 2.29.7(@types/node@24.5.2) + '@devup-ui/eslint-plugin': + specifier: workspace:* + version: link:packages/eslint-plugin '@devup-ui/vite-plugin': specifier: workspace:* version: link:packages/vite-plugin From e4932508e2ef4f975f3ddb6250059a5bf0d99bc2 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 00:49:50 +0900 Subject: [PATCH 4/9] Implement eslint rules --- devup-ui-eslint-plugin-0.1.3.tgz | Bin 0 -> 10475 bytes .../__tests__/index.test.ts | 21 +++++++++ .../src/rules/css-utils-literal-only/index.ts | 43 ++++++++---------- .../__tests__/index.test.ts | 28 ++++++++++-- .../src/rules/no-useless-responsive/index.ts | 27 ++++++++++- 5 files changed, 92 insertions(+), 27 deletions(-) create mode 100644 devup-ui-eslint-plugin-0.1.3.tgz diff --git a/devup-ui-eslint-plugin-0.1.3.tgz b/devup-ui-eslint-plugin-0.1.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..42d15d32554439ea3d2e373fa3b4f0e3a9c0732f GIT binary patch literal 10475 zcmV3x2*uA!U zGP!-c8JdD5q$xrHK-*eJ|NEXQfF$^mWVfxJ$qFC3EfPfGRfS(wp@4}WeDsHOtIwp` ziWLjx78_5vP@7V5;SXsm_(lHV(^9+LKG@qM@PE7AF8<%%-83MA)|hK6s!}Jf_0G32En5+YNX$V8b~5eJ7Yo{=W6Yn0C~x z* zl#V+L`HdeQ!SD1>$NfmB1L2RU>^SM4j(f=OJI*1$cih8RDIRqk{lDX0(RJ`+EnPbhen4Oj!1<-z(=BD>9k5e+^b@kr5obv2z(7)vt}bnZy}_3|I*6B@B- zcoNbvjZ_Eb02075k74NFpC0k?ghw<|4XSI_6ja3`a*ob_cz1qwa(3mIx>l1p^26}t zej=!pj7QZp-YXV1vXb9loxV*9oy{sTKIn{uwgNv4DXpCzr+peJ?DN;J)6CEc5O#K7 z{`T9#vVNfB8!ED2Cr z|B)wB*Nt-usOrK6eODk`*L}r)t7!VnEGdZy(rBp1yBnW-$$r)}vGE^^`t<%80AC?3 zz<=$%o&5s-+ueP$x5j^~NICphg{>HsDY|<2`DZFMj_Md#^{PE{Ka^3|b*BisQryKe z+|}CBP*H9P8u0O$Mt$0c`R6oUWoHv{NM$xXou*5B57svw4wZ)Gc;-gE2UBW?&bkQ~ zV+lQ#{x(^9G<{+U=taLX4xgWL{I9z?ka82@?`Ejs(k73>=_d$>1^mCW|K=di|2y05 zH*5WGC21l5KS{SzOX*gT#p124R;$+j;51#{Q>~NBw=7Zs>SXI84(XAgKIk^G_su^? zN=;;EYir2VD86Y0e7x1Cx0?fYOE-s1ZKaxt5|nO@eHLw*sV}#5wKgYVJY><96oFxc z|N9_k|7^NJk2f9w7@!td!5WThWXJgg)FavXaP5w%@;eVQ7}2q>e@h9(I-pKs6O1l$ z9);76b98x0uwWubJP!K=$|X0H#FF;O9aAG>C=%>)*>Yy6CwH8Q;5Q*1J8qu`vh&b4 zoek*uNyX0G0Q!|SWK(O9#P5MZ80C>rH>99LM{yW-H5z$eEi*`#O7t zh61`JqI|$=z8J=!f5=uyqoEr0dcE!3^AGLo1Rts*KGZYZhLjD_gPJ%6#e?26u;r&C+yr|gT{wetHoS;-9njuK4^rkk9696)$46; zC$+XT)lykUJnAzTMBnbR>Vg%OYWb3jkiVwT1g}4$%K71~E>ML6@+_@-ntl=Sc{ z>o*?&e*ySay>?gqDQr<~4^QxDSAF$Wf}CkDd;LLOciEuPpglyA-`;Z8C+&{0y7zj$ zxW-$7AXD{vy>>I;kz!FyQ%q?Wzqx(gZLoalY+>mDof8KR(|@IpUg^SKzxMO+C$!;D zKPTTDx9@}IqbG(bXXXyreIrWE#t{@3`T+$eScAF_P;r_wL`{j6C`gp9vOId6!j-RJ z$4LdU)_KT)$5FpS9(0{&vkKK}!0yq3=>)t_D>bb%PWt(BZB;7Ft5Tvul~VuWs#IzI zRH#yFzAB}RDy0%ts^n9eTkXt)l#wcXrRu49Lip2s7pd2;WrMn50j-zT@!y-(KTFl? z|2$0fcp8iLf3)}aOZLB=_ImwaMS7X_f4RLC{1NMa*b}wuzk0FtU**<+zoFd7m3loc zF8i-~z3sfkhxW2eAKKTJ-G+hPCQ9r!Y_8wE*47fGh6^^|$WrAb&58m!>$8Z8PIczg zZnW&SfTjHU)tQP*Nxo z5ds%p0bJx_;1WF!xJ1tiTo%r<*RLCLK5&r+O31murMB8R;35|SmlCxK;38kY_F;?9 zVv}-x7MYrqT~z`=W#h!Zgt>B^o;l6Oe>Fz3N77hi|2Zhxf40~Ae^-=V2LG{VxBvJ( z_Sx+}aU*o2=0jrpN$fzjk;h2X&FwDzrq}M$&CO&1mA0*hYEzKR8*5~0tYNjr8krhv zaB)yyebuF*q(r-^)T>^v{rYt@$6OPaZN(Y@*}M7#;))AD8q&sxQtQ4^-&$=cHy$ie zEdd{Y*uL(BHV8J4+t=>g60Gm9Eu1y%`4u=TC#0SPwd~I5I9EddBv{~!0WM`zsWcWv zpJFWfteC4be_zU2v>fJo9%B(kKy=mX*TA^6HSqez_kYsds=wTp!-9*rwS=d#;QDPXXWVp} zZan|1TEDT&dLJG%hLD|yEEdM;JYXT6hx$dU6IV07Test^Q|X9yt9&J$vOU|aF;jHH zD$Q>;o4H8~vIw90wm4J>E*#g&T-S<8*s_l|o z2q->DgFx|@UL1%bvnJ^f2n8iQqBK3fNDpE{NfH!FUiC;47D~P)lzc@ThjeuA?uMSc zr!%R&cLbSJq zBmt*}mQKdcP>eRUau8AoJ5E@F0mTgtJb-HINwqh*WTX3@ySt7PjuBo#P4X&|aA*`)A6BVp1pBvY#({iaI{`a}Ve;4lm-)$H1|L)Gt z_8R}MA{o5Q4Kl8d$o&P7vB~*IV0W2jw?jsL$pADp0NRexC46J%5|uz}6QfH|Tv+mi z0s-?Dkd%VoMu~^t60tmxUCWtIPmhiNeTn^ld%MN>-}akz{LgAqsxMp4Rba5lt>_Z8TjnCOr}~KpLU9k<vKhp}$CSK5>pJ#(vRd~jJ?jxMa_a`!)UL~9Nruw-Yl2%zXM&?#(zJf7Pv_NJJ>%c#((d= zS?hl*Nhw;Z-~g@Z%`(++zG7fwzoN%E?|+#S<6SJKxn^YH9 z<>|)~E#V<+ga^ngfjGM8dfy;~=@+G@!MjQBon6zHkw=e-|9+}SSfu~$w%-)>zxKh} z|GSb@r~ip6{V)DB{crLF{ZEwizwjmXzYz4l?nb)hmp4L}_!@~Kbj975q(|CaqR5{} zIr^JG_;*hK0b5u;3_SI6HUNwxoG0HBy@e25*#`asPLICa>dCio&J zWMcLuFEj*H1+!Ob`eC)EKe07^^*h$|<7!P`Jz3LNmZq<2HT|ls(95+pb3D(jX#Gy< zN7uEykvdnz>(_(>ONLA7YJ)0B^}j<=d!h8m`2QzCz(x4)V0X8O{|@%o_WzZnI{e40 z@ZVB9=<4xb_(=Q*yYTpDu>V{54?_OI7b3OPLg-b5d|Cw)wgld(J1E@8`$W!1p}&jc&W zX9|$z4i$J2a9MTcz%rhs$l%NHxjad8g5(~BFDt{)o&jH$`C}!Xqy_kLPHPMJvaX^_ z;mhUfIu~C`)JpBWx;an6a~+>x7n%OOyz`;L6u2@>`}p|($3wt{`#;{4;{SK{*7rZG zBt6Rh$36}J`H#eZ@#nYyjluqBtV)^b&o&0;t$T@N-z3{zLdiF1D1=i0a_gAPo9C!) z5tLQNIcXW^m~EVsmT?Z{qmemqE&%=shXa^rDQcSGt~!8+Z73tE!bf2(KFXgQkRl{n zLP&*U1X96R?yYZ#BHxmECjyX7qK%m8xd5a?YEBlYAXHhPRhaqYx(2Lq(j##VSSy@9 z@Vs~}cQ652{$zp|MQw$H3zjhqCcw>qF2mrzI&fqEl7_+Mf!pUc4C=EM@^-?8hLg#` z3-jdUD;$EV2#N9X#zwwkSL|m=3(tRehJ7H5&VSf%m+pUU@2<~(SV>y6|AX3?ZK?g? zi?)Hta*3a|8zihO@KZO1@VTYd?hQ%8Pg7Rmp;_I5G;YkPhE&uS7(Xa}?!nD`lQm%naQzXRw7@5cJXAbe&HaY@Cb z)3PL{Ie7rSY2^bLGj=y;`IPbi)x7573|L5klGaqQijW0$G&t4aj*GtaUN<$%;m2yk z1vZY}4ie+N16IUHVg*hwkCINC0Jw?*My;lmOe*lrfBi>mZ_hNR-s+NOOdHdux5t%K zD#`%Ky$L=eDoP}?-1ut0^>u3}d3Vbcw(Gy%w6&5D;WU(hfj%qs4@TNX28#! z7N7sqZzo0ApV6l zPoH&9z0=8&J3NF6*Aswe-BXVp?%MU#Uv*EtpK>jOM*n))J@Vdveds)o5f=$TmLcby&^|Nj)>u$cebMgQ-c_5FXVNuSF9*~-7f zP8um4|#04{&A1;zN#^Tvm+{LbSiU+X+;&R;gw#(zE|3RuYh+eQ4p zzk9IW|GSd(4E&!l|B_rDcwSK8=%f21{Wt^U_;_L-PY(gKr;l&Vf6i&HpP%FTnq`ljpfaz}`_6{^#F$d&g`1|H$U~N7sr2DD?ru! znd=s)vfiJ2V7(t7uFdzWND2R6oOs7SoV3RM7of3-|J$YWzu^FYHUF<7Ew}&U(`YQ- z|FKit|GoESjsI4X(v8qpmnWB3f~NbuzpUGA_GP*mwvTZ)l;~T8^5K4F=d)n9aE6e% z#-dyCP{+xbD}}0KdUQluQo&X!G^p9Z2#`VkoRBe1Gw__w4(z>{PS=<9P}< zY2o=V#rwavF(i1+|0_r-|3jFqzN^#4zuz*cXhg+Ad9bCV`JG9IKc;syn2${eMTP9p zC;cUtK_oZjShq%G;Si-b3Z1@8w=I8Jd{q-wVSQVtuYTFFdgM>lv9A!nN#f{Z#P6bf zr+rgA_SjIX_Kp{5Rh?=41X^WFe1T5!^t~sMC>#5#d(J*p(9zD{&H~y z%9qKC(5?HjcElEZSK0fEzp3ob;%BDevk%u@h(F1*($C3xI9UL$&03_My+}Qak;QCQ zI}EupR?2Q<#Vkiw!*<1vd@+@e$k}A)Cd4dY4VO-TUHdeu{N6Osd zrr%pN^|%BJrj+^`~QmezrBO)_5Pogq*P%`^t77Q)l%(}oE2+nb*_q)bAHA= zC|EQ53#P~J|9c9J#rywC=l||*uj7AKlAd+_FCO<%zxdBrg4XN)%F+|||2>+D0Sm1YYbmgT^tAndkE5}e|4aM-_uj1a|COYd;s5-(l?x=m zJS*>72E1@uYX9FS(pYr<(?R+Cznyjb-)hn``+w*AqAI*gbG%CRo`jWokyhnBdSS28 zi+hX8URm>BX$+s{1$v72=doU&M|yj}qx0eVu|Az=-dX+WDUttgPmfN{E>B*B#(ep| zv%j}rl>gfYyX*abD@jFBkx$;l4@Q){)o0j!QR|NWyWT@ic3N$h{MCGfi=b9Qk2L#?+7C z%ygot7)#zR}@)co{422KZgbp#2>4J4hFAz!BWmi# zsMK`fYEr@B{!|SJ;75q{b)g}6dVSQVf`CZm5td`JkvpbFx)e>UMZV(#>oAGMgi9*3 z-b_bXkBno=aIg`Qz}-#wA-|)-C4DAnpr8UQ(to=|aT55k#MAS!4E+LIF38xA{2?B8 z4m4#Pj7+6mayO#b@SCZwxsN4hJ#xoj_P|vUj5YO`$Pt@BIRiFOQ!=3Suz=I7C)JXgsFD$d6dyYhF;ok0j*tlNp3hLi2M# ze4_gW3v=^r!x9SZ3;1}#fO9xj%(QO^ILwDExt3<)Dd3Tb?U7K5X3;V2Gav7S$lCiO z7avQEf5*i~tSkx|m|59$XHn7uGud^Inf8qRJ|+IG&qBCj!tl5ycwD?nCh8*`!@1)d z-cN*A#1#u@D!p_E(LT@x!J!l^8Q3*RO|gK69}#-*k0&98&nAN3GV>Ya^CoZ}D!V5) zG~{>9wE4#rw`Id=;?NV)DULZ1sBXMzIF_RupVaxrmoQ)vvRof1z(f~(tc4K}!a;&* ze>Y;mDCKzCXNn8pX+dup4j)X}h%3VogogeN7s)R!lA*QP28)7ai%J?PS6{z#H{v1A zf5HVDvd9lBhPf;LE-3M&4zU13!ECzAJ~8~6*QcZ zkVPM{!){oF69dA=n#nk`NKrBH1C;%4y5^-_S*j593gv@zpkb4LvR+pXa&f+=oS70! z`^|7xvNEQXfTD5(fit#m5QQ#>>n_1>xTvkSYcYTVX%5#vhFTuW_-4$Mkq-%cz{!Ml z#;TcVk7Q6lm+*leSX{p5E&(>$0C|hVVRGNlksl5SAJid`<<@QDr0sFAB)xK{@|F(> z4QZeRk67SB-{1HlPMkXdUquKZ;>h$lfhnJLHO)E*`bWu(FR<68J9l|8vdJ!=M^=5v z*xZK`GO46%FG4AtkyEMYSZ1=BNf}dE7Xn=I%zHiHu##!akzysgtKC#m&4Q{%}T{1Whh(V zQa>0Gt7iy^iJPegVYtNq#AD(EK$}n%`=Oq0cU*-1I|h&;;?X9KHrO-Z=VmbS#Sj!6 zKJ`O2-5dx?UBZN*w>$tDU09ioiU!0Iort;s<=|4DvLs97^d!CsSrATPT24ZL>Sj+S zROppc;u8Z9Z0#z8<*AfKfLo$gu`;9lz){(?M&+Fk^7P+&NE-A$pcA}`LaK!8uyRss zE=@Agt+a-0?0=*#8Tq#qL7J`%D!6lC`L4Zi_!!`E*yX@F3~+G(~FtS z+zr_ze#j$gmbieAZ&;L~aQvwFfo_UcKF!jpxB+PSiWvfTFaXKo)gq?@7;&SrNW~OP z-*g}p8*1|Y(1+J3!i+ZE$kreOhXt2%6T1l-5bzlAkN(Xf;*-$7lQC1!$dC@TZ1+`K z@nmr?NW6LCOPlSn($eU_Nhv`#Ak(Bl$ry|gVX6_;NGd%Gk;@N*e?!>XH|hBnP{+Tue&9iuF07P`Ga0 zhsJTkSwbZX5ix+f*uY$0^_w7((g8Pm8H}!Tc7Anwbm9;Qd&XV{{xSprB&S4dF0#11 zf+tEHii4CElxT%M5!COa0+`J)TG^X{xrsjOb0e{k`E?Vp^6oO-nHEyrt(D!0bIVsG zq&{2(8f8Xs^FhXwcpJRzBvtg2`ei+w^^7%%G#lfm&7y)($M1fqajD)a!U5flAQXx=m(j|dE7AzUsunNVM}$kj;e zNg$qzookISA^@%6rnWUdwA4zxu+FNAVIh=9)12WuT?+huAO04gmDuwyEhDM4>6vBb zysP_Mvc5G{P~!nZL%&a>emqW)W^RTgl0$1}$q?oR7Itf5PVmEOra@y7xiMaN5$9){ z?vNU1KxNNl@E@TjTEg{0UNAbP{SQT$2H3R)Qy2rJnZuPYpAm!bIPXaSP^h^OFl=W~|PfOwpveZesK?>Z7?K zO-}+reaRzSn{gClsrVS2xlj`pnM%m^6e08FAKLukS`$zT}~Um@ACi{7-zF_Wm> zfS+?fe)I)&$TXesX+3YITC+rD7_^{-*Ky=f$H**DZZ=GY!DUv@22>Pu_`L3D=LK_N zZa|x0RPrO@c$eh#(jkZ5<>{sF(;rW-{&N2Qiu~wZTzF?!rze->{K9r$pMOWZv!BS{ zPS1{ALYelN>g$PP>)#=gux84PL z_x|GD`Q?dTIkl%P1cQCDI|hyU=;+WYn>|1L$wcspV1T8up#u`5T@t5TCQL2cq&DwK z8IMt?&~lhb6xfmnEY)4LtTxU`w0qj#$+DJ-Q|&)m?w9%%`x75_$_W z6)K^Nh&Tz+w5Udui)m``Nc=$xb^uuld_;#K8`3DCO*eH6yE&VwvAryu+6}$pgSk9p zH;BftVneVF7-v92PJx47q8quI6|`u~tqNco(c=^{Bx*Et98G@=x6<3@aridznrHrV zIicW$PF=OE4`@_d=mCRh+bOuTOp%H31zVRND6j|%?Olcy*{r+ZV=XG6*oSc{MPmJg zMP>jknVBi@jk(U_q(;!-kn8z5z4>}{h*0b*>rK%0iG@zz_5hWQ0@0`8M+n+W>jHNysze83(sG^9 z7WoUm1ARrSd1*&sH(JGJEyEoiQJA_HQjl!?3}`Dgk3mRgA`&=nW$IB+SurX2Rg<6sjT)pJ z@i^=QB2VjJpuDvPr|wK(3OS9Gf1mmfQP0-ITjWPd{7~}jv>;=M*J>5y)DuNY#F<(( z%5DS3#n|{GZ)moM109RH77{*lCW4`97^JHM@;~n|G*`G8gCgQ92h8giRS(YF+v{B&{c4UeP&8Pbh~&F&W)iQ)jf zu9qWYoK9dji;Rkhaxa}h8A?gS4ZlG{m7lYeC6m@yW@aziPiZ#yZtk?&@WnEKx(-2@ ztyW)bShlS479TLi+Zn1M^C#lv1S_|`*tn!LM?RU*2uubnAfX=(V>p*`2$u>+#eHmO hx5(hNEVroj#lQDG@9VTq>$FbA^gk6%rRxCx000x1;o<-Q literal 0 HcmV?d00001 diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts index bd4fc429..7c0f46d2 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/__tests__/index.test.ts @@ -45,10 +45,22 @@ describe.each(['css' /* 'globalCss', 'keyframes'*/])( code: `import { ${code} as B } from "@devup-ui/react";\nB({_hover: {w: ["1"]}})`, filename: 'src/app/page.tsx', }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({ w: { a: 1, b: 2 }[v]})`, + filename: 'src/app/page.tsx', + }, { code: `import { ${code} as B } from "@devup-ui/react";\nB({ w: v ? 1 : null})`, filename: 'src/app/page.tsx', }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({ w: v ? 1 : undefined})`, + filename: 'src/app/page.tsx', + }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({ w: v || 1 ? 1 : null})`, + filename: 'src/app/page.tsx', + }, ], invalid: [ { @@ -96,6 +108,15 @@ describe.each(['css' /* 'globalCss', 'keyframes'*/])( }, ], }, + { + code: `import { ${code} as B } from "@devup-ui/react";\nB({w: v || 1 ? 1 : v})`, + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'cssUtilsLiteralOnly', + }, + ], + }, ], }) }, diff --git a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts index dcc5e49c..5f5dc228 100644 --- a/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts +++ b/packages/eslint-plugin/src/rules/css-utils-literal-only/index.ts @@ -49,30 +49,27 @@ export const cssUtilsLiteralOnly = createRule({ } }, Identifier(node) { - if (!devupContext) return + if (!devupContext || node.name === 'undefined') return - const ancestors = context.sourceCode.getAncestors(devupContext) - const an = context.sourceCode.getAncestors(node).slice(ancestors.length) - const properties = an.filter( - (ancestor) => ancestor.type === AST_NODE_TYPES.Property, - ) - if ( - !properties.length || - properties.some( - (property) => [...an, node].indexOf(property.key) !== -1, - ) - ) - return - const conditionals = an.filter( - (ancestor) => ancestor.type === AST_NODE_TYPES.ConditionalExpression, - ) - if ( - conditionals.length && - conditionals.some( - (conditional) => [...an, node].indexOf(conditional.test) !== -1, - ) - ) { - return + const an = context.sourceCode + .getAncestors(node) + .slice(context.sourceCode.getAncestors(devupContext).length) + + for (const ancestor of an) { + switch (ancestor.type) { + case AST_NODE_TYPES.Property: + if ([...an, node].indexOf(ancestor.key) !== -1) return + break + case AST_NODE_TYPES.ConditionalExpression: + if ([...an, node].indexOf(ancestor.test) !== -1) return + break + case AST_NODE_TYPES.MemberExpression: + if ([...an, node].indexOf(ancestor.property) !== -1) return + break + case AST_NODE_TYPES.CallExpression: + if ([...an, node].indexOf(ancestor.callee) !== -1) return + break + } } context.report({ diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts index 04184a57..62c5b85a 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts @@ -40,15 +40,23 @@ describe('no-useless-responsive rule', () => { filename: 'src/app/page.tsx', }, { - code: 'import { Box } from "other-package";\n', + code: 'import { Box } from "@devup-ui/react";\n', filename: 'src/app/page.tsx', }, { - code: 'import { Box } from "other-package";\n', + code: 'import { Box } from "@devup-ui/react";\n', filename: 'src/app/page.tsx', }, { - code: 'import { Box } from "other-package";\n', + code: 'import { Box } from "@devup-ui/react";\n', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "@devup-ui/react";\n {console.log([1])}} />', + filename: 'src/app/page.tsx', + }, + { + code: 'import { Box } from "@devup-ui/react";\n', filename: 'src/app/page.tsx', }, { @@ -139,6 +147,20 @@ describe('no-useless-responsive rule', () => { }, ], }, + { + code: 'import * as c from "@devup-ui/react";\nc.css({w: [1].length === 1 ? [1] : [2]})', + output: + 'import * as c from "@devup-ui/react";\nc.css({w: [1].length === 1 ? 1 : 2})', + filename: 'src/app/layout.tsx', + errors: [ + { + messageId: 'uselessResponsive', + }, + { + messageId: 'uselessResponsive', + }, + ], + }, ], }) }) diff --git a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts index a97598f5..4d7721f6 100644 --- a/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts +++ b/packages/eslint-plugin/src/rules/no-useless-responsive/index.ts @@ -14,11 +14,29 @@ const createRule = ESLintUtils.RuleCreator( function checkUselessResponsive>( node: TSESTree.ArrayExpression, + ancestors: TSESTree.Node[], context: T, ) { if (node.elements.length !== 1) return const element = node.elements[0]! + for (const ancestor of ancestors) { + switch (ancestor.type) { + case AST_NODE_TYPES.ConditionalExpression: + if (ancestors.indexOf(ancestor.test) !== -1) return + break + case AST_NODE_TYPES.JSXExpressionContainer: + case AST_NODE_TYPES.Property: + case AST_NODE_TYPES.JSXOpeningElement: + case AST_NODE_TYPES.CallExpression: + case AST_NODE_TYPES.ObjectExpression: + case AST_NODE_TYPES.JSXAttribute: + break + default: + return + } + } + context.report({ node, messageId: 'uselessResponsive', @@ -77,7 +95,14 @@ export const noUselessResponsive = createRule({ } }, ArrayExpression(node) { - if (devupContext) checkUselessResponsive(node, context) + if (devupContext) + checkUselessResponsive( + node, + context.sourceCode + .getAncestors(node) + .slice(context.sourceCode.getAncestors(devupContext).length), + context, + ) }, } }, From 68c0df727befb07b6c145aa8df049d558c3272ef Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 00:50:05 +0900 Subject: [PATCH 5/9] Implement eslint rules --- devup-ui-eslint-plugin-0.1.3.tgz | Bin 10475 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 devup-ui-eslint-plugin-0.1.3.tgz diff --git a/devup-ui-eslint-plugin-0.1.3.tgz b/devup-ui-eslint-plugin-0.1.3.tgz deleted file mode 100644 index 42d15d32554439ea3d2e373fa3b4f0e3a9c0732f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10475 zcmV3x2*uA!U zGP!-c8JdD5q$xrHK-*eJ|NEXQfF$^mWVfxJ$qFC3EfPfGRfS(wp@4}WeDsHOtIwp` ziWLjx78_5vP@7V5;SXsm_(lHV(^9+LKG@qM@PE7AF8<%%-83MA)|hK6s!}Jf_0G32En5+YNX$V8b~5eJ7Yo{=W6Yn0C~x z* zl#V+L`HdeQ!SD1>$NfmB1L2RU>^SM4j(f=OJI*1$cih8RDIRqk{lDX0(RJ`+EnPbhen4Oj!1<-z(=BD>9k5e+^b@kr5obv2z(7)vt}bnZy}_3|I*6B@B- zcoNbvjZ_Eb02075k74NFpC0k?ghw<|4XSI_6ja3`a*ob_cz1qwa(3mIx>l1p^26}t zej=!pj7QZp-YXV1vXb9loxV*9oy{sTKIn{uwgNv4DXpCzr+peJ?DN;J)6CEc5O#K7 z{`T9#vVNfB8!ED2Cr z|B)wB*Nt-usOrK6eODk`*L}r)t7!VnEGdZy(rBp1yBnW-$$r)}vGE^^`t<%80AC?3 zz<=$%o&5s-+ueP$x5j^~NICphg{>HsDY|<2`DZFMj_Md#^{PE{Ka^3|b*BisQryKe z+|}CBP*H9P8u0O$Mt$0c`R6oUWoHv{NM$xXou*5B57svw4wZ)Gc;-gE2UBW?&bkQ~ zV+lQ#{x(^9G<{+U=taLX4xgWL{I9z?ka82@?`Ejs(k73>=_d$>1^mCW|K=di|2y05 zH*5WGC21l5KS{SzOX*gT#p124R;$+j;51#{Q>~NBw=7Zs>SXI84(XAgKIk^G_su^? zN=;;EYir2VD86Y0e7x1Cx0?fYOE-s1ZKaxt5|nO@eHLw*sV}#5wKgYVJY><96oFxc z|N9_k|7^NJk2f9w7@!td!5WThWXJgg)FavXaP5w%@;eVQ7}2q>e@h9(I-pKs6O1l$ z9);76b98x0uwWubJP!K=$|X0H#FF;O9aAG>C=%>)*>Yy6CwH8Q;5Q*1J8qu`vh&b4 zoek*uNyX0G0Q!|SWK(O9#P5MZ80C>rH>99LM{yW-H5z$eEi*`#O7t zh61`JqI|$=z8J=!f5=uyqoEr0dcE!3^AGLo1Rts*KGZYZhLjD_gPJ%6#e?26u;r&C+yr|gT{wetHoS;-9njuK4^rkk9696)$46; zC$+XT)lykUJnAzTMBnbR>Vg%OYWb3jkiVwT1g}4$%K71~E>ML6@+_@-ntl=Sc{ z>o*?&e*ySay>?gqDQr<~4^QxDSAF$Wf}CkDd;LLOciEuPpglyA-`;Z8C+&{0y7zj$ zxW-$7AXD{vy>>I;kz!FyQ%q?Wzqx(gZLoalY+>mDof8KR(|@IpUg^SKzxMO+C$!;D zKPTTDx9@}IqbG(bXXXyreIrWE#t{@3`T+$eScAF_P;r_wL`{j6C`gp9vOId6!j-RJ z$4LdU)_KT)$5FpS9(0{&vkKK}!0yq3=>)t_D>bb%PWt(BZB;7Ft5Tvul~VuWs#IzI zRH#yFzAB}RDy0%ts^n9eTkXt)l#wcXrRu49Lip2s7pd2;WrMn50j-zT@!y-(KTFl? z|2$0fcp8iLf3)}aOZLB=_ImwaMS7X_f4RLC{1NMa*b}wuzk0FtU**<+zoFd7m3loc zF8i-~z3sfkhxW2eAKKTJ-G+hPCQ9r!Y_8wE*47fGh6^^|$WrAb&58m!>$8Z8PIczg zZnW&SfTjHU)tQP*Nxo z5ds%p0bJx_;1WF!xJ1tiTo%r<*RLCLK5&r+O31murMB8R;35|SmlCxK;38kY_F;?9 zVv}-x7MYrqT~z`=W#h!Zgt>B^o;l6Oe>Fz3N77hi|2Zhxf40~Ae^-=V2LG{VxBvJ( z_Sx+}aU*o2=0jrpN$fzjk;h2X&FwDzrq}M$&CO&1mA0*hYEzKR8*5~0tYNjr8krhv zaB)yyebuF*q(r-^)T>^v{rYt@$6OPaZN(Y@*}M7#;))AD8q&sxQtQ4^-&$=cHy$ie zEdd{Y*uL(BHV8J4+t=>g60Gm9Eu1y%`4u=TC#0SPwd~I5I9EddBv{~!0WM`zsWcWv zpJFWfteC4be_zU2v>fJo9%B(kKy=mX*TA^6HSqez_kYsds=wTp!-9*rwS=d#;QDPXXWVp} zZan|1TEDT&dLJG%hLD|yEEdM;JYXT6hx$dU6IV07Test^Q|X9yt9&J$vOU|aF;jHH zD$Q>;o4H8~vIw90wm4J>E*#g&T-S<8*s_l|o z2q->DgFx|@UL1%bvnJ^f2n8iQqBK3fNDpE{NfH!FUiC;47D~P)lzc@ThjeuA?uMSc zr!%R&cLbSJq zBmt*}mQKdcP>eRUau8AoJ5E@F0mTgtJb-HINwqh*WTX3@ySt7PjuBo#P4X&|aA*`)A6BVp1pBvY#({iaI{`a}Ve;4lm-)$H1|L)Gt z_8R}MA{o5Q4Kl8d$o&P7vB~*IV0W2jw?jsL$pADp0NRexC46J%5|uz}6QfH|Tv+mi z0s-?Dkd%VoMu~^t60tmxUCWtIPmhiNeTn^ld%MN>-}akz{LgAqsxMp4Rba5lt>_Z8TjnCOr}~KpLU9k<vKhp}$CSK5>pJ#(vRd~jJ?jxMa_a`!)UL~9Nruw-Yl2%zXM&?#(zJf7Pv_NJJ>%c#((d= zS?hl*Nhw;Z-~g@Z%`(++zG7fwzoN%E?|+#S<6SJKxn^YH9 z<>|)~E#V<+ga^ngfjGM8dfy;~=@+G@!MjQBon6zHkw=e-|9+}SSfu~$w%-)>zxKh} z|GSb@r~ip6{V)DB{crLF{ZEwizwjmXzYz4l?nb)hmp4L}_!@~Kbj975q(|CaqR5{} zIr^JG_;*hK0b5u;3_SI6HUNwxoG0HBy@e25*#`asPLICa>dCio&J zWMcLuFEj*H1+!Ob`eC)EKe07^^*h$|<7!P`Jz3LNmZq<2HT|ls(95+pb3D(jX#Gy< zN7uEykvdnz>(_(>ONLA7YJ)0B^}j<=d!h8m`2QzCz(x4)V0X8O{|@%o_WzZnI{e40 z@ZVB9=<4xb_(=Q*yYTpDu>V{54?_OI7b3OPLg-b5d|Cw)wgld(J1E@8`$W!1p}&jc&W zX9|$z4i$J2a9MTcz%rhs$l%NHxjad8g5(~BFDt{)o&jH$`C}!Xqy_kLPHPMJvaX^_ z;mhUfIu~C`)JpBWx;an6a~+>x7n%OOyz`;L6u2@>`}p|($3wt{`#;{4;{SK{*7rZG zBt6Rh$36}J`H#eZ@#nYyjluqBtV)^b&o&0;t$T@N-z3{zLdiF1D1=i0a_gAPo9C!) z5tLQNIcXW^m~EVsmT?Z{qmemqE&%=shXa^rDQcSGt~!8+Z73tE!bf2(KFXgQkRl{n zLP&*U1X96R?yYZ#BHxmECjyX7qK%m8xd5a?YEBlYAXHhPRhaqYx(2Lq(j##VSSy@9 z@Vs~}cQ652{$zp|MQw$H3zjhqCcw>qF2mrzI&fqEl7_+Mf!pUc4C=EM@^-?8hLg#` z3-jdUD;$EV2#N9X#zwwkSL|m=3(tRehJ7H5&VSf%m+pUU@2<~(SV>y6|AX3?ZK?g? zi?)Hta*3a|8zihO@KZO1@VTYd?hQ%8Pg7Rmp;_I5G;YkPhE&uS7(Xa}?!nD`lQm%naQzXRw7@5cJXAbe&HaY@Cb z)3PL{Ie7rSY2^bLGj=y;`IPbi)x7573|L5klGaqQijW0$G&t4aj*GtaUN<$%;m2yk z1vZY}4ie+N16IUHVg*hwkCINC0Jw?*My;lmOe*lrfBi>mZ_hNR-s+NOOdHdux5t%K zD#`%Ky$L=eDoP}?-1ut0^>u3}d3Vbcw(Gy%w6&5D;WU(hfj%qs4@TNX28#! z7N7sqZzo0ApV6l zPoH&9z0=8&J3NF6*Aswe-BXVp?%MU#Uv*EtpK>jOM*n))J@Vdveds)o5f=$TmLcby&^|Nj)>u$cebMgQ-c_5FXVNuSF9*~-7f zP8um4|#04{&A1;zN#^Tvm+{LbSiU+X+;&R;gw#(zE|3RuYh+eQ4p zzk9IW|GSd(4E&!l|B_rDcwSK8=%f21{Wt^U_;_L-PY(gKr;l&Vf6i&HpP%FTnq`ljpfaz}`_6{^#F$d&g`1|H$U~N7sr2DD?ru! znd=s)vfiJ2V7(t7uFdzWND2R6oOs7SoV3RM7of3-|J$YWzu^FYHUF<7Ew}&U(`YQ- z|FKit|GoESjsI4X(v8qpmnWB3f~NbuzpUGA_GP*mwvTZ)l;~T8^5K4F=d)n9aE6e% z#-dyCP{+xbD}}0KdUQluQo&X!G^p9Z2#`VkoRBe1Gw__w4(z>{PS=<9P}< zY2o=V#rwavF(i1+|0_r-|3jFqzN^#4zuz*cXhg+Ad9bCV`JG9IKc;syn2${eMTP9p zC;cUtK_oZjShq%G;Si-b3Z1@8w=I8Jd{q-wVSQVtuYTFFdgM>lv9A!nN#f{Z#P6bf zr+rgA_SjIX_Kp{5Rh?=41X^WFe1T5!^t~sMC>#5#d(J*p(9zD{&H~y z%9qKC(5?HjcElEZSK0fEzp3ob;%BDevk%u@h(F1*($C3xI9UL$&03_My+}Qak;QCQ zI}EupR?2Q<#Vkiw!*<1vd@+@e$k}A)Cd4dY4VO-TUHdeu{N6Osd zrr%pN^|%BJrj+^`~QmezrBO)_5Pogq*P%`^t77Q)l%(}oE2+nb*_q)bAHA= zC|EQ53#P~J|9c9J#rywC=l||*uj7AKlAd+_FCO<%zxdBrg4XN)%F+|||2>+D0Sm1YYbmgT^tAndkE5}e|4aM-_uj1a|COYd;s5-(l?x=m zJS*>72E1@uYX9FS(pYr<(?R+Cznyjb-)hn``+w*AqAI*gbG%CRo`jWokyhnBdSS28 zi+hX8URm>BX$+s{1$v72=doU&M|yj}qx0eVu|Az=-dX+WDUttgPmfN{E>B*B#(ep| zv%j}rl>gfYyX*abD@jFBkx$;l4@Q){)o0j!QR|NWyWT@ic3N$h{MCGfi=b9Qk2L#?+7C z%ygot7)#zR}@)co{422KZgbp#2>4J4hFAz!BWmi# zsMK`fYEr@B{!|SJ;75q{b)g}6dVSQVf`CZm5td`JkvpbFx)e>UMZV(#>oAGMgi9*3 z-b_bXkBno=aIg`Qz}-#wA-|)-C4DAnpr8UQ(to=|aT55k#MAS!4E+LIF38xA{2?B8 z4m4#Pj7+6mayO#b@SCZwxsN4hJ#xoj_P|vUj5YO`$Pt@BIRiFOQ!=3Suz=I7C)JXgsFD$d6dyYhF;ok0j*tlNp3hLi2M# ze4_gW3v=^r!x9SZ3;1}#fO9xj%(QO^ILwDExt3<)Dd3Tb?U7K5X3;V2Gav7S$lCiO z7avQEf5*i~tSkx|m|59$XHn7uGud^Inf8qRJ|+IG&qBCj!tl5ycwD?nCh8*`!@1)d z-cN*A#1#u@D!p_E(LT@x!J!l^8Q3*RO|gK69}#-*k0&98&nAN3GV>Ya^CoZ}D!V5) zG~{>9wE4#rw`Id=;?NV)DULZ1sBXMzIF_RupVaxrmoQ)vvRof1z(f~(tc4K}!a;&* ze>Y;mDCKzCXNn8pX+dup4j)X}h%3VogogeN7s)R!lA*QP28)7ai%J?PS6{z#H{v1A zf5HVDvd9lBhPf;LE-3M&4zU13!ECzAJ~8~6*QcZ zkVPM{!){oF69dA=n#nk`NKrBH1C;%4y5^-_S*j593gv@zpkb4LvR+pXa&f+=oS70! z`^|7xvNEQXfTD5(fit#m5QQ#>>n_1>xTvkSYcYTVX%5#vhFTuW_-4$Mkq-%cz{!Ml z#;TcVk7Q6lm+*leSX{p5E&(>$0C|hVVRGNlksl5SAJid`<<@QDr0sFAB)xK{@|F(> z4QZeRk67SB-{1HlPMkXdUquKZ;>h$lfhnJLHO)E*`bWu(FR<68J9l|8vdJ!=M^=5v z*xZK`GO46%FG4AtkyEMYSZ1=BNf}dE7Xn=I%zHiHu##!akzysgtKC#m&4Q{%}T{1Whh(V zQa>0Gt7iy^iJPegVYtNq#AD(EK$}n%`=Oq0cU*-1I|h&;;?X9KHrO-Z=VmbS#Sj!6 zKJ`O2-5dx?UBZN*w>$tDU09ioiU!0Iort;s<=|4DvLs97^d!CsSrATPT24ZL>Sj+S zROppc;u8Z9Z0#z8<*AfKfLo$gu`;9lz){(?M&+Fk^7P+&NE-A$pcA}`LaK!8uyRss zE=@Agt+a-0?0=*#8Tq#qL7J`%D!6lC`L4Zi_!!`E*yX@F3~+G(~FtS z+zr_ze#j$gmbieAZ&;L~aQvwFfo_UcKF!jpxB+PSiWvfTFaXKo)gq?@7;&SrNW~OP z-*g}p8*1|Y(1+J3!i+ZE$kreOhXt2%6T1l-5bzlAkN(Xf;*-$7lQC1!$dC@TZ1+`K z@nmr?NW6LCOPlSn($eU_Nhv`#Ak(Bl$ry|gVX6_;NGd%Gk;@N*e?!>XH|hBnP{+Tue&9iuF07P`Ga0 zhsJTkSwbZX5ix+f*uY$0^_w7((g8Pm8H}!Tc7Anwbm9;Qd&XV{{xSprB&S4dF0#11 zf+tEHii4CElxT%M5!COa0+`J)TG^X{xrsjOb0e{k`E?Vp^6oO-nHEyrt(D!0bIVsG zq&{2(8f8Xs^FhXwcpJRzBvtg2`ei+w^^7%%G#lfm&7y)($M1fqajD)a!U5flAQXx=m(j|dE7AzUsunNVM}$kj;e zNg$qzookISA^@%6rnWUdwA4zxu+FNAVIh=9)12WuT?+huAO04gmDuwyEhDM4>6vBb zysP_Mvc5G{P~!nZL%&a>emqW)W^RTgl0$1}$q?oR7Itf5PVmEOra@y7xiMaN5$9){ z?vNU1KxNNl@E@TjTEg{0UNAbP{SQT$2H3R)Qy2rJnZuPYpAm!bIPXaSP^h^OFl=W~|PfOwpveZesK?>Z7?K zO-}+reaRzSn{gClsrVS2xlj`pnM%m^6e08FAKLukS`$zT}~Um@ACi{7-zF_Wm> zfS+?fe)I)&$TXesX+3YITC+rD7_^{-*Ky=f$H**DZZ=GY!DUv@22>Pu_`L3D=LK_N zZa|x0RPrO@c$eh#(jkZ5<>{sF(;rW-{&N2Qiu~wZTzF?!rze->{K9r$pMOWZv!BS{ zPS1{ALYelN>g$PP>)#=gux84PL z_x|GD`Q?dTIkl%P1cQCDI|hyU=;+WYn>|1L$wcspV1T8up#u`5T@t5TCQL2cq&DwK z8IMt?&~lhb6xfmnEY)4LtTxU`w0qj#$+DJ-Q|&)m?w9%%`x75_$_W z6)K^Nh&Tz+w5Udui)m``Nc=$xb^uuld_;#K8`3DCO*eH6yE&VwvAryu+6}$pgSk9p zH;BftVneVF7-v92PJx47q8quI6|`u~tqNco(c=^{Bx*Et98G@=x6<3@aridznrHrV zIicW$PF=OE4`@_d=mCRh+bOuTOp%H31zVRND6j|%?Olcy*{r+ZV=XG6*oSc{MPmJg zMP>jknVBi@jk(U_q(;!-kn8z5z4>}{h*0b*>rK%0iG@zz_5hWQ0@0`8M+n+W>jHNysze83(sG^9 z7WoUm1ARrSd1*&sH(JGJEyEoiQJA_HQjl!?3}`Dgk3mRgA`&=nW$IB+SurX2Rg<6sjT)pJ z@i^=QB2VjJpuDvPr|wK(3OS9Gf1mmfQP0-ITjWPd{7~}jv>;=M*J>5y)DuNY#F<(( z%5DS3#n|{GZ)moM109RH77{*lCW4`97^JHM@;~n|G*`G8gCgQ92h8giRS(YF+v{B&{c4UeP&8Pbh~&F&W)iQ)jf zu9qWYoK9dji;Rkhaxa}h8A?gS4ZlG{m7lYeC6m@yW@aziPiZ#yZtk?&@WnEKx(-2@ ztyW)bShlS479TLi+Zn1M^C#lv1S_|`*tn!LM?RU*2uubnAfX=(V>p*`2$u>+#eHmO hx5(hNEVroj#lQDG@9VTq>$FbA^gk6%rRxCx000x1;o<-Q From cf019ae4b9f5b257f6f81f6daa5a49956ee80235 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 00:53:50 +0900 Subject: [PATCH 6/9] Implement eslint rules --- .husky/pre-commit | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index e9a388c2..3bf9ea3e 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -pnpm lint-staged \ No newline at end of file +pnpm lint \ No newline at end of file From aaf2f8fbbf2abaf0cbd77ceefc168f477317fd84 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 00:54:57 +0900 Subject: [PATCH 7/9] Implement eslint rules --- .husky/pre-commit | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 3bf9ea3e..3f656a07 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,2 @@ -pnpm lint \ No newline at end of file +pnpm lint +echo "lint done" \ No newline at end of file From 790f9c4acff90fd36d0f570aadf71c5e8c4cb37e Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 00:55:38 +0900 Subject: [PATCH 8/9] Implement eslint rules --- .husky/pre-commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 3f656a07..c3681927 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1,2 @@ pnpm lint -echo "lint done" \ No newline at end of file +pnpm test \ No newline at end of file From 13851c22508a131d5409d9682523d9af01d6f77c Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Wed, 1 Oct 2025 01:06:13 +0900 Subject: [PATCH 9/9] Implement eslint rules --- .husky/pre-commit | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index c3681927..e02c24e2 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,2 +1 @@ -pnpm lint -pnpm test \ No newline at end of file +pnpm lint-staged \ No newline at end of file