diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 76a04f73..00000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -dist -node_modules -.yarn -.history -build -lib diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 74614599..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,403 +0,0 @@ -const OFF = 0; -const WARNING = 1; -const ERROR = 2; - -// Prevent importing lodash, usually for browser bundle size reasons -const LodashImportPatterns = ["lodash", "lodash.**", "lodash/**"]; - -module.exports = { - root: true, - env: { - browser: true, - commonjs: true, - node: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: {}, - globals: { - JSX: true, - }, - extends: [ - "eslint:recommended", - "plugin:react-hooks/recommended", - "airbnb", - "plugin:@typescript-eslint/recommended", - // 'plugin:@typescript-eslint/recommended-requiring-type-checking', - // 'plugin:@typescript-eslint/strict', - "plugin:regexp/recommended", - "prettier", - "plugin:@docusaurus/all", - ], - settings: { - "import/resolver": { - node: { - extensions: [".js", ".jsx", ".ts", ".tsx"], - }, - }, - }, - reportUnusedDisableDirectives: true, - plugins: ["react-hooks", "@typescript-eslint", "regexp", "@docusaurus"], - rules: { - "react/jsx-uses-react": OFF, // JSX runtime: automatic - "react/react-in-jsx-scope": OFF, // JSX runtime: automatic - "array-callback-return": WARNING, - camelcase: WARNING, - "class-methods-use-this": OFF, // It's a way of allowing private variables. - curly: [WARNING, "all"], - "global-require": WARNING, - "lines-between-class-members": OFF, - "max-classes-per-file": OFF, - "max-len": [ - WARNING, - { - code: Infinity, // Code width is already enforced by Prettier - tabWidth: 2, - comments: 80, - ignoreUrls: true, - ignorePattern: "(eslint-disable|@)", - }, - ], - "arrow-body-style": OFF, - "no-await-in-loop": OFF, - "no-case-declarations": WARNING, - "no-console": OFF, - "no-constant-binary-expression": ERROR, - "no-continue": OFF, - "no-control-regex": WARNING, - "no-else-return": OFF, - "no-empty": [WARNING, { allowEmptyCatch: true }], - "no-lonely-if": WARNING, - "no-nested-ternary": WARNING, - "no-param-reassign": [WARNING, { props: false }], - "no-prototype-builtins": WARNING, - "no-restricted-exports": OFF, - "no-restricted-properties": [ - ERROR, - .../** @type {[string, string][]} */ ([ - // TODO: TS doesn't make Boolean a narrowing function yet, - // so filter(Boolean) is problematic type-wise - // ['compact', 'Array#filter(Boolean)'], - ["concat", "Array#concat"], - ["drop", "Array#slice(n)"], - ["dropRight", "Array#slice(0, -n)"], - ["fill", "Array#fill"], - ["filter", "Array#filter"], - ["find", "Array#find"], - ["findIndex", "Array#findIndex"], - ["first", "foo[0]"], - ["flatten", "Array#flat"], - ["flattenDeep", "Array#flat(Infinity)"], - ["flatMap", "Array#flatMap"], - ["fromPairs", "Object.fromEntries"], - ["head", "foo[0]"], - ["indexOf", "Array#indexOf"], - ["initial", "Array#slice(0, -1)"], - ["join", "Array#join"], - // Unfortunately there's no great alternative to _.last yet - // Candidates: foo.slice(-1)[0]; foo[foo.length - 1] - // Array#at is ES2022; could replace _.nth as well - // ['last'], - ["map", "Array#map"], - ["reduce", "Array#reduce"], - ["reverse", "Array#reverse"], - ["slice", "Array#slice"], - ["take", "Array#slice(0, n)"], - ["takeRight", "Array#slice(-n)"], - ["tail", "Array#slice(1)"], - ]).map(([property, alternative]) => ({ - object: "_", - property, - message: `Use ${alternative} instead.`, - })), - ...[ - "readdirSync", - "readFileSync", - "statSync", - "lstatSync", - "existsSync", - "pathExistsSync", - "realpathSync", - "mkdirSync", - "mkdirpSync", - "mkdirsSync", - "writeFileSync", - "writeJsonSync", - "outputFileSync", - "outputJsonSync", - "moveSync", - "copySync", - "copyFileSync", - "ensureFileSync", - "ensureDirSync", - "ensureLinkSync", - "ensureSymlinkSync", - "unlinkSync", - "removeSync", - "emptyDirSync", - ].map((property) => ({ - object: "fs", - property, - message: "Do not use sync fs methods.", - })), - ], - "no-restricted-syntax": [ - WARNING, - // Copied from airbnb, removed for...of statement, added export all - { - selector: "ForInStatement", - message: - "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.", - }, - { - selector: "LabeledStatement", - message: - "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.", - }, - { - selector: "WithStatement", - message: - "`with` is disallowed in strict mode because it makes code impossible to predict and optimize.", - }, - { - selector: "ExportAllDeclaration", - message: - "Export all does't work well if imported in ESM due to how they are transpiled, and they can also lead to unexpected exposure of internal methods.", - }, - // TODO make an internal plugin to ensure this - // { - // selector: - // @ 'ExportDefaultDeclaration > Identifier, ExportNamedDeclaration[source=null] > ExportSpecifier', - // message: 'Export in one statement' - // }, - ...["path", "fs-extra", "webpack", "lodash"].map((m) => ({ - selector: `ImportDeclaration[importKind=value]:has(Literal[value=${m}]) > ImportSpecifier[importKind=value]`, - message: - "Default-import this, both for readability and interoperability with ESM", - })), - ], - "no-template-curly-in-string": WARNING, - "no-unused-expressions": [ - WARNING, - { allowTaggedTemplates: true, allowShortCircuit: true }, - ], - "no-useless-escape": WARNING, - "no-void": [ERROR, { allowAsStatement: true }], - "prefer-destructuring": WARNING, - "prefer-named-capture-group": WARNING, - "prefer-template": WARNING, - yoda: WARNING, - - "import/extensions": OFF, - // This rule doesn't yet support resolving .js imports when the actual file - // is .ts. Plus it's not all that useful when our code is fully TS-covered. - "import/no-unresolved": [ - OFF, - { - // Ignore certain webpack aliases because they can't be resolved - ignore: [ - "^@theme", - "^@docusaurus", - "^@generated", - "^@site", - "^@testing-utils", - ], - }, - ], - "import/order": [ - WARNING, - { - groups: [ - "builtin", - "external", - "internal", - ["parent", "sibling", "index"], - "type", - ], - "newlines-between": "always", - pathGroups: [ - // always put css import to the last, ref: - // https://github.com/import-js/eslint-plugin-import/issues/1239 - { - pattern: "*.+(css|sass|less|scss|pcss|styl)", - group: "unknown", - patternOptions: { matchBase: true }, - position: "after", - }, - { pattern: "react", group: "builtin", position: "before" }, - { pattern: "react-dom", group: "builtin", position: "before" }, - { pattern: "react-dom/**", group: "builtin", position: "before" }, - { pattern: "stream", group: "builtin", position: "before" }, - { pattern: "fs-extra", group: "builtin" }, - { pattern: "lodash", group: "external", position: "before" }, - { pattern: "clsx", group: "external", position: "before" }, - // 'Bit weird to not use the `import/internal-regex` option, but this - // way, we can make `import type { Props } from "@theme/*"` appear - // before `import styles from "styles.module.css"`, which is what we - // always did. This should be removable once we stop using ambient - // module declarations for theme aliases. - { pattern: "@theme/**", group: "internal" }, - { pattern: "@site/**", group: "internal" }, - { pattern: "@theme-init/**", group: "internal" }, - { pattern: "@theme-original/**", group: "internal" }, - { pattern: "@/components/**", group: "internal" }, - { pattern: "@/libs/**", group: "internal" }, - { pattern: "@/types/**", group: "type" }, - ], - pathGroupsExcludedImportTypes: [], - // example: let `import './nprogress.css';` after importing others - // in `packages/docusaurus-theme-classic/src/nprogress.ts` - // see more: https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md#warnonunassignedimports-truefalse - warnOnUnassignedImports: true, - }, - ], - "import/prefer-default-export": OFF, - - "jsx-a11y/click-events-have-key-events": WARNING, - "jsx-a11y/no-noninteractive-element-interactions": WARNING, - "jsx-a11y/html-has-lang": OFF, - - "react-hooks/rules-of-hooks": ERROR, - "react-hooks/exhaustive-deps": ERROR, - - // Sometimes we do need the props as a whole, e.g. when spreading - "react/destructuring-assignment": OFF, - "react/function-component-definition": [ - WARNING, - { - namedComponents: "function-declaration", - unnamedComponents: "arrow-function", - }, - ], - "react/jsx-filename-extension": OFF, - "react/jsx-key": [ERROR, { checkFragmentShorthand: true }], - "react/jsx-no-useless-fragment": [ERROR, { allowExpressions: true }], - "react/jsx-props-no-spreading": OFF, - "react/no-array-index-key": OFF, // We build a static site, and nearly all components don't change. - "react/no-unstable-nested-components": [WARNING, { allowAsProps: true }], - "react/prefer-stateless-function": WARNING, - "react/prop-types": OFF, - "react/require-default-props": [ - ERROR, - { ignoreFunctionalComponents: true }, - ], - - "@typescript-eslint/consistent-type-definitions": OFF, - "@typescript-eslint/require-await": OFF, - - "@typescript-eslint/ban-ts-comment": [ - ERROR, - { "ts-expect-error": "allow-with-description" }, - ], - "@typescript-eslint/consistent-indexed-object-style": OFF, - "@typescript-eslint/consistent-type-imports": [ - WARNING, - { disallowTypeAnnotations: false }, - ], - "@typescript-eslint/explicit-module-boundary-types": WARNING, - "@typescript-eslint/method-signature-style": ERROR, - "@typescript-eslint/no-empty-function": OFF, - "@typescript-eslint/no-empty-interface": [ - ERROR, - { - allowSingleExtends: true, - }, - ], - "@typescript-eslint/no-inferrable-types": OFF, - "@typescript-eslint/no-namespace": [WARNING, { allowDeclarations: true }], - "no-use-before-define": OFF, - "@typescript-eslint/no-use-before-define": [ - ERROR, - { functions: false, classes: false, variables: true }, - ], - "@typescript-eslint/no-non-null-assertion": OFF, - "no-redeclare": OFF, - "@typescript-eslint/no-redeclare": ERROR, - "no-shadow": OFF, - "@typescript-eslint/no-shadow": ERROR, - "no-unused-vars": OFF, - // We don't provide any escape hatches for this rule. Rest siblings and - // function placeholder params are always ignored, and any other unused - // locals must be justified with a disable comment. - "@typescript-eslint/no-unused-vars": [ERROR, { ignoreRestSiblings: true }], - "@typescript-eslint/prefer-optional-chain": ERROR, - "@docusaurus/no-html-links": ERROR, - "@docusaurus/prefer-docusaurus-heading": ERROR, - "@docusaurus/no-untranslated-text": [ - WARNING, - { - ignoredStrings: [ - "·", - "-", - "—", - "×", - "​", // zwj: ​ - "@", - "WebContainers", - "Twitter", - "GitHub", - "Dev.to", - "1.x", - ], - }, - ], - }, - overrides: [ - { - files: ["packages/*/src/theme/**/*.{js,ts,tsx}"], - excludedFiles: "*.test.{js,ts,tsx}", - rules: { - "no-restricted-imports": [ - "error", - { - patterns: LodashImportPatterns.concat( - // Prevents relative imports between React theme components - [ - "../**", - "./**", - // Allows relative styles module import with consistent filename - "!./styles.module.css", - // Allows relative tailwind css import with consistent filename - "!./styles.css", - ] - ), - }, - ], - }, - }, - { - files: ["packages/*/src/theme/**/*.{js,ts,tsx}"], - rules: { - "import/no-named-export": ERROR, - }, - }, - { - files: ["*.d.ts"], - rules: { - "import/no-duplicates": OFF, - }, - }, - { - files: ["*.{ts,tsx}"], - rules: { - "no-undef": OFF, - "import/no-import-module-exports": OFF, - }, - }, - { - files: ["*.{js,mjs,cjs}"], - rules: { - // Make JS code directly runnable in Node. - "@typescript-eslint/no-var-requires": OFF, - "@typescript-eslint/explicit-module-boundary-types": OFF, - }, - }, - { - // Internal files where extraneous deps don't matter much at long as - // they run - files: ["website/**"], - rules: { - "import/no-extraneous-dependencies": OFF, - }, - }, - ], -}; diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 00000000..9631b02f --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,73 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import tseslint from "typescript-eslint"; +import globals from "globals"; +import js from "@eslint/js"; +import react from "eslint-plugin-react"; +import reactHooks from "eslint-plugin-react-hooks"; +import importPlugin from "eslint-plugin-import"; +// @ts-expect-error: no types provided +import jsxA11y from "eslint-plugin-jsx-a11y"; +import docusaurus from "@docusaurus/eslint-plugin"; +import regexp from "eslint-plugin-regexp"; +import prettier from "eslint-config-prettier/flat"; + +import rules from "./eslint.rules"; + +const plugins = defineConfig([ + js.configs.recommended, + tseslint.configs.recommended, + react.configs.flat.recommended, + reactHooks.configs.flat.recommended, + importPlugin.flatConfigs.recommended, + jsxA11y.flatConfigs.recommended, + regexp.configs["flat/recommended"], + prettier, + + // The published @docusaurus/eslint-plugin doesn't provide a flat config yet + // This adapts its legacy "all" config to flat config + { + plugins: { + "@docusaurus": docusaurus, + }, + rules: docusaurus.configs.all.rules, + }, +]); + +const ignores = globalIgnores([ + "**/dist/**", + "**/lib/**", + "**/build/**", + "**/.docusaurus/**", + "node_modules", + ".yarn", + ".history", + "coverage", +]); + +export default defineConfig(plugins, rules, ignores, { + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { + ...globals.browser, + ...globals.node, + ...globals.commonjs, + JSX: true, + }, + }, + + settings: { + "import/resolver": { + node: { + extensions: [".js", ".jsx", ".ts", ".tsx"], + }, + }, + react: { + version: "19", + }, + }, + + linterOptions: { + reportUnusedDisableDirectives: true, + }, +}); diff --git a/eslint.rules.ts b/eslint.rules.ts new file mode 100644 index 00000000..a7602aa7 --- /dev/null +++ b/eslint.rules.ts @@ -0,0 +1,392 @@ +import { defineConfig } from "eslint/config"; + +const OFF = 0; +const WARNING = 1; +const ERROR = 2; + +// Prevent importing lodash, usually for browser bundle size reasons +const LodashImportPatterns = ["lodash", "lodash.**", "lodash/**"]; + +export default defineConfig( + { + rules: { + "array-callback-return": WARNING, + camelcase: WARNING, + "class-methods-use-this": OFF, // It's a way of allowing private variables. + curly: [WARNING, "all"], + "global-require": OFF, // Deprecated, @typescript-eslint/no-require-import is enough + "no-alert": WARNING, + "lines-between-class-members": OFF, + "max-classes-per-file": OFF, + "max-len": [ + WARNING, + { + code: Infinity, // Code width is already enforced by Prettier + tabWidth: 2, + comments: 80, + ignoreUrls: true, + ignorePattern: "(eslint-disable|@)", + }, + ], + "arrow-body-style": OFF, + "no-await-in-loop": OFF, + "no-case-declarations": WARNING, + "no-console": OFF, + "no-constant-binary-expression": ERROR, + "no-continue": OFF, + "no-control-regex": WARNING, + "no-else-return": OFF, + "no-empty": [WARNING, { allowEmptyCatch: true }], + "no-lonely-if": WARNING, + "no-nested-ternary": WARNING, + "no-param-reassign": [WARNING, { props: false }], + "no-prototype-builtins": WARNING, + "no-restricted-exports": OFF, + "no-restricted-properties": [ + ERROR, + .../** @type {[string, string][]} */ [ + // TODO: TS doesn't make Boolean a narrowing function yet, + // so filter(Boolean) is problematic type-wise + // ['compact', 'Array#filter(Boolean)'], + ["concat", "Array#concat"], + ["drop", "Array#slice(n)"], + ["dropRight", "Array#slice(0, -n)"], + ["fill", "Array#fill"], + ["filter", "Array#filter"], + ["find", "Array#find"], + ["findIndex", "Array#findIndex"], + ["first", "foo[0]"], + ["flatten", "Array#flat"], + ["flattenDeep", "Array#flat(Infinity)"], + ["flatMap", "Array#flatMap"], + ["fromPairs", "Object.fromEntries"], + ["head", "foo[0]"], + ["indexOf", "Array#indexOf"], + ["initial", "Array#slice(0, -1)"], + ["join", "Array#join"], + // Unfortunately there's no great alternative to _.last yet + // Candidates: foo.slice(-1)[0]; foo[foo.length - 1] + // Array#at is ES2022; could replace _.nth as well + // ['last'], + ["map", "Array#map"], + ["reduce", "Array#reduce"], + ["reverse", "Array#reverse"], + ["slice", "Array#slice"], + ["take", "Array#slice(0, n)"], + ["takeRight", "Array#slice(-n)"], + ["tail", "Array#slice(1)"], + ].map(([property, alternative]) => ({ + object: "_", + property, + message: `Use ${alternative} instead.`, + })), + ...[ + "readdirSync", + "readFileSync", + "statSync", + "lstatSync", + "existsSync", + "pathExistsSync", + "realpathSync", + "mkdirSync", + "mkdirpSync", + "mkdirsSync", + "writeFileSync", + "writeJsonSync", + "outputFileSync", + "outputJsonSync", + "moveSync", + "copySync", + "copyFileSync", + "ensureFileSync", + "ensureDirSync", + "ensureLinkSync", + "ensureSymlinkSync", + "unlinkSync", + "removeSync", + "emptyDirSync", + ].map((property) => ({ + object: "fs", + property, + message: "Do not use sync fs methods.", + })), + ], + "no-restricted-syntax": [ + WARNING, + // Copied from airbnb, removed for...of statement, added export all + { + selector: "ForInStatement", + message: + "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.", + }, + { + selector: "LabeledStatement", + message: + "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.", + }, + { + selector: "WithStatement", + message: + "`with` is disallowed in strict mode because it makes code impossible to predict and optimize.", + }, + { + selector: "ExportAllDeclaration", + message: + "Export all does't work well if imported in ESM due to how they are transpiled, and they can also lead to unexpected exposure of internal methods.", + }, + ...["path", "fs-extra", "webpack", "lodash"].map((m) => ({ + selector: `ImportDeclaration[importKind=value]:has(Literal[value=${m}]) > ImportSpecifier[importKind=value]`, + message: + "Default-import this, both for readability and interoperability with ESM", + })), + ], + "no-template-curly-in-string": WARNING, + "no-unused-expressions": OFF, + "no-useless-escape": WARNING, + "no-void": [ERROR, { allowAsStatement: true }], + "prefer-destructuring": OFF, + "prefer-named-capture-group": WARNING, + "prefer-template": WARNING, + yoda: WARNING, + + "import/extensions": OFF, + // This rule doesn't yet support resolving .js imports when the actual file + // is .ts. Plus it's not all that useful when our code is fully TS-covered. + "import/no-unresolved": [ + OFF, + { + // Ignore certain webpack aliases because they can't be resolved + ignore: [ + "^@theme", + "^@docusaurus", + "^@generated", + "^@site", + "^@testing-utils", + ], + }, + ], + "import/order": [ + WARNING, + { + groups: [ + "builtin", + "external", + "internal", + ["parent", "sibling", "index"], + "type", + ], + "newlines-between": "always", + pathGroups: [ + // always put css import to the last, ref: + // https://github.com/import-js/eslint-plugin-import/issues/1239 + { + pattern: "*.+(css|sass|less|scss|pcss|styl)", + group: "unknown", + patternOptions: { matchBase: true }, + position: "after", + }, + { pattern: "react", group: "builtin", position: "before" }, + { pattern: "react-dom", group: "builtin", position: "before" }, + { pattern: "react-dom/**", group: "builtin", position: "before" }, + { pattern: "stream", group: "builtin", position: "before" }, + { pattern: "fs-extra", group: "builtin" }, + { pattern: "lodash", group: "external", position: "before" }, + { pattern: "clsx", group: "external", position: "before" }, + // 'Bit weird to not use the `import/internal-regex` option, but this + // way, we can make `import type { Props } from "@theme/*"` appear + // before `import styles from "styles.module.css"`, which is what we + // always did. This should be removable once we stop using ambient + // module declarations for theme aliases. + { pattern: "@theme/**", group: "internal" }, + { pattern: "@site/**", group: "internal" }, + { pattern: "@theme-init/**", group: "internal" }, + { pattern: "@theme-original/**", group: "internal" }, + { pattern: "@/components/**", group: "internal" }, + { pattern: "@/libs/**", group: "internal" }, + { pattern: "@/types/**", group: "type" }, + ], + pathGroupsExcludedImportTypes: [], + // example: let `import './nprogress.css';` after importing others + // in `packages/docusaurus-theme-classic/src/nprogress.ts` + // see more: https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/order.md#warnonunassignedimports-truefalse + warnOnUnassignedImports: true, + }, + ], + "import/prefer-default-export": OFF, + // `import clsx from "clsx"` triggers it since clsx v2 also provides a + // named export; renaming the imports would diverge from upstream themes + "import/no-named-as-default": OFF, + + "jsx-a11y/click-events-have-key-events": WARNING, + "jsx-a11y/no-noninteractive-element-interactions": WARNING, + "jsx-a11y/html-has-lang": OFF, + + // Sometimes we do need the props as a whole, e.g. when spreading + "react/destructuring-assignment": OFF, + "react/function-component-definition": [ + WARNING, + { + namedComponents: "function-declaration", + unnamedComponents: "arrow-function", + }, + ], + "react/jsx-filename-extension": OFF, + "react/jsx-key": [ERROR, { checkFragmentShorthand: true }], + "react/jsx-no-useless-fragment": [ERROR, { allowExpressions: true }], + "react/jsx-props-no-spreading": OFF, + "react/no-array-index-key": OFF, // We build a static site, and nearly all components don't change. + "react/no-unstable-nested-components": [WARNING, { allowAsProps: true }], + "react/prefer-stateless-function": WARNING, + "react/prop-types": OFF, + "react/require-default-props": [ + ERROR, + { ignoreFunctionalComponents: true }, + ], + "react/jsx-uses-react": OFF, // JSX runtime: automatic + "react/react-in-jsx-scope": OFF, // JSX runtime: automatic + "react-hooks/set-state-in-effect": WARNING, // TODO re-enable later? + "react-hooks/rules-of-hooks": ERROR, + "react-hooks/exhaustive-deps": ERROR, + + "@typescript-eslint/no-empty-object-type": OFF, + "@typescript-eslint/prefer-optional-chain": OFF, + "@typescript-eslint/consistent-type-definitions": OFF, + "@typescript-eslint/require-await": OFF, + "@typescript-eslint/no-explicit-any": WARNING, + "@typescript-eslint/no-unused-expressions": [ + WARNING, + { allowTaggedTemplates: true, allowShortCircuit: true }, + ], + + "@typescript-eslint/ban-ts-comment": [ + ERROR, + { "ts-expect-error": "allow-with-description" }, + ], + "@typescript-eslint/consistent-indexed-object-style": OFF, + "@typescript-eslint/consistent-type-imports": [ + WARNING, + { disallowTypeAnnotations: false }, + ], + "@typescript-eslint/explicit-module-boundary-types": WARNING, + "@typescript-eslint/method-signature-style": ERROR, + "@typescript-eslint/no-empty-function": OFF, + "@typescript-eslint/no-empty-interface": [ + ERROR, + { + allowSingleExtends: true, + }, + ], + "@typescript-eslint/no-inferrable-types": OFF, + "@typescript-eslint/no-namespace": [WARNING, { allowDeclarations: true }], + "no-use-before-define": OFF, + "@typescript-eslint/no-use-before-define": [ + ERROR, + { functions: false, classes: false, variables: true }, + ], + "@typescript-eslint/no-non-null-assertion": OFF, + "no-redeclare": OFF, + "@typescript-eslint/no-redeclare": ERROR, + "no-shadow": OFF, + "@typescript-eslint/no-shadow": ERROR, + "no-unused-vars": OFF, + // We don't provide any escape hatches for this rule. Rest siblings and + // function placeholder params are always ignored, and any other unused + // locals must be justified with a disable comment. + "@typescript-eslint/no-unused-vars": [ + ERROR, + { + ignoreRestSiblings: true, + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + "@docusaurus/no-html-links": ERROR, + "@docusaurus/prefer-docusaurus-heading": ERROR, + "@docusaurus/no-untranslated-text": [ + WARNING, + { + ignoredStrings: [ + "·", + "-", + "—", + "×", + "​", // zwj: ​ + "@", + "WebContainers", + "Twitter", + "X", + "GitHub", + "Dev.to", + "1.x", + ], + }, + ], + }, + }, + + { + files: ["packages/*/src/theme/**/*.{js,ts,tsx}"], + ignores: ["**/*.test.{js,ts,tsx}", "**/__tests__/**"], + rules: { + "no-restricted-imports": [ + ERROR, + { + patterns: LodashImportPatterns.concat( + // Prevents relative imports between React theme components + [ + "../**", + "./**", + // Allows relative styles module import with consistent filename + "!./styles.module.css", + // Allows relative tailwind css import with consistent filename + "!./styles.css", + ], + ), + }, + ], + }, + }, + { + files: ["packages/*/src/theme/**/*.{js,ts,tsx}"], + rules: { + "import/no-named-export": ERROR, + }, + }, + { + files: ["**/*.d.ts"], + rules: { + "import/no-duplicates": OFF, + }, + }, + { + files: ["**/*.{ts,tsx}"], + rules: { + "no-undef": OFF, + "import/no-import-module-exports": OFF, + }, + }, + { + files: ["**/*.{js,mjs,cjs}"], + rules: { + // Make JS code directly runnable in Node. + "@typescript-eslint/no-var-requires": OFF, + "@typescript-eslint/explicit-module-boundary-types": OFF, + }, + }, + { + // Internal files where extraneous deps don't matter much at long as + // they run + files: ["website/**"], + rules: { + "import/no-extraneous-dependencies": OFF, + }, + }, + + // Website-specific rules + { + files: ["website/**"], + rules: { + "@typescript-eslint/no-require-imports": OFF, + }, + }, +); diff --git a/package.json b/package.json index 1b964b09..11085b0a 100644 --- a/package.json +++ b/package.json @@ -11,24 +11,26 @@ "clear": "pnpm --filter nonebot clear", "prettier": "prettier --config ./.prettierrc --write \"./website/\"", "lint": "pnpm lint:js && pnpm lint:style", + "lint:ci": "pnpm lint:js --quiet && pnpm lint:style", "lint:js": "eslint --cache --report-unused-disable-directives \"**/*.{js,jsx,ts,tsx,mjs}\"", - "lint:js:fix": "eslint --cache --report-unused-disable-directives --fix \"**/*.{js,jsx,ts,tsx,mjs}\"", + "lint:js:fix": "pnpm lint:js --fix", "lint:style": "stylelint \"**/*.css\"", "lint:style:fix": "stylelint --fix \"**/*.css\"", "pyright": "pyright" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@docusaurus/eslint-plugin": "3.10.2", + "@eslint/js": "^10.0.1", "cross-env": "^7.0.3", - "eslint": "^8.48.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-regexp": "^1.15.0", + "eslint": "^9.39.4", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-regexp": "^3.1.0", + "globals": "^17.6.0", + "jiti": "^2.7.0", "prettier": "^3.0.3", "pyright": "1.1.393", "stylelint": "^15.10.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc61278d..6dbb0cf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,42 +8,45 @@ importers: .: devDependencies: - '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.57.1)(typescript@5.7.3) + '@docusaurus/eslint-plugin': + specifier: 3.10.2 + version: 3.10.2(eslint@9.39.5(jiti@2.7.0))(typescript@5.7.3) + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@9.39.5(jiti@2.7.0)) cross-env: specifier: ^7.0.3 version: 7.0.3 eslint: - specifier: ^8.48.0 - version: 8.57.1 - eslint-config-airbnb: - specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1) + specifier: ^9.39.4 + version: 9.39.5(jiti@2.7.0) eslint-config-prettier: - specifier: ^8.8.0 - version: 8.10.2(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-import: - specifier: ^2.27.5 - version: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) + specifier: ^2.32.0 + version: 2.32.0(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-jsx-a11y: - specifier: ^6.7.1 - version: 6.10.2(eslint@8.57.1) + specifier: ^6.10.2 + version: 6.10.2(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react: - specifier: ^7.32.2 - version: 7.37.5(eslint@8.57.1) + specifier: ^7.37.5 + version: 7.37.5(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) + specifier: ^7.1.1 + version: 7.1.1(eslint@9.39.5(jiti@2.7.0)) eslint-plugin-regexp: - specifier: ^1.15.0 - version: 1.15.0(eslint@8.57.1) + specifier: ^3.1.0 + version: 3.1.1(eslint@9.39.5(jiti@2.7.0)) + globals: + specifier: ^17.6.0 + version: 17.7.0 + jiti: + specifier: ^2.7.0 + version: 2.7.0 prettier: specifier: ^3.0.3 - version: 3.9.5 + version: 3.9.6 pyright: specifier: 1.1.393 version: 1.1.393 @@ -55,16 +58,13 @@ importers: version: 34.0.0(stylelint@15.11.0(typescript@5.7.3)) stylelint-prettier: specifier: ^4.0.2 - version: 4.1.0(prettier@3.9.5)(stylelint@15.11.0(typescript@5.7.3)) + version: 4.1.0(prettier@3.9.6)(stylelint@15.11.0(typescript@5.7.3)) website: dependencies: '@docusaurus/core': specifier: 3.10.2 version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.43)(postcss@8.5.19)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(postcss@8.5.19))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(@rspack/core@1.7.12)(@swc/core@1.15.43)(postcss@8.5.19)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.7.3) - '@docusaurus/eslint-plugin': - specifier: 3.10.2 - version: 3.10.2(eslint@8.57.1)(typescript@5.7.3) '@mdx-js/react': specifier: ^3.0.0 version: 3.1.1(@types/react@19.2.17)(react@19.2.7) @@ -1339,13 +1339,42 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fortawesome/fontawesome-common-types@6.7.2': resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} @@ -1380,18 +1409,25 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@icons/material@0.2.4': resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==} @@ -2128,41 +2164,10 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2784,9 +2789,6 @@ packages: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} @@ -3137,10 +3139,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} @@ -3295,25 +3293,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-airbnb-base@15.0.0: - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 - - eslint-config-airbnb@19.0.4: - resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} - engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - - eslint-config-prettier@8.10.2: - resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -3358,11 +3339,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} @@ -3370,33 +3351,41 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-regexp@1.15.0: - resolution: {integrity: sha512-YEtQPfdudafU7RBIFci81R/Q1yErm0mVh3BkGnXD2Dk8DLwTFdc2ITYH1wCnHKim2gnHfPFgrkh+b2ozyyU7ag==} - engines: {node: ^12 || >=14} + eslint-plugin-regexp@3.1.1: + resolution: {integrity: sha512-MxR5nqoQCtVWmJwia0D2+NlXX1xzdpkslsVOZLEYQ4PQWEaL65PCZXURxaBc3lPnkNFpNxzMIRmYVxdl8giXRA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=6.0.0' + eslint: '>=9.38.0' eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} @@ -3531,14 +3520,14 @@ packages: picomatch: optional: true - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@7.0.2: resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} engines: {node: '>=12.0.0'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-loader@6.2.0: resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} @@ -3569,6 +3558,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true @@ -3696,9 +3689,13 @@ packages: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -3729,12 +3726,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -3805,6 +3796,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} @@ -4229,6 +4226,10 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + joi@17.13.4: resolution: {integrity: sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==} @@ -4239,10 +4240,9 @@ packages: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true - jsdoctypeparser@9.0.0: - resolution: {integrity: sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==} - engines: {node: '>=10'} - hasBin: true + jsdoc-type-pratt-parser@7.2.0: + resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} + engines: {node: '>=20.0.0'} jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} @@ -4825,9 +4825,6 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5557,8 +5554,8 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@3.9.5: - resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -5754,8 +5751,8 @@ packages: resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} engines: {node: '>=12'} - refa@0.11.0: - resolution: {integrity: sha512-486O8/pQXwj9jV0mVvUnTsxq0uknpBnNJ0eCUhkZqJRQ8KutrT1PhzmumdCeM1hSBF2eMlFPmwECRER4IbKXlQ==} + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} reflect-metadata@0.2.2: @@ -5772,8 +5769,8 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regexp-ast-analysis@0.6.0: - resolution: {integrity: sha512-OLxjyjPkVH+rQlBLb1I/P/VTmamSjGkvN5PTV5BXP432k3uVz727J7H29GA5IFiY0m7e1xBN7049Wn59FY3DEQ==} + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} regexp.prototype.flags@1.5.4: @@ -5939,8 +5936,9 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - scslre@0.2.0: - resolution: {integrity: sha512-4hc49fUMmX3jM0XdFUAPBrs1xwEcdHa0KyjEsjFs+Zfc66mpFpq5YmRgDtl+Ffo6AtJIilfei+yKw8fUn3N88w==} + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} search-insights@2.17.3: resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} @@ -6396,9 +6394,6 @@ packages: text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -6489,10 +6484,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -6829,6 +6820,15 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -8268,10 +8268,10 @@ snapshots: postcss-sort-media-queries: 5.2.0(postcss@8.5.19) tslib: 2.8.1 - '@docusaurus/eslint-plugin@3.10.2(eslint@8.57.1)(typescript@5.7.3)': + '@docusaurus/eslint-plugin@3.10.2(eslint@9.39.5(jiti@2.7.0))(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 5.62.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.7.3) + eslint: 9.39.5(jiti@2.7.0) tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -9007,19 +9007,35 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.7.0))': dependencies: - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.6': dependencies: ajv: 6.15.0 debug: 4.4.3 - espree: 9.6.1 - globals: 13.24.0 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.3.0 @@ -9028,7 +9044,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@10.0.1(eslint@9.39.5(jiti@2.7.0))': + optionalDependencies: + eslint: 9.39.5(jiti@2.7.0) + + '@eslint/js@9.39.5': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 '@fortawesome/fontawesome-common-types@6.7.2': {} @@ -9060,17 +9087,21 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.2': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3 - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@icons/material@0.2.4(react@19.2.7)': dependencies: @@ -10045,54 +10076,11 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.3 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.8.5 - tsutils: 3.21.0(typescript@5.7.3) - optionalDependencies: - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) - debug: 4.4.3 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.7.3)': - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.3 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@5.7.3) - optionalDependencies: - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.3)': @@ -10109,15 +10097,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/utils@5.62.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.3) - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) eslint-scope: 5.1.1 semver: 7.8.5 transitivePeerDependencies: @@ -10793,8 +10781,6 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - confusing-browser-globals@1.0.11: {} - connect-history-api-fallback@2.0.0: {} consola@3.4.2: {} @@ -11129,10 +11115,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-converter@0.2.0: dependencies: utila: 0.4.0 @@ -11362,29 +11344,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.7.0)): dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) - object.assign: 4.1.7 - object.entries: 1.1.9 - semver: 6.3.1 - - eslint-config-airbnb@19.0.4(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.1))(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - object.assign: 4.1.7 - object.entries: 1.1.9 - - eslint-config-prettier@8.10.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node@0.3.10: dependencies: @@ -11394,17 +11356,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): + eslint-module-utils@2.14.0(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.3) - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(eslint@9.39.5(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11413,9 +11374,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) + eslint-module-utils: 2.14.0(eslint-import-resolver-node@0.3.10)(eslint@9.39.5(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -11426,14 +11387,12 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.7.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -11443,7 +11402,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) hasown: 2.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -11452,11 +11411,18 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: - eslint: 8.57.1 + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + eslint: 9.39.5(jiti@2.7.0) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -11464,7 +11430,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.4.0 - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -11478,78 +11444,77 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-regexp@1.15.0(eslint@8.57.1): + eslint-plugin-regexp@3.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 comment-parser: 1.4.7 - eslint: 8.57.1 - grapheme-splitter: 1.0.4 - jsdoctypeparser: 9.0.0 - refa: 0.11.0 - regexp-ast-analysis: 0.6.0 - scslre: 0.2.0 + eslint: 9.39.5(jiti@2.7.0) + jsdoc-type-pratt-parser: 7.2.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.5(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.6 + '@eslint/js': 9.39.5 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.3 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.3.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.7.0 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.4.0: dependencies: acorn: 8.17.0 acorn-jsx: 5.3.2(acorn@8.17.0) - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 4.2.1 esquery@1.7.0: dependencies: @@ -11717,14 +11682,14 @@ snapshots: optionalDependencies: picomatch: 4.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - file-entry-cache@7.0.2: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-loader@6.2.0(webpack@5.108.4(@swc/core@1.15.43)(postcss@8.5.19)): dependencies: loader-utils: 2.0.4 @@ -11768,6 +11733,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + flat@5.0.2: {} flatted@3.4.2: {} @@ -11888,9 +11858,9 @@ snapshots: kind-of: 6.0.3 which: 1.3.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} + + globals@17.7.0: {} globalthis@1.0.4: dependencies: @@ -11936,10 +11906,6 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - - graphemer@1.4.0: {} - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -12068,6 +12034,12 @@ snapshots: he@1.2.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + history@4.10.1: dependencies: '@babel/runtime': 7.29.7 @@ -12476,6 +12448,8 @@ snapshots: jiti@1.21.7: {} + jiti@2.7.0: {} + joi@17.13.4: dependencies: '@hapi/hoek': 9.3.0 @@ -12490,7 +12464,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoctypeparser@9.0.0: {} + jsdoc-type-pratt-parser@7.2.0: {} jsesc@3.1.0: {} @@ -13313,8 +13287,6 @@ snapshots: napi-build-utils@2.0.0: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -14096,7 +14068,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.9.5: {} + prettier@3.9.6: {} pretty-error@4.0.0: dependencies: @@ -14331,7 +14303,7 @@ snapshots: indent-string: 5.0.0 strip-indent: 4.1.1 - refa@0.11.0: + refa@0.12.1: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -14354,10 +14326,10 @@ snapshots: regenerate@1.4.2: {} - regexp-ast-analysis@0.6.0: + regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.2 - refa: 0.11.0 + refa: 0.12.1 regexp.prototype.flags@1.5.4: dependencies: @@ -14581,11 +14553,11 @@ snapshots: ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) - scslre@0.2.0: + scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.2 - refa: 0.11.0 - regexp-ast-analysis: 0.6.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 search-insights@2.17.3: {} @@ -15009,9 +14981,9 @@ snapshots: stylelint: 15.11.0(typescript@5.7.3) stylelint-config-recommended: 13.0.0(stylelint@15.11.0(typescript@5.7.3)) - stylelint-prettier@4.1.0(prettier@3.9.5)(stylelint@15.11.0(typescript@5.7.3)): + stylelint-prettier@4.1.0(prettier@3.9.6)(stylelint@15.11.0(typescript@5.7.3)): dependencies: - prettier: 3.9.5 + prettier: 3.9.6 prettier-linter-helpers: 1.0.1 stylelint: 15.11.0(typescript@5.7.3) @@ -15214,8 +15186,6 @@ snapshots: transitivePeerDependencies: - react-native-b4a - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -15291,8 +15261,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@1.4.0: {} type-fest@2.19.0: {} @@ -15801,4 +15769,10 @@ snapshots: yocto-queue@1.2.2: {} + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} + zwitch@2.0.4: {} diff --git a/tsconfig.json b/tsconfig.json index e2176982..d73ec392 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,6 +40,6 @@ "importHelpers": true, "noEmitHelpers": true }, - "include": ["./**/.eslintrc.js", "./**/.stylelintrc.js"], + "include": ["eslint.config.ts", "eslint.rules.ts", "./**/.stylelintrc.js"], "exclude": ["node_modules", "**/lib/**/*"] } diff --git a/website/package.json b/website/package.json index 279761ac..034d867e 100644 --- a/website/package.json +++ b/website/package.json @@ -27,7 +27,6 @@ }, "dependencies": { "@docusaurus/core": "3.10.2", - "@docusaurus/eslint-plugin": "3.10.2", "@mdx-js/react": "^3.0.0", "@nullbot/docusaurus-plugin-changelog": "^3.8.0", "@nullbot/docusaurus-preset-nonepress": "^3.8.0",