diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 45612615..00000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/common/headlessService/__generated__.ts -src/common/venuesService/__generated__.ts -src/common/eventsService/__generated__.ts \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 1a2662e7..00000000 --- a/.eslintrc +++ /dev/null @@ -1,94 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "plugins": ["react", "@typescript-eslint", "import"], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/errors", - "plugin:import/warnings", - "plugin:import/typescript", - "airbnb", - "prettier" // this should always be the last item on this array - ], - "parserOptions": { - "ecmaVersion": 2018, - "ecmaFeatures": { - "jsx": true - } - }, - "ignorePatterns": ["*.module.scss"], - "settings": { - "react": { - "version": "detect" - }, - "import/resolver": { - "node": { - "extensions": [".js", ".jsx", ".ts", ".tsx"], - "paths": ["src"] - } - } - }, - "env": { - "browser": true, - "jest": true - }, - "rules": { - "no-unused-vars": "off", - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/no-unused-vars": ["error"], - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": [ - "**/*.test.ts", - "**/*.test.tsx", - "**/test*.ts*", - "**/*.stories.tsx", - "rollup.config.json" - ] - } - ], - "import/extensions": "off", - "import/order": [ - "error", - { - "groups": [ - "builtin", - "external", - "internal", - ["parent", "sibling", "index"] - ], - "newlines-between": "always" - } - ], - "react/jsx-filename-extension": ["error", { "extensions": [".tsx"] }], - "react/jsx-props-no-spreading": "off", - "react/prop-types": "off", - "react/require-default-props": "off", - "react/react-in-jsx-scope": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "jsx-a11y/label-has-associated-control": [ - 2, - { - "required": { - "some": ["nesting", "id"] - } - } - ], - "no-shadow": "off", - "@typescript-eslint/no-shadow": ["error"], - "import/prefer-default-export": "off" - }, - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - "no-undef": "off" - } - } - ] -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..51e4e1d5 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,197 @@ +import js from '@eslint/js'; +import stylisticPlugin from '@stylistic/eslint-plugin'; +import tseslint from 'typescript-eslint'; +import tsParser from '@typescript-eslint/parser'; +import importPlugin from 'eslint-plugin-import'; +import jsxA11yPlugin from 'eslint-plugin-jsx-a11y'; +import prettierPlugin from 'eslint-plugin-prettier'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; +import globals from 'globals'; + +const files = [ + '**/*.js', + '**/*.jsx', + '**/*.ts', + '**/*.tsx', + '**/*.cjs', + '**/*.mjs', +]; + +export default [ + // Ignores + { + ignores: [ + 'src/common/eventsService/__generated__.ts', + 'src/common/headlessService/__generated__.ts', + 'src/common/venuesService/__generated__.ts', + ], + }, + + js.configs.recommended, + tseslint.configs.eslintRecommended, + ...tseslint.configs.recommended, + + // react config + { + files, + plugins: { react: reactPlugin }, + rules: { + ...reactPlugin.configs.recommended.rules, + 'react/jsx-filename-extension': ['error', { extensions: ['.tsx'] }], + 'react/jsx-props-no-spreading': 'off', + 'react/prop-types': 'off', + 'react/require-default-props': 'off', + 'react/react-in-jsx-scope': 'off', + // Extra + 'react/jsx-no-target-blank': 'warn', + 'react/jsx-no-useless-fragment': 'warn', + 'react/function-component-definition': ['error'], + 'react/no-array-index-key': 'error', + }, + }, + + // react-hooks config + { + files, + plugins: { 'react-hooks': reactHooksPlugin }, + rules: reactHooksPlugin.configs.recommended.rules, + }, + + // jsx-a11y config + { + files, + plugins: { 'jsx-a11y': jsxA11yPlugin }, + rules: { + ...jsxA11yPlugin.flatConfigs.recommended.rules, + 'jsx-a11y/label-has-associated-control': [ + 2, + { + required: { + some: ['nesting', 'id'], + }, + }, + ], + }, + }, + + // import config + { + files, + plugins: { import: importPlugin }, + rules: { + ...importPlugin.flatConfigs.errors.rules, + ...importPlugin.flatConfigs.warnings.rules, + ...importPlugin.flatConfigs.typescript.rules, + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: [ + 'src/common/utils/customRender.tsx', // Used by tests only + '**/*.test.ts*', + '**/__mocks__/*.ts*', + '**/mocks/**/*.ts*', + '**/*.stories.ts*', + 'rollup.config.*', + ], + }, + ], + 'import/extensions': 'off', + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + ['parent', 'sibling', 'index'], + ], + 'newlines-between': 'always', + }, + ], + 'import/prefer-default-export': 'off', + }, + }, + + // Stylistic rules + { + files, + plugins: { '@stylistic': stylisticPlugin }, + rules: { + '@stylistic/brace-style': ['error', '1tbs', { allowSingleLine: true }], + 'array-bracket-spacing': ['warn', 'never'], + 'object-curly-spacing': ['warn', 'always'], + }, + }, + + // prettier config + { + files, + plugins: { prettier: prettierPlugin }, + rules: { + ...prettierPlugin.configs.recommended.rules, + 'prettier/prettier': 'error', + // Turn off rules that may cause problems, see + // https://github.com/prettier/eslint-plugin-prettier/issues/65 + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + }, + }, + + // General rules + { + files, + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: 2018, + ecmaFeatures: { jsx: true }, + projectService: true, // For enabling types + tsconfigRootDir: import.meta.dirname, + }, + globals: { + ...globals.browser, + ...globals.jest, + }, + }, + settings: { + react: { version: 'detect' }, + 'import/resolver': { + node: { + extensions: ['.js', '.jsx', '.ts', '.tsx'], + paths: ['src'], + }, + }, + }, + linterOptions: { + reportUnusedDisableDirectives: true, + }, + rules: { + 'consistent-return': 'error', + 'func-names': ['error', 'always'], + 'no-bitwise': 'error', + 'no-console': 'warn', + 'no-nested-ternary': 'error', + 'no-plusplus': 'error', + 'no-shadow': 'off', + 'no-undef': 'warn', + 'no-underscore-dangle': 'error', + 'no-unused-vars': 'off', + }, + }, + + // Overrides for typescript files + { + files: ['**/*.ts', '**/*.tsx'], + rules: { + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error'], + '@typescript-eslint/no-shadow': ['error'], + 'no-undef': 'off', + 'no-empty-function': 'off', // Disable base rule to avoid conflicts + '@typescript-eslint/no-empty-function': 'warn', // Enable TS version + }, + }, +]; diff --git a/package.json b/package.json index 9e64413b..7d39cfc3 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "dev": "yarn storybook", "dev:no-open": "yarn storybook --no-open", "typecheck": "tsc --project ./tsconfig.json --noEmit", - "lint": "yarn eslint \"src/**/*.{ts,tsx}\" && yarn prettier ./src -c", - "lint-fix": "yarn eslint \"src/**/*.{ts,tsx}\" --fix && yarn prettier ./src -w", + "lint": "yarn eslint src && yarn prettier ./src -c", + "lint-fix": "yarn eslint src --fix && yarn prettier ./src -w", "test": "jest", "test:staged": "jest --findRelatedTests --passWithNoTests", "test-storybook": "test-storybook", @@ -82,6 +82,7 @@ "@chromatic-com/storybook": "^4.1.3", "@commitlint/cli": "^20.2.0", "@commitlint/config-conventional": "^20.2.0", + "@eslint/js": "^9.39.2", "@graphql-codegen/cli": "^5.0.7", "@graphql-codegen/typescript": "^4.1.6", "@graphql-codegen/typescript-operations": "^4.6.1", @@ -97,6 +98,7 @@ "@storybook/preset-scss": "^1.0.3", "@storybook/react-webpack5": "^10.1.6", "@storybook/test-runner": "^0.24.2", + "@stylistic/eslint-plugin": "^5.6.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", @@ -106,8 +108,6 @@ "@types/lodash-es": "^4.17.12", "@types/react": "^18.3.27", "@types/react-dom": "18.3.7", - "@typescript-eslint/eslint-plugin": "^8.49.0", - "@typescript-eslint/parser": "^8.49.0", "axe-playwright": "^2.2.2", "babel-jest": "^30.2.0", "babel-loader": "^9.2.1", @@ -115,14 +115,15 @@ "crypto-browserify": "^3.12.1", "css-loader": "^6.11.0", "edit-json-file": "^1.8.1", - "eslint": "^8.57.1", - "eslint-config-airbnb": "^19.0.4", - "eslint-config-prettier": "^9.1.2", + "eslint": "^9.39.2", + "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-hooks": "^7.0.1", "git-rev-sync": "^3.0.2", + "globals": "^16.5.0", "graphql": "^16.12.0", "hds-react": "4.8.1", "husky": "^9.1.7", @@ -152,6 +153,7 @@ "style-loader": "^4.0.0", "tslib": "^2.8.1", "typescript": "^5.9.3", + "typescript-eslint": "^8.49.0", "webpack": "^5.103.0" }, "dependencies": { diff --git a/prettierignore b/prettierignore deleted file mode 100644 index 8bb81b82..00000000 --- a/prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -graphql.ts -graphql.tsx \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js index bb994859..07e8832a 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,4 @@ /* eslint-disable no-use-before-define */ -/* eslint-disable import/no-extraneous-dependencies */ import path from 'path'; import babel from '@rollup/plugin-babel'; diff --git a/src/apollo/apollo-custom-template.stories.tsx b/src/apollo/apollo-custom-template.stories.tsx index a132f5e1..7f8176f3 100644 --- a/src/apollo/apollo-custom-template.stories.tsx +++ b/src/apollo/apollo-custom-template.stories.tsx @@ -59,9 +59,10 @@ const CustomPageContentLayout: typeof PageContentLayout = ({ ); -const getTemplate = - (dataSource: keyof typeof CmsEndpoint): StoryFn => - (args) => { +function getTemplate( + dataSource: keyof typeof CmsEndpoint, +): StoryFn { + return function ApolloCustomTemplate(args) { const { apolloClient, eventsApolloClient, @@ -99,6 +100,7 @@ const getTemplate = ); }; +} export default { title: 'Apollo examples/Custom template', diff --git a/src/apollo/apollo.stories.tsx b/src/apollo/apollo.stories.tsx index 97cdd5d8..43d355b7 100644 --- a/src/apollo/apollo.stories.tsx +++ b/src/apollo/apollo.stories.tsx @@ -36,9 +36,10 @@ const ExampleNavigation = ({ /> ); -const getTemplate = - (datasource: keyof typeof CmsEndpoint): StoryFn => - (args) => { +function getTemplate( + datasource: keyof typeof CmsEndpoint, +): StoryFn { + return function ApolloTemplate(args) { const { apolloClient, eventsApolloClient, @@ -76,6 +77,7 @@ const getTemplate = ); }; +} export default { title: 'Apollo examples/Basic', diff --git a/src/apollo/navigation/__tests__/Navigation.test.tsx b/src/apollo/navigation/__tests__/Navigation.test.tsx index 03f3ef51..71676945 100644 --- a/src/apollo/navigation/__tests__/Navigation.test.tsx +++ b/src/apollo/navigation/__tests__/Navigation.test.tsx @@ -1,6 +1,8 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ import React from 'react'; +import { screen, waitFor } from '@testing-library/react'; -import { render, screen, waitFor } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { server } from '../../../mocks/server'; import { CmsEndpoint } from '../../../storybook-common/constants'; import { getApolloConfig } from '../../../tests/apolloConfig'; diff --git a/src/apollo/notification/__tests__/Notification.test.tsx b/src/apollo/notification/__tests__/Notification.test.tsx index c0bc9cb3..dcfd43b7 100644 --- a/src/apollo/notification/__tests__/Notification.test.tsx +++ b/src/apollo/notification/__tests__/Notification.test.tsx @@ -1,6 +1,7 @@ import React from 'react'; +import { screen, waitFor } from '@testing-library/react'; -import { render, screen, waitFor } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { server } from '../../../mocks/server'; import { CmsEndpoint } from '../../../storybook-common/constants'; import { getApolloConfig } from '../../../tests/apolloConfig'; diff --git a/src/common/components/grid/Grid.tsx b/src/common/components/grid/Grid.tsx index ad6879bf..84d3d3f4 100644 --- a/src/common/components/grid/Grid.tsx +++ b/src/common/components/grid/Grid.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from './grid.module.scss'; diff --git a/src/common/components/htmlToReact/HtmlToReact.tsx b/src/common/components/htmlToReact/HtmlToReact.tsx index 22886064..e573c806 100644 --- a/src/common/components/htmlToReact/HtmlToReact.tsx +++ b/src/common/components/htmlToReact/HtmlToReact.tsx @@ -7,7 +7,6 @@ import type { Element, } from 'html-react-parser'; import parse, { domToReact, attributesToProps } from 'html-react-parser'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from './htmlToReact.module.scss'; diff --git a/src/common/components/htmlToReact/__tests__/HtmlToReact.tests.tsx b/src/common/components/htmlToReact/__tests__/HtmlToReact.tests.tsx index 2b8505b5..77c79189 100644 --- a/src/common/components/htmlToReact/__tests__/HtmlToReact.tests.tsx +++ b/src/common/components/htmlToReact/__tests__/HtmlToReact.tests.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { render } from '../../../utils/testingLibrary'; +import { customRender as render } from '../../../utils/customRender'; import type { HtmlToReactProps } from '../HtmlToReact'; import { HtmlToReact } from '../HtmlToReact'; import kukkuuPageDemosivu from '../../../../mocks/responses/cms/page/kukkuu-page-demosivu.json'; diff --git a/src/common/components/list/List.tsx b/src/common/components/list/List.tsx index 7305216b..6eac2de0 100644 --- a/src/common/components/list/List.tsx +++ b/src/common/components/list/List.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from './list.module.scss'; diff --git a/src/common/components/tag/Tag.tsx b/src/common/components/tag/Tag.tsx index 1735a5bc..b3beba4e 100644 --- a/src/common/components/tag/Tag.tsx +++ b/src/common/components/tag/Tag.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { Tag as HDSTag } from 'hds-react'; import type { TagProps as HDSTagProps } from 'hds-react'; diff --git a/src/common/headlessService/utils.ts b/src/common/headlessService/utils.ts index f43d9e55..83bc835a 100644 --- a/src/common/headlessService/utils.ts +++ b/src/common/headlessService/utils.ts @@ -291,7 +291,7 @@ export function getUri( return uri; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +// eslint-disable-next-line @typescript-eslint/no-explicit-any const getNodeText = (node: any): string => { if (['string', 'number'].includes(typeof node)) return node; if (node instanceof Array) return node.map(getNodeText).join(''); diff --git a/src/common/utils/testingLibrary.tsx b/src/common/utils/customRender.tsx similarity index 79% rename from src/common/utils/testingLibrary.tsx rename to src/common/utils/customRender.tsx index 1b538ee1..ea2e0c62 100644 --- a/src/common/utils/testingLibrary.tsx +++ b/src/common/utils/customRender.tsx @@ -6,7 +6,7 @@ import { render } from '@testing-library/react'; import type { Config } from '../../core'; import { ConfigProvider, defaultConfig } from '../../core'; -const customRender = ( +export const customRender = ( ui: ReactElement, options?: Omit, config?: Partial, @@ -20,7 +20,3 @@ const customRender = ( } return render(ui, { wrapper: AllTheProviders, ...options }); }; - -export * from '@testing-library/react'; -export { customRender as render }; -export { default as userEvent } from '@testing-library/user-event'; diff --git a/src/core/archiveSearchPageContent/ArchiveSearchPageContent.tsx b/src/core/archiveSearchPageContent/ArchiveSearchPageContent.tsx index 1e369ef5..fea00a25 100644 --- a/src/core/archiveSearchPageContent/ArchiveSearchPageContent.tsx +++ b/src/core/archiveSearchPageContent/ArchiveSearchPageContent.tsx @@ -1,5 +1,4 @@ -import React, { useEffect, useState } from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies +import React, { useState } from 'react'; import classNames from 'classnames'; import { Button, @@ -265,17 +264,12 @@ export function SearchPageContent(props: SearchPageContentProps) { mainContentId, } = useConfig(); - const [searchText, setSearchText] = useState(''); - const [searchTags, setSearchTags] = useState([]); - - useEffect(() => { - if (withQuery) { - if (currentTags?.length > 0) { - setSearchTags(currentTags); - } - setSearchText(currentText); - } - }, [currentTags, currentText, withQuery]); + const [searchText, setSearchText] = useState( + withQuery ? currentText : '', + ); + const [searchTags, setSearchTags] = useState( + withQuery ? currentTags : [], + ); const handleSearch = (e: React.FormEvent): void => { e.preventDefault(); diff --git a/src/core/card/LargeCard.tsx b/src/core/card/LargeCard.tsx index d1709b7a..a2b2b51e 100644 --- a/src/core/card/LargeCard.tsx +++ b/src/core/card/LargeCard.tsx @@ -1,6 +1,5 @@ import { IconArrowRight } from 'hds-react'; import React, { useState } from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from './largeCard.module.scss'; diff --git a/src/core/carousel/constants.ts b/src/core/carousel/constants.ts index b4732e26..0af315cd 100644 --- a/src/core/carousel/constants.ts +++ b/src/core/carousel/constants.ts @@ -14,6 +14,7 @@ const initialCarouselContextProps: CarouselContextComponentPropsType = { itemsShownOnMobile: 1, withDots: false, navigateWithDots: true, + // eslint-disable-next-line @typescript-eslint/no-empty-function onLoadMore: () => {}, hasMore: false, loading: false, @@ -29,6 +30,7 @@ export const initialCarouselContextStateValues = { currentSlide: 0, width: 0, numberOfItems: 0, + // eslint-disable-next-line @typescript-eslint/no-empty-function handleUpdateSlideProps: () => {}, ...initialCarouselContextProps, } as const satisfies Omit< diff --git a/src/core/collection/Collection.tsx b/src/core/collection/Collection.tsx index edb5f8d7..685530c0 100644 --- a/src/core/collection/Collection.tsx +++ b/src/core/collection/Collection.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { LoadingSpinner } from 'hds-react'; diff --git a/src/core/collection/__tests__/Collection.test.tsx b/src/core/collection/__tests__/Collection.test.tsx index 13d08145..2feddfe7 100644 --- a/src/core/collection/__tests__/Collection.test.tsx +++ b/src/core/collection/__tests__/Collection.test.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { addDays, addYears, subDays, subYears } from 'date-fns'; +import { screen, waitFor } from '@testing-library/react'; -import { render, screen, waitFor } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { server } from '../../../mocks/server'; import { EventSearchCollection, EventSelectionCollection } from '../Collection'; import { diff --git a/src/core/configProvider/defaultConfig.tsx b/src/core/configProvider/defaultConfig.tsx index 3f50fc4f..581d5025 100644 --- a/src/core/configProvider/defaultConfig.tsx +++ b/src/core/configProvider/defaultConfig.tsx @@ -79,7 +79,6 @@ export const defaultConfig = { return false; }, - // eslint-disable-next-line @typescript-eslint/no-unused-vars getRoutedInternalHref: ( link?: string | null, // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/src/core/contentContainer/ContentContainer.tsx b/src/core/contentContainer/ContentContainer.tsx index e81e534a..8fc43e44 100644 --- a/src/core/contentContainer/ContentContainer.tsx +++ b/src/core/contentContainer/ContentContainer.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from './contentContainer.module.scss'; diff --git a/src/core/hero/Hero.tsx b/src/core/hero/Hero.tsx index 3de52168..0f2caf8e 100644 --- a/src/core/hero/Hero.tsx +++ b/src/core/hero/Hero.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { Button, diff --git a/src/core/image/__tests__/BackgroundImage.test.tsx b/src/core/image/__tests__/BackgroundImage.test.tsx index c4b334a7..9a861717 100644 --- a/src/core/image/__tests__/BackgroundImage.test.tsx +++ b/src/core/image/__tests__/BackgroundImage.test.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { axe } from 'jest-axe'; +import { waitFor } from '@testing-library/react'; -import { render, waitFor } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { BackgroundImage } from '../BackgroundImage'; const mockImage = { diff --git a/src/core/image/__tests__/Image.test.tsx b/src/core/image/__tests__/Image.test.tsx index ee0fc0a3..1b3ffdce 100644 --- a/src/core/image/__tests__/Image.test.tsx +++ b/src/core/image/__tests__/Image.test.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { axe } from 'jest-axe'; +import { screen, waitFor } from '@testing-library/react'; -import { render, screen, waitFor } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { Image } from '../Image'; const mockImage = { diff --git a/src/core/imageGallery/ImageItem.tsx b/src/core/imageGallery/ImageItem.tsx index 5a1f4dad..a53eb949 100644 --- a/src/core/imageGallery/ImageItem.tsx +++ b/src/core/imageGallery/ImageItem.tsx @@ -1,7 +1,5 @@ /* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/no-static-element-interactions */ -/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import React from 'react'; diff --git a/src/core/imageGallery/Lightbox.tsx b/src/core/imageGallery/Lightbox.tsx index 74b2bf89..1d258feb 100644 --- a/src/core/imageGallery/Lightbox.tsx +++ b/src/core/imageGallery/Lightbox.tsx @@ -1,7 +1,7 @@ /* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/no-static-element-interactions */ /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ -// eslint-disable-next-line import/no-extraneous-dependencies + import classNames from 'classnames'; import ReactDOM from 'react-dom'; import React, { useCallback, useEffect, useRef } from 'react'; diff --git a/src/core/link/LinkBase.tsx b/src/core/link/LinkBase.tsx index f045f8f1..4a12777c 100644 --- a/src/core/link/LinkBase.tsx +++ b/src/core/link/LinkBase.tsx @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { IconLinkExternal, IconSize } from 'hds-react'; import React, { Children, isValidElement, useMemo } from 'react'; @@ -119,140 +118,136 @@ export const getTextFromReactChildren = (children: ReactNode): string => { ) as string; }; -export default React.forwardRef( - ( - { - children, - className, - disableVisitedStyles = true, - external = false, - showExternalIcon = true, - href, - iconLeft, - iconRight, - openInNewTab = false, - openInExternalDomainAriaLabel, - openInNewTabAriaLabel, - style = {}, - size = 'M', - inlineIcons = false, - ...rest - }: LinkProps, - ref: React.Ref, - ) => { - const composeAriaLabel = () => { - let childrenText = getTextFromReactChildren(children); - const newTabText = openInNewTab - ? openInNewTabAriaLabel || 'Avautuu uudessa välilehdessä.' - : ''; - const externalText = external - ? openInExternalDomainAriaLabel || 'Siirtyy toiseen sivustoon.' - : ''; - - if ( - childrenText && - childrenText.slice(-1) !== '.' && - (newTabText || externalText) - ) { - childrenText = `${childrenText}.`; - } - - const label = [childrenText, newTabText, externalText] - .filter((text) => text) - .join(' '); - if (!label.trim()) { - return undefined; - } - return label; - }; - - const ZERO_WIDTH_NO_BREAK_SPACE = '\uFEFF'; - - const leftIcon = useMemo( - () => - (iconLeft && ( - - )) || - null, - [iconLeft, inlineIcons], - ); - - const externalIcon = useMemo( - () => - (showExternalIcon && external && ( - - {inlineIcons && ZERO_WIDTH_NO_BREAK_SPACE} - - - )) || - null, - [showExternalIcon, external, inlineIcons, size], - ); - - const rightIcon = useMemo( - () => - (iconRight && ( - , +) { + const composeAriaLabel = () => { + let childrenText = getTextFromReactChildren(children); + const newTabText = openInNewTab + ? openInNewTabAriaLabel || 'Avautuu uudessa välilehdessä.' + : ''; + const externalText = external + ? openInExternalDomainAriaLabel || 'Siirtyy toiseen sivustoon.' + : ''; + + if ( + childrenText && + childrenText.slice(-1) !== '.' && + (newTabText || externalText) + ) { + childrenText = `${childrenText}.`; + } + + const label = [childrenText, newTabText, externalText] + .filter((text) => text) + .join(' '); + if (!label.trim()) { + return undefined; + } + return label; + }; + + const ZERO_WIDTH_NO_BREAK_SPACE = '\uFEFF'; + + const leftIcon = useMemo( + () => + (iconLeft && ( + + )) || + null, + [iconLeft, inlineIcons], + ); + + const externalIcon = useMemo( + () => + (showExternalIcon && external && ( + + {inlineIcons && ZERO_WIDTH_NO_BREAK_SPACE} + - )) || - null, - [iconRight, inlineIcons, size], - ); - - return ( - // eslint-disable-next-line react/jsx-no-target-blank - - {!inlineIcons && leftIcon} + aria-hidden + /> + + )) || + null, + [showExternalIcon, external, inlineIcons, size], + ); + + const rightIcon = useMemo( + () => + (iconRight && ( - {!inlineIcons && externalIcon} - {!inlineIcons && rightIcon} - - ); - }, -); + )) || + null, + [iconRight, inlineIcons, size], + ); + + return ( + + {!inlineIcons && leftIcon} + + {inlineIcons && leftIcon} + {children} + {inlineIcons && externalIcon} + {inlineIcons && rightIcon} + + {!inlineIcons && externalIcon} + {!inlineIcons && rightIcon} + + ); +} + +export default React.forwardRef(LinkBase); diff --git a/src/core/link/SecondaryLink.tsx b/src/core/link/SecondaryLink.tsx index f1291230..9428b3f4 100644 --- a/src/core/link/SecondaryLink.tsx +++ b/src/core/link/SecondaryLink.tsx @@ -1,6 +1,5 @@ import { IconAngleRight } from 'hds-react'; import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import type { LinkProps } from './Link'; diff --git a/src/core/link/__tests__/Link.test.tsx b/src/core/link/__tests__/Link.test.tsx index 60a578c8..000cf176 100644 --- a/src/core/link/__tests__/Link.test.tsx +++ b/src/core/link/__tests__/Link.test.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { axe } from 'jest-axe'; +import { screen } from '@testing-library/react'; -import { render, screen } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { Link } from '../Link'; test('for accessibility violations', async () => { diff --git a/src/core/linkBox/LinkBox.tsx b/src/core/linkBox/LinkBox.tsx index 80f1ae17..ed123c02 100644 --- a/src/core/linkBox/LinkBox.tsx +++ b/src/core/linkBox/LinkBox.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { Link } from '../link/Link'; diff --git a/src/core/navigation/Navigation.tsx b/src/core/navigation/Navigation.tsx index ca932082..f46de0b2 100644 --- a/src/core/navigation/Navigation.tsx +++ b/src/core/navigation/Navigation.tsx @@ -103,7 +103,7 @@ export function Navigation({ copy: { menuButtonLabel, menuToggleAriaLabel, skipToContentLabel }, components: { A }, mainContentId, - utils: { getRoutedInternalHref }, + utils: { getRoutedInternalHref, redirectToUrl }, } = useConfig(); const languagesData = languages || []; @@ -122,8 +122,8 @@ export function Navigation({ newLanguage && currentLanguage ? getPathnameForLanguage(newLanguage, currentLanguage, languagesData) : undefined; - if (url && window) { - window.location.href = url; + if (url) { + redirectToUrl(url); } }; diff --git a/src/core/notification/__tests__/Notification.test.tsx b/src/core/notification/__tests__/Notification.test.tsx index 3efddeb2..d66dcf35 100644 --- a/src/core/notification/__tests__/Notification.test.tsx +++ b/src/core/notification/__tests__/Notification.test.tsx @@ -1,11 +1,8 @@ import React from 'react'; +import { screen, waitFor } from '@testing-library/react'; +import { userEvent } from '@testing-library/user-event'; -import { - render, - screen, - userEvent, - waitFor, -} from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { Notification } from '../Notification'; import notificationMock from '../__mocks__/notification.mock'; diff --git a/src/core/page/Page.tsx b/src/core/page/Page.tsx index f9e4088d..7d03dd10 100644 --- a/src/core/page/Page.tsx +++ b/src/core/page/Page.tsx @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import React from 'react'; diff --git a/src/core/pageContent/PageContent.tsx b/src/core/pageContent/PageContent.tsx index a22be2a3..e0560c6c 100644 --- a/src/core/pageContent/PageContent.tsx +++ b/src/core/pageContent/PageContent.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { useConfig } from '../configProvider/useConfig'; diff --git a/src/core/pageContent/PageContentLayout.tsx b/src/core/pageContent/PageContentLayout.tsx index b9d36b60..25846f3c 100644 --- a/src/core/pageContent/PageContentLayout.tsx +++ b/src/core/pageContent/PageContentLayout.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from './pageContentLayout.module.scss'; diff --git a/src/core/pageContent/__tests__/Page.test.tsx b/src/core/pageContent/__tests__/Page.test.tsx index e6bd3d7d..0cc5b9af 100644 --- a/src/core/pageContent/__tests__/Page.test.tsx +++ b/src/core/pageContent/__tests__/Page.test.tsx @@ -1,6 +1,7 @@ import React from 'react'; +import { screen } from '@testing-library/react'; -import { render, screen } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import pageMock, { sidebarLinkList } from '../__mocks__/page.mock'; import { PageContent } from '../PageContent'; import kukkuuPageDemosivu from '../../../mocks/responses/cms/page/kukkuu-page-demosivu.json'; diff --git a/src/core/pageContent/sidebarContent/__tests__/SidebarContent.test.tsx b/src/core/pageContent/sidebarContent/__tests__/SidebarContent.test.tsx index 67ae4124..b339ce14 100644 --- a/src/core/pageContent/sidebarContent/__tests__/SidebarContent.test.tsx +++ b/src/core/pageContent/sidebarContent/__tests__/SidebarContent.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import SidebarContentLinkList from '../SidebarContentLinkList'; -import { render } from '../../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../../common/utils/customRender'; describe('SidebarContent containing link lists', () => { const baseLinkItem = { diff --git a/src/core/pageModules/CardsModule/CardsModule.tsx b/src/core/pageModules/CardsModule/CardsModule.tsx index 41fdb585..82d6b434 100644 --- a/src/core/pageModules/CardsModule/CardsModule.tsx +++ b/src/core/pageModules/CardsModule/CardsModule.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from '../pageModules.module.scss'; diff --git a/src/core/pageModules/CardsModule/Icon.tsx b/src/core/pageModules/CardsModule/Icon.tsx index 633fb2ec..634d6065 100644 --- a/src/core/pageModules/CardsModule/Icon.tsx +++ b/src/core/pageModules/CardsModule/Icon.tsx @@ -7,7 +7,6 @@ type IconProps = { }; export function Icon({ name }: IconProps) { - // eslint-disable-next-line react/jsx-no-useless-fragment const fallback = () =>
; const IconComponent = React.useMemo( () => diff --git a/src/core/pageModules/CardsModule/SimpleCard.tsx b/src/core/pageModules/CardsModule/SimpleCard.tsx index 600f27db..21298232 100644 --- a/src/core/pageModules/CardsModule/SimpleCard.tsx +++ b/src/core/pageModules/CardsModule/SimpleCard.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { Button, diff --git a/src/core/pageModules/ContentModule/ContentModule.tsx b/src/core/pageModules/ContentModule/ContentModule.tsx index 13505be4..6e3f3e9d 100644 --- a/src/core/pageModules/ContentModule/ContentModule.tsx +++ b/src/core/pageModules/ContentModule/ContentModule.tsx @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import React from 'react'; diff --git a/src/core/pageModules/SocialMediaFeedModule/SocialMediaFeedModule.tsx b/src/core/pageModules/SocialMediaFeedModule/SocialMediaFeedModule.tsx index 49fec293..ae453ba3 100644 --- a/src/core/pageModules/SocialMediaFeedModule/SocialMediaFeedModule.tsx +++ b/src/core/pageModules/SocialMediaFeedModule/SocialMediaFeedModule.tsx @@ -25,6 +25,15 @@ export function SocialMediaFeedModule({ const scriptWrapperRef = useRef(null); + const clean = useMemo( + () => + DOMPurify.sanitize(script ?? '', { + FORCE_BODY: true, + ADD_TAGS: ['script', 'div'], + }), + [script], + ); + useLayoutEffect(() => { if (scriptWrapperRef.current?.innerHTML) { const range = document.createRange(); @@ -35,7 +44,7 @@ export function SocialMediaFeedModule({ scriptWrapperRef.current.innerHTML = ''; scriptWrapperRef.current.append(documentFragment); } - }, [scriptWrapperRef.current?.innerHTML]); + }, [clean, trustedOrigins]); const sanitizeScripts = (domNode: DOMNode) => { if ('attribs' in domNode) { @@ -54,15 +63,6 @@ export function SocialMediaFeedModule({ return domNode; }; - const clean = useMemo( - () => - DOMPurify.sanitize(script ?? '', { - FORCE_BODY: true, - ADD_TAGS: ['script', 'div'], - }), - [script], - ); - const htmlReactParserOptions = { replace: (domNode: DOMNode) => sanitizeScripts(domNode), }; diff --git a/src/core/pageModules/StepsModule/StepsModule.tsx b/src/core/pageModules/StepsModule/StepsModule.tsx index 51fca149..49d4674b 100644 --- a/src/core/pageModules/StepsModule/StepsModule.tsx +++ b/src/core/pageModules/StepsModule/StepsModule.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { StepByStep } from 'hds-react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import styles from '../pageModules.module.scss'; diff --git a/src/core/pageSection/PageSection.tsx b/src/core/pageSection/PageSection.tsx index ef7ab02e..13f1abcd 100644 --- a/src/core/pageSection/PageSection.tsx +++ b/src/core/pageSection/PageSection.tsx @@ -1,5 +1,4 @@ import React from 'react'; -// eslint-disable-next-line import/no-extraneous-dependencies import classNames from 'classnames'; import { Koros } from 'hds-react'; diff --git a/src/core/pageSection/__tests__/PageSection.test.tsx b/src/core/pageSection/__tests__/PageSection.test.tsx index 741120ad..e4b4fb5c 100644 --- a/src/core/pageSection/__tests__/PageSection.test.tsx +++ b/src/core/pageSection/__tests__/PageSection.test.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { axe } from 'jest-axe'; +import { waitFor } from '@testing-library/react'; -import { render, waitFor } from '../../../common/utils/testingLibrary'; +import { customRender as render } from '../../../common/utils/customRender'; import { PageSection } from '../PageSection'; const mockImage = { diff --git a/src/core/utils/__tests__/findAllElementsOfType.test.tsx b/src/core/utils/__tests__/findAllElementsOfType.test.tsx index 09b0dbf2..0caa95c5 100644 --- a/src/core/utils/__tests__/findAllElementsOfType.test.tsx +++ b/src/core/utils/__tests__/findAllElementsOfType.test.tsx @@ -27,14 +27,14 @@ describe('findAllElementsOfType', () => { [nestedListItems, ['li'], 3], // 3 x
  • [nestedListItems, ['ul', 'ol', 'li'], 5], //
      ,
        , 3 x
      1. [ -
        +
        {nestedListItems}
        , ['li'], 3, // 3 x
      2. ], [ -
        +
        {nestedListItems}
        diff --git a/src/core/utils/__tests__/recursiveMap.test.tsx b/src/core/utils/__tests__/recursiveMap.test.tsx index 3821eeab..6b538df3 100644 --- a/src/core/utils/__tests__/recursiveMap.test.tsx +++ b/src/core/utils/__tests__/recursiveMap.test.tsx @@ -27,7 +27,7 @@ describe('recursiveMap', () => { [flattenedListItems, jest.fn(), 2], // 2 x
      3. [nestedListItems, jest.fn(), 1 + 1 + 3], //
          ,
            and 3 x
          1. [ -
            +
            {nestedListItems}
            , jest.fn(), @@ -76,7 +76,7 @@ describe('recursiveMap', () => { it.each([ [nestedListItems, 'li', 3], [ -
            +

            1/3

            2/3

            diff --git a/src/mocks/queries/cms/languages.ts b/src/mocks/queries/cms/languages.ts index 4f6f6a7e..4d39fe67 100644 --- a/src/mocks/queries/cms/languages.ts +++ b/src/mocks/queries/cms/languages.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import { graphql, HttpResponse } from 'msw'; import languages from '../../responses/cms/languages/hobbies-languages.json'; diff --git a/src/mocks/queries/linkedEvents/eventList.ts b/src/mocks/queries/linkedEvents/eventList.ts index 6ddeab8e..25ce17d9 100644 --- a/src/mocks/queries/linkedEvents/eventList.ts +++ b/src/mocks/queries/linkedEvents/eventList.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import { graphql, HttpResponse } from 'msw'; import tapahtumatEventListFrontPageCarousel from '../../responses/linkedEvents/eventList/tapahtumat-eventlist-frontpage.json'; diff --git a/src/nextjs/getLanguageStaticProps.ts b/src/nextjs/getLanguageStaticProps.ts index f58738a9..0158ee6c 100644 --- a/src/nextjs/getLanguageStaticProps.ts +++ b/src/nextjs/getLanguageStaticProps.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import type { ApolloClient, NormalizedCacheObject } from '@apollo/client'; import type { diff --git a/src/nextjs/getMenuStaticProps.ts b/src/nextjs/getMenuStaticProps.ts index 53f3cd15..9b85eb8e 100644 --- a/src/nextjs/getMenuStaticProps.ts +++ b/src/nextjs/getMenuStaticProps.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import type { ApolloClient, NormalizedCacheObject } from '@apollo/client'; import type { diff --git a/src/nextjs/getPageStaticProps.ts b/src/nextjs/getPageStaticProps.ts index b69481eb..52be8f15 100644 --- a/src/nextjs/getPageStaticProps.ts +++ b/src/nextjs/getPageStaticProps.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-extraneous-dependencies import type { ApolloClient, NormalizedCacheObject } from '@apollo/client'; import type { diff --git a/src/tests/hideConsoleMessages.ts b/src/tests/hideConsoleMessages.ts index 91b497a2..c7e330ef 100644 --- a/src/tests/hideConsoleMessages.ts +++ b/src/tests/hideConsoleMessages.ts @@ -14,7 +14,6 @@ export type ConsoleLevel = (typeof consoleLevels)[number]; export const hideConsoleMessages = ( consoleMessagesToHide: Partial>, ) => { - // eslint-disable-next-line no-restricted-syntax for (const consoleLevel of consoleLevels) { const hidablePatterns = consoleMessagesToHide[consoleLevel]; if (hidablePatterns && hidablePatterns.length > 0) { diff --git a/yarn.lock b/yarn.lock index 59e710d4..124d5aa5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -122,7 +122,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.18.9", "@babel/core@^7.22.5", "@babel/core@^7.23.9", "@babel/core@^7.26.0", "@babel/core@^7.26.10", "@babel/core@^7.27.4", "@babel/core@^7.28.0", "@babel/core@^7.28.5", "@babel/core@^7.7.5": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.18.9", "@babel/core@^7.22.5", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.26.0", "@babel/core@^7.26.10", "@babel/core@^7.27.4", "@babel/core@^7.28.0", "@babel/core@^7.28.5", "@babel/core@^7.7.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== @@ -305,7 +305,7 @@ "@babel/template" "^7.27.2" "@babel/types" "^7.28.4" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.10", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.26.10", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== @@ -1507,37 +1507,73 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz#5efe5a112938b1180e98c76685ff9185cfa4f16e" integrity sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw== -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": +"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.0": version "4.9.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/config-array@^0.21.1": + version "0.21.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" + integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz#26393a0806501b5e2b6a43aa588a4d8df67880ac" + integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^4.1.0" + js-yaml "^4.1.1" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@eslint/js@9.39.2", "@eslint/js@^9.39.2": + version "9.39.2" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" + integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== + dependencies: + "@eslint/core" "^0.17.0" + levn "^0.4.1" "@fastify/busboy@^3.1.1": version "3.2.0" @@ -2087,24 +2123,28 @@ resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.9.11.tgz#9ce96e7746625a89239f68ca57c4f654264c17ef" integrity sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ== -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@inquirer/ansi@^1.0.2": version "1.0.2" @@ -2716,7 +2756,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -3353,6 +3393,18 @@ rimraf "^3.0.2" uuid "^8.3.2" +"@stylistic/eslint-plugin@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.6.1.tgz#98e1371757881eecce69b1ec497ef6fc7d6470c9" + integrity sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw== + dependencies: + "@eslint-community/eslint-utils" "^4.9.0" + "@typescript-eslint/types" "^8.47.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + estraverse "^5.3.0" + picomatch "^4.0.3" + "@swc/core-darwin-arm64@1.15.3": version "1.15.3" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz#bd0bd3ab7730e3ffa64cf200c0ed7c572cbaba97" @@ -3614,7 +3666,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.8": +"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== @@ -3840,7 +3892,7 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^8.49.0": +"@typescript-eslint/eslint-plugin@8.49.0": version "8.49.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz#8ed8736b8415a9193989220eadb6031dbcd2260a" integrity sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A== @@ -3854,6 +3906,17 @@ natural-compare "^1.4.0" ts-api-utils "^2.1.0" +"@typescript-eslint/parser@8.49.0": + version "8.49.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.49.0.tgz#0ede412d59e99239b770f0f08c76c42fba717fa2" + integrity sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA== + dependencies: + "@typescript-eslint/scope-manager" "8.49.0" + "@typescript-eslint/types" "8.49.0" + "@typescript-eslint/typescript-estree" "8.49.0" + "@typescript-eslint/visitor-keys" "8.49.0" + debug "^4.3.4" + "@typescript-eslint/parser@^6.19.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" @@ -3865,17 +3928,6 @@ "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" -"@typescript-eslint/parser@^8.49.0": - version "8.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.49.0.tgz#0ede412d59e99239b770f0f08c76c42fba717fa2" - integrity sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA== - dependencies: - "@typescript-eslint/scope-manager" "8.49.0" - "@typescript-eslint/types" "8.49.0" - "@typescript-eslint/typescript-estree" "8.49.0" - "@typescript-eslint/visitor-keys" "8.49.0" - debug "^4.3.4" - "@typescript-eslint/project-service@8.49.0": version "8.49.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.49.0.tgz#ce220525c88cb2d23792b391c07e14cb9697651a" @@ -3922,7 +3974,7 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/types@8.49.0", "@typescript-eslint/types@^8.49.0": +"@typescript-eslint/types@8.49.0", "@typescript-eslint/types@^8.47.0", "@typescript-eslint/types@^8.49.0": version "8.49.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.49.0.tgz#c1bd3ebf956d9e5216396349ca23c58d74f06aee" integrity sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ== @@ -3982,7 +4034,7 @@ "@typescript-eslint/types" "8.49.0" eslint-visitor-keys "^4.2.1" -"@ungap/structured-clone@^1.2.0", "@ungap/structured-clone@^1.3.0": +"@ungap/structured-clone@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== @@ -4337,7 +4389,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0, acorn@^8.9.0: +acorn@^8.15.0: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -5502,11 +5554,6 @@ concat-with-sourcemaps@^1.1.0: dependencies: source-map "^0.6.1" -confusing-browser-globals@^1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - constant-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" @@ -5672,7 +5719,7 @@ cross-inspect@1.0.1: dependencies: tslib "^2.4.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -6586,29 +6633,13 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-airbnb-base@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" - integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== - dependencies: - confusing-browser-globals "^1.0.10" - object.assign "^4.1.2" - object.entries "^1.1.5" - semver "^6.3.0" - -eslint-config-airbnb@^19.0.4: - version "19.0.4" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3" - integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== +eslint-import-context@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" + integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== dependencies: - eslint-config-airbnb-base "^15.0.0" - object.assign "^4.1.2" - object.entries "^1.1.5" - -eslint-config-prettier@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz#90deb4fa0259592df774b600dbd1d2249a78ce91" - integrity sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ== + get-tsconfig "^4.10.1" + stable-hash-x "^0.2.0" eslint-import-resolver-node@^0.3.9: version "0.3.9" @@ -6619,6 +6650,19 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" +eslint-import-resolver-typescript@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz#3e83a9c25f4a053fe20e1b07b47e04e8519a8720" + integrity sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw== + dependencies: + debug "^4.4.1" + eslint-import-context "^0.1.8" + get-tsconfig "^4.10.1" + is-bun-module "^2.0.0" + stable-hash-x "^0.2.0" + tinyglobby "^0.2.14" + unrs-resolver "^1.7.11" + eslint-module-utils@^2.12.1: version "2.12.1" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" @@ -6672,10 +6716,24 @@ eslint-plugin-jsx-a11y@^6.10.2: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.1" -eslint-plugin-react-hooks@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" - integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== +eslint-plugin-prettier@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz#9d61c4ea11de5af704d4edf108c82ccfa7f2e61c" + integrity sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.11.7" + +eslint-plugin-react-hooks@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" + integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== + dependencies: + "@babel/core" "^7.24.4" + "@babel/parser" "^7.24.4" + hermes-parser "^0.25.1" + zod "^3.25.0 || ^4.0.0" + zod-validation-error "^3.5.0 || ^4.0.0" eslint-plugin-react@^7.37.5: version "7.37.5" @@ -6709,10 +6767,10 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -6727,65 +6785,61 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@^8.57.1: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" +eslint@^9.39.2: + version "9.39.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" + integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.1" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.39.2" + "@eslint/plugin-kit" "^0.4.1" + "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" ajv "^6.12.4" chalk "^4.0.0" - cross-spawn "^7.0.2" + cross-spawn "^7.0.6" debug "^4.3.2" - 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" - esquery "^1.4.2" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" esutils "^2.0.2" 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.19.0" - graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: - acorn "^8.9.0" + acorn "^8.15.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.2.1" esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== @@ -6929,6 +6983,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + fast-glob@^3.0.3, fast-glob@^3.2.9: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" @@ -7019,12 +7078,12 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" filesize@^10.0.12: version "10.1.6" @@ -7126,6 +7185,14 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flatted@^3.2.9: version "3.3.3" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" @@ -7347,6 +7414,13 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" +get-tsconfig@^4.10.1: + version "4.13.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.0.tgz#fcdd991e6d22ab9a600f00e91c318707a5d9a0d7" + integrity sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ== + dependencies: + resolve-pkg-maps "^1.0.0" + git-raw-commits@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285" @@ -7433,12 +7507,15 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" + integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== globalthis@^1.0.4: version "1.0.4" @@ -7489,11 +7566,6 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - graphql-config@^5.1.1: version "5.1.5" resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-5.1.5.tgz#34e0bfba88e74b6eefd889716a9378086f595f7f" @@ -7687,6 +7759,18 @@ headers-polyfill@^4.0.2: resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== +hermes-estree@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" + integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== + +hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" + integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== + dependencies: + hermes-estree "0.25.1" + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -8079,6 +8163,13 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-bun-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" + integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== + dependencies: + semver "^7.7.1" + is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -8220,7 +8311,7 @@ is-path-cwd@^2.2.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -9375,7 +9466,7 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0, js-yaml@^4.1.0: +js-yaml@^4.0.0, js-yaml@^4.1.0, js-yaml@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== @@ -9542,7 +9633,7 @@ kashe@1.0.4: function-double "^1.0.4" reselect "^4.0.0" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -10145,7 +10236,7 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -10395,7 +10486,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.7: +object.assign@^4.1.4, object.assign@^4.1.7: version "4.1.7" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== @@ -10407,7 +10498,7 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.7: has-symbols "^1.1.0" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.9: +object.entries@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== @@ -11146,6 +11237,13 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + prettier@3.7.4: version "3.7.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.7.4.tgz#d2f8335d4b1cec47e1c8098645411b0c9dff9c0f" @@ -11684,6 +11782,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve.exports@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" @@ -11998,7 +12101,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.7.2: +semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.7.1, semver@^7.7.2: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== @@ -12277,6 +12380,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +stable-hash-x@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" + integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -12630,7 +12738,7 @@ sync-fetch@0.6.0-2: timeout-signal "^2.0.0" whatwg-mimetype "^4.0.0" -synckit@^0.11.8: +synckit@^0.11.7, synckit@^0.11.8: version "0.11.11" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.11.tgz#c0b619cf258a97faa209155d9cd1699b5c998cb0" integrity sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw== @@ -12682,11 +12790,6 @@ text-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -12712,7 +12815,7 @@ tinyexec@^1.0.0: resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251" integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== -tinyglobby@^0.2.15: +tinyglobby@^0.2.14, tinyglobby@^0.2.15: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== @@ -12912,11 +13015,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -13005,6 +13103,16 @@ typedarray.prototype.slice@^1.0.5: typed-array-buffer "^1.0.3" typed-array-byte-offset "^1.0.4" +typescript-eslint@^8.49.0: + version "8.49.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.49.0.tgz#4a8b608ae48c0db876c8fb2a2724839fc5a7147c" + integrity sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg== + dependencies: + "@typescript-eslint/eslint-plugin" "8.49.0" + "@typescript-eslint/parser" "8.49.0" + "@typescript-eslint/typescript-estree" "8.49.0" + "@typescript-eslint/utils" "8.49.0" + typescript@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" @@ -13726,6 +13834,16 @@ zen-observable@0.8.15: resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== +"zod-validation-error@^3.5.0 || ^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" + integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== + +"zod@^3.25.0 || ^4.0.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.2.0.tgz#01e86f2c2b6d525a1b9fa6dbe78beccad082118f" + integrity sha512-Bd5fw9wlIhtqCCxotZgdTOMwGm1a0u75wARVEY9HMs1X17trvA/lMi4+MGK5EUfYkXVTbX8UDiDKW4OgzHVUZw== + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"