diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 53cfe711..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,145 +0,0 @@ -module.exports = { - extends: [ - "eslint-config-mitodl", - "eslint-config-mitodl/jest", - "plugin:styled-components-a11y/recommended", - "plugin:import/typescript", - "plugin:mdx/recommended", - "prettier", - ], - plugins: ["testing-library", "import", "styled-components-a11y"], - ignorePatterns: ["**/build/**"], - settings: { - "jsx-a11y": { - components: { - "ListCard.Image": "img", - "Card.Image": "img", - Button: "button", - ButtonLink: "a", - ActionButton: "button", - ActionButtonLink: "a", - }, - }, - }, - rules: { - ...restrictedImports(), - "react/display-name": [2, {}], - // This rule is disabled in the default a11y config, but unclear why. - // It does catch useful errors, e.g., buttons with no text or label. - // If it proves to be flaky, we can find other ways to check for this. - // We need both rules below. One for normal elements, one for styled - "jsx-a11y/control-has-associated-label": ["error"], - "styled-components-a11y/control-has-associated-label": ["error"], - "@typescript-eslint/triple-slash-reference": [ - "error", - { - path: "never", - types: "prefer-import", - lib: "never", - }, - ], - "import/no-extraneous-dependencies": [ - "error", - { - devDependencies: [ - "**/*.test.ts", - "**/*.test.tsx", - "**/src/setupJest.ts", - "**/jest-setup.ts", - "**/jsdom-extended.ts", - "**/test-utils/**", - "**/test-utils/**", - "**/webpack.config.js", - "**/webpack.exports.js", - "**/postcss.config.js", - "**/*.stories.ts", - "**/*.stories.tsx", - "**/*.mdx", - "vite.config.mts", - ".storybook/**", - ], - }, - ], - "import/no-duplicates": "error", - quotes: ["error", "double", { avoidEscape: true }], - "no-restricted-syntax": [ - "error", - /** - * See https://eslint.org/docs/latest/rules/no-restricted-syntax - * - * The selectors use "ES Query", a css-like syntax for AST querying. A - * useful tool is https://estools.github.io/esquery/ - */ - { - selector: - "Property[key.name=fontWeight][value.raw=/\\d+/], TemplateElement[value.raw=/font-weight: \\d+/]", - message: - "Do not specify `fontWeight` manually. Prefer spreading `theme.typography.subtitle1` or similar. If you MUST use a fontWeight, refer to `fontWeights` theme object.", - }, - { - selector: - "Property[key.name=fontFamily][value.raw=/Neue Haas/], TemplateElement[value.raw=/Neue Haas/]", - message: - "Do not specify `fontFamily` manually. Prefer spreading `theme.typography.subtitle1` or similar. If using neue-haas-grotesk-text, this is ThemeProvider's default fontFamily.", - }, - ], - }, - overrides: [ - { - files: ["./**/*.test.{ts,tsx}"], - plugins: ["testing-library"], - extends: ["plugin:testing-library/react"], - rules: { - "testing-library/no-node-access": "off", - }, - }, - ], -} - -function restrictedImports({ paths = [], patterns = [] } = {}) { - /** - * With the `no-restricted-imports` rule (and its typescript counterpart), - * it's difficult to restrict imports but allow a few exceptions. - * - * For example: - * - forbid importing `@mui/material/*`, EXCEPT within `ol-components`. - * - * It is possible to do this using overrides. - * - * This function exists to make it easier to share config between overrides. - * - * See also: - * - https://github.com/eslint/eslint/discussions/17047 no-restricted-imports: allow some specific imports in some specific directories - * - https://github.com/eslint/eslint/discussions/15011 Can a rule be specified multiple times without overriding itself? - * - * This may be easier if we swtich to ESLint's new "flat config" system. - */ - return { - "@typescript-eslint/no-restricted-imports": [ - "error", - { - paths: [ - /** - * No direct imports from large "barrel files". They make Jest slow. - * - * For more, see: - * - https://github.com/jestjs/jest/issues/11234 - * - https://github.com/faker-js/faker/issues/1114#issuecomment-1169532948 - */ - { - name: "@faker-js/faker", - message: "Please use @faker-js/faker/locale/en instead.", - allowTypeImports: true, - }, - { - name: "@mui/material", - message: "Please use @mui/material/ instead.", - allowTypeImports: true, - }, - ...paths, - ], - patterns: [...patterns], - }, - ], - } -} diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 00000000..6250f8cb --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,159 @@ +import { FlatCompat } from "@eslint/eslintrc" +import path from "path" +import { fileURLToPath } from "url" +import styledComponentsA11y from "eslint-plugin-styled-components-a11y" +import importPlugin from "eslint-plugin-import" +import * as mdxPlugin from "eslint-plugin-mdx" +import testingLibraryPlugin from "eslint-plugin-testing-library" +import typescriptEslint from "@typescript-eslint/eslint-plugin" +import jsxA11yPlugin from "eslint-plugin-jsx-a11y" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: {}, + allConfig: {}, +}) + +const restrictedImports = ({ paths = [], patterns = [] } = {}) => ({ + "@typescript-eslint/no-restricted-imports": [ + "error", + { + paths: [ + /** + * No direct imports from large "barrel files". They make Jest slow. + * + * For more, see: + * - https://github.com/jestjs/jest/issues/11234 + * - https://github.com/faker-js/faker/issues/1114#issuecomment-1169532948 + */ + { + name: "@faker-js/faker", + message: "Please use @faker-js/faker/locale/en instead.", + allowTypeImports: true, + }, + { + name: "@mui/material", + message: "Please use @mui/material/ instead.", + allowTypeImports: true, + }, + ...paths, + ], + patterns: [...patterns], + }, + ], +}) + +export default [ + // Global ignores + { + ignores: ["**/build/**"], + }, + + // Convert legacy configs to flat config - apply to all files + ...compat.extends("eslint-config-mitodl"), + ...compat.extends("eslint-config-prettier"), + + // Base configuration for all files + { + files: ["**/*.{js,jsx,ts,tsx}"], + plugins: { + "@typescript-eslint": typescriptEslint, + "styled-components-a11y": styledComponentsA11y, + import: importPlugin, + mdx: mdxPlugin, + "testing-library": testingLibraryPlugin, + "jsx-a11y": jsxA11yPlugin, + }, + settings: { + "jsx-a11y": { + components: { + "ListCard.Image": "img", + "Card.Image": "img", + Button: "button", + ButtonLink: "a", + ActionButton: "button", + ActionButtonLink: "a", + }, + }, + }, + rules: { + ...restrictedImports(), + "react/display-name": [2, {}], + // This rule is disabled in the default a11y config, but unclear why. + // It does catch useful errors, e.g., buttons with no text or label. + // If it proves to be flaky, we can find other ways to check for this. + // We need both rules below. One for normal elements, one for styled + "jsx-a11y/control-has-associated-label": ["error"], + "styled-components-a11y/control-has-associated-label": ["error"], + "jsx-a11y/anchor-has-content": ["error"], + "@typescript-eslint/triple-slash-reference": [ + "error", + { + path: "never", + types: "prefer-import", + lib: "never", + }, + ], + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: [ + "**/*.test.ts", + "**/*.test.tsx", + "**/src/setupJest.ts", + "**/jest-setup.ts", + "**/jsdom-extended.ts", + "**/test-utils/**", + "**/test-utils/**", + "**/webpack.config.js", + "**/webpack.exports.js", + "**/postcss.config.js", + "**/*.stories.ts", + "**/*.stories.tsx", + "**/*.mdx", + "vite.config.mts", + ".storybook/**", + ], + }, + ], + "import/no-duplicates": "error", + quotes: ["error", "double", { avoidEscape: true }], + "no-restricted-syntax": [ + "error", + /** + * See https://eslint.org/docs/latest/rules/no-restricted-syntax + * + * The selectors use "ES Query", a css-like syntax for AST querying. A + * useful tool is https://estools.github.io/esquery/ + */ + { + selector: + "Property[key.name=fontWeight][value.raw=/\\d+/], TemplateElement[value.raw=/font-weight: \\d+/]", + message: + "Do not specify `fontWeight` manually. Prefer spreading `theme.typography.subtitle1` or similar. If you MUST use a fontWeight, refer to `fontWeights` theme object.", + }, + { + selector: + "Property[key.name=fontFamily][value.raw=/Neue Haas/], TemplateElement[value.raw=/Neue Haas/]", + message: + "Do not specify `fontFamily` manually. Prefer spreading `theme.typography.subtitle1` or similar. If using neue-haas-grotesk-text, this is ThemeProvider's default fontFamily.", + }, + ], + }, + }, + + // Test files configuration + { + files: ["./**/*.test.{ts,tsx}"], + ...compat.extends("eslint-config-mitodl/jest")[0], + plugins: { + "testing-library": testingLibraryPlugin, + }, + rules: { + "testing-library/no-node-access": "off", + }, + }, +] diff --git a/package.json b/package.json index f0f00ad6..eced7397 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "@chromatic-com/storybook": "^3.0.0", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@eslint/eslintrc": "^3.2.0", "@faker-js/faker": "^9.0.0", "@jest/environment": "^29.7.0", "@mui/lab": "6.0.0-dev.240424162023-9968b4889d", @@ -110,7 +111,7 @@ "@types/react-dom": "^19.0.0", "@typescript-eslint/eslint-plugin": "^8.13.0", "@typescript-eslint/typescript-estree": "^8.13.0", - "eslint": "8.57.1", + "eslint": "9.29.0", "eslint-config-mitodl": "^2.1.0", "eslint-config-prettier": "^10.0.0", "eslint-import-resolver-typescript": "^4.0.0", @@ -155,5 +156,8 @@ "workerDirectory": [ "storybook-public" ] + }, + "resolutions": { + "jiti": "^2.0.0" } } diff --git a/src/bundles/AiDrawer/AiDrawerManager.stories.tsx b/src/bundles/AiDrawer/AiDrawerManager.stories.tsx index a26b7b1d..f7dc7754 100644 --- a/src/bundles/AiDrawer/AiDrawerManager.stories.tsx +++ b/src/bundles/AiDrawer/AiDrawerManager.stories.tsx @@ -1,4 +1,3 @@ -/* eslint-disable react-hooks/rules-of-hooks */ import * as React from "react" import type { Meta, StoryObj } from "@storybook/react" import invariant from "tiny-invariant" diff --git a/src/components/AiChat/AiChat.test.tsx b/src/components/AiChat/AiChat.test.tsx index cdf67d0b..f1833b8f 100644 --- a/src/components/AiChat/AiChat.test.tsx +++ b/src/components/AiChat/AiChat.test.tsx @@ -1,5 +1,4 @@ // This was giving false positives -/* eslint-disable testing-library/await-async-utils */ import { render, screen, waitFor } from "@testing-library/react" import user from "@testing-library/user-event" import { AiChat, replaceMathjax } from "./AiChat" diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx index 11bb99c8..0423778f 100644 --- a/src/components/Checkbox/Checkbox.tsx +++ b/src/components/Checkbox/Checkbox.tsx @@ -106,28 +106,35 @@ const Checkbox: React.FC = ({ className, disabled = false, }) => { + const checkboxId = React.useId() + const labelId = React.useId() + return ( {label ? ( - diff --git a/src/components/Input/Input.stories.tsx b/src/components/Input/Input.stories.tsx index 58635a98..ee30a017 100644 --- a/src/components/Input/Input.stories.tsx +++ b/src/components/Input/Input.stories.tsx @@ -147,7 +147,6 @@ export const States: Story = { diff --git a/src/components/SrAnnouncer/SrAnnouncer.stories.tsx b/src/components/SrAnnouncer/SrAnnouncer.stories.tsx index 2557cba4..7c8f924f 100644 --- a/src/components/SrAnnouncer/SrAnnouncer.stories.tsx +++ b/src/components/SrAnnouncer/SrAnnouncer.stories.tsx @@ -25,14 +25,15 @@ const meta: Meta = { return ( <> +

By default, the content of this story is visually hidden.


diff --git a/src/components/ThemeProvider/ThemeProvider.stories.tsx b/src/components/ThemeProvider/ThemeProvider.stories.tsx index 781e996d..d18039e7 100644 --- a/src/components/ThemeProvider/ThemeProvider.stories.tsx +++ b/src/components/ThemeProvider/ThemeProvider.stories.tsx @@ -7,7 +7,7 @@ const CustomLinkAdapater = React.forwardRef< HTMLAnchorElement, React.ComponentProps<"a"> >((props, ref) => ( - // eslint-disable-next-line jsx-a11y/anchor-has-content, jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions + // eslint-disable-next-line jsx-a11y/anchor-has-content { diff --git a/yarn.lock b/yarn.lock index 4c989de4..5397be91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1905,34 +1905,87 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.20.1": + version: 0.20.1 + resolution: "@eslint/config-array@npm:0.20.1" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10/d72cc90f516c5730da5f37fa04aa8ba26ea0d92c7457ee77980902158f844f3483518272ccfe16f273c3313c3bfec8da713d4e51d3da49bdeccd34e919a2b903 + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.2.1": + version: 0.2.3 + resolution: "@eslint/config-helpers@npm:0.2.3" + checksum: 10/1f5082248f65555cc666942f7c991a2cfd6821758fb45338f43b28ea0f6b77d0c48b35097400d9b8fe1b4b10150085452e0b8f2d6d9ba17a84e16a6c7e4b341d + languageName: node + linkType: hard + +"@eslint/core@npm:^0.14.0": + version: 0.14.0 + resolution: "@eslint/core@npm:0.14.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10/d9b060cf97468150675ddf4fb3db55edaa32467e0adf9f80919a5bfd15d0835ad7765456f4397ec2d16b0a1bb702af63f6d4712f94194d34fea118231ae1e2db + languageName: node + linkType: hard + +"@eslint/core@npm:^0.15.0": + version: 0.15.0 + resolution: "@eslint/core@npm:0.15.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10/27c9cb5bdc5c9dead5b06f2b2a6a66d8bbe5e2e19397e2c5ff9ea582c9d4e4478bf1bc1bdd4eaec7bb3a0d6fa53f152e595acf637354776c14bb58c321ea5aa3 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.2.0, @eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + checksum: 10/cc240addbab3c5fceaa65b2c8d5d4fd77ddbbf472c2f74f0270b9d33263dc9116840b6099c46b64c9680301146250439b044ed79278a1bcc557da412a4e3c1bb + languageName: node + linkType: hard + +"@eslint/js@npm:9.29.0": + version: 9.29.0 + resolution: "@eslint/js@npm:9.29.0" + checksum: 10/7f7fd586b35bd08537dd65a9bda764f474350c36b4ccbdd342462d1a26be28f7ee0ebd0611dd4762b69829674336ba04c281b9658aeccb3e6ab1d0fec7e6d08c languageName: node linkType: hard -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10/266085c8d3fa6cd99457fb6350dffb8ee39db9c6baf28dc2b86576657373c92a568aec4bae7d142978e798b74c271696672e103202d47a0c148da39154351ed6 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.3.1": + version: 0.3.2 + resolution: "@eslint/plugin-kit@npm:0.3.2" + dependencies: + "@eslint/core": "npm:^0.15.0" + levn: "npm:^0.4.1" + checksum: 10/26ba99936f72ca124036fbc5ca93168713fab5984117109b1447642a93725fbb75aa457622683dc8797509e40294497d74b584caa26f285373bdde17ceba8eac languageName: node linkType: hard @@ -1981,14 +2034,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10/270d936be483ab5921702623bc74ce394bf12abbf57d9145a69e8a0d1c87eb1c768bd2d93af16c5705041e257e6d9cc7529311f63a1349f3678abc776fc28523 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10/6d43c6727463772d05610aa05c83dab2bfbe78291022ee7a92cb50999910b8c720c76cc312822e2dea2b497aa1b3fef5fe9f68803fc45c9d4ed105874a65e339 languageName: node linkType: hard @@ -1999,10 +2058,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10/eb457f699529de7f07649679ec9e0353055eebe443c2efe71c6dd950258892475a038e13c6a8c5e13ed1fb538cdd0a8794faa96b24b6ffc4c87fb1fc9f70ad7f + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: 10/0b32cfd362bea7a30fbf80bb38dcaf77fee9c2cae477ee80b460871d03590110ac9c77d654f04ec5beaf71b6f6a89851bdf6c1e34ccdf2f686bd86fcd97d9e61 languageName: node linkType: hard @@ -2790,6 +2856,7 @@ __metadata: "@emotion/cache": "npm:^11.14.0" "@emotion/react": "npm:^11.11.1" "@emotion/styled": "npm:^11.11.0" + "@eslint/eslintrc": "npm:^3.2.0" "@faker-js/faker": "npm:^9.0.0" "@jest/environment": "npm:^29.7.0" "@mui/lab": "npm:6.0.0-dev.240424162023-9968b4889d" @@ -2823,7 +2890,7 @@ __metadata: better-react-mathjax: "npm:^2.3.0" classnames: "npm:^2.5.1" conventional-changelog-conventionalcommits: "npm:^9.0.0" - eslint: "npm:8.57.1" + eslint: "npm:9.29.0" eslint-config-mitodl: "npm:^2.1.0" eslint-config-prettier: "npm:^10.0.0" eslint-import-resolver-typescript: "npm:^4.0.0" @@ -3194,7 +3261,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -5453,7 +5520,7 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 @@ -5873,7 +5940,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.14.1, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.0.0, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.14.1, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2": version: 8.14.1 resolution: "acorn@npm:8.14.1" bin: @@ -5882,6 +5949,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" + bin: + acorn: bin/acorn + checksum: 10/77f2de5051a631cf1729c090e5759148459cdb76b5f5c70f890503d629cf5052357b0ce783c0f976dd8a93c5150f59f6d18df1def3f502396a20f81282482fa4 + languageName: node + linkType: hard + "adjust-sourcemap-loader@npm:^4.0.0": version: 4.0.0 resolution: "adjust-sourcemap-loader@npm:4.0.0" @@ -7577,7 +7653,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -8841,13 +8917,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 + checksum: 10/e8e611701f65375e034c62123946e628894f0b54aa8cb11abe224816389abe5cd74cf16b62b72baa36504f22d1a958b9b8b0169b82397fe2e7997674c0d09b06 languageName: node linkType: hard @@ -8858,7 +8934,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b @@ -8872,51 +8948,60 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.57.1": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10/3ee00fc6a7002d4b0ffd9dc99e13a6a7882c557329e6c25ab254220d71e5c9c4f89dca4695352949ea678eb1f3ba912a18ef8aac0a7fe094196fd92f441bfce2 + languageName: node + linkType: hard + +"eslint@npm:9.29.0": + version: 9.29.0 + resolution: "eslint@npm:9.29.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.20.1" + "@eslint/config-helpers": "npm:^0.2.1" + "@eslint/core": "npm:^0.14.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.29.0" + "@eslint/plugin-kit": "npm:^0.3.1" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.2.1" + espree: "npm:^10.4.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c + checksum: 10/be0c8e123207c9d653fb75ddc610b85dfbf295a2bfa1cbecc78f191dcba9c421525b5befd5d499ce561eca607c9c33f455e4fff0b1c2d4202c2896dafe95094a languageName: node linkType: hard @@ -8927,14 +9012,14 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: "npm:^8.9.0" + acorn: "npm:^8.15.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10/9b355b32dbd1cc9f57121d5ee3be258fab87ebeb7c83fc6c02e5af1a74fc8c5ba79fe8c663e69ea112c3e84a1b95e6a2067ac4443ee7813bb85ac7581acb8bf9 languageName: node linkType: hard @@ -8959,7 +9044,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -9247,12 +9332,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + flat-cache: "npm:^4.0.0" + checksum: 10/afe55c4de4e0d226a23c1eae62a7219aafb390859122608a89fa4df6addf55c7fd3f1a2da6f5b41e7cdff496e4cf28bbd215d53eab5c817afa96d2b40c81bfb0 languageName: node linkType: hard @@ -9374,6 +9459,16 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10/58ce851d9045fffc7871ce2bd718bc485ad7e777bf748c054904b87c351ff1080c2c11da00788d78738bfb51b71e4d5ea12d13b98eb36e3358851ffe495b62dc + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.3.3 resolution: "flatted@npm:3.3.3" @@ -9729,12 +9824,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10/03939c8af95c6df5014b137cac83aa909090c3a3985caef06ee9a5a669790877af8698ab38007e4c0186873adc14c0b13764acc754b16a754c216cc56aa5f021 languageName: node linkType: hard @@ -10790,13 +10883,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -11593,12 +11679,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.20.0": - version: 1.21.7 - resolution: "jiti@npm:1.21.7" +"jiti@npm:^2.0.0": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" bin: - jiti: bin/jiti.js - checksum: 10/6a182521532126e4b7b5ad64b64fb2e162718fc03bc6019c21aa2222aacde6c6dfce4fc3bce9f69561a73b24ab5f79750ad353c37c3487a220d5869a39eae3a2 + jiti: lib/jiti-cli.mjs + checksum: 10/e2b07eb2e3fbb245e29ad288dddecab31804967fc84d5e01d39858997d2743b5e248946defcecf99272275a00284ecaf7ec88b8c841331324f0c946d8274414b languageName: node linkType: hard @@ -11857,7 +11943,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -13027,7 +13113,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -16949,7 +17035,7 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0, text-table@npm:~0.2.0": +"text-table@npm:~0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 @@ -17268,13 +17354,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10/8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3"