From ab648faef7164464f02d2a0f20ec54262ccced73 Mon Sep 17 00:00:00 2001 From: Maurovic Cachia Date: Sun, 22 Mar 2026 20:16:58 +0100 Subject: [PATCH 01/27] Moved to eslint v9, along with the most high impact changes --- .eslintignore | 14 - .eslintrc.cjs | 97 -- .vscode/settings.json | 3 +- eslint.config.js | 168 +++ front/.eslintrc.cjs | 17 - front/src/App.tsx | 9 +- .../BoxReconciliationOverlay.test.tsx | 1 - .../components/BoxReconciliationAccordion.tsx | 25 +- .../components/MatchProductsForm.tsx | 50 +- .../components/ReceiveLocationForm.tsx | 5 +- .../components/HeaderMenu/BaseSwitcher.tsx | 10 +- .../components/QrReader/QrReaderContainer.tsx | 2 +- .../components/QrReaderMultiBoxContainer.tsx | 12 +- front/src/components/Table/Filter.tsx | 2 +- front/src/components/Timeline/Timeline.tsx | 2 +- .../hooks/useLoadAndSetGlobalPreferences.ts | 51 +- front/src/mocks/functions.ts | 2 +- front/src/providers/ApolloAuth0Provider.tsx | 2 +- front/src/tests/test-utils.tsx | 1 - front/src/views/Box/BoxView.tsx | 12 +- .../Box/components/AddItemsToBoxOverlay.tsx | 5 +- front/src/views/Box/components/BoxCard.tsx | 10 +- .../components/TakeItemsFromBoxOverlay.tsx | 7 +- front/src/views/BoxCreate/BoxCreateView.tsx | 11 +- .../views/BoxCreate/components/BoxCreate.tsx | 35 +- .../src/views/BoxEdit/components/BoxEdit.tsx | 53 +- .../views/Boxes/components/BoxesFilter.tsx | 34 +- .../Boxes/components/RemoveTagsButton.tsx | 18 +- .../components/CreateCustomProductForm.tsx | 11 +- .../components/PackedContentListOverlay.tsx | 16 +- ...kingScanBoxOrFindByLabelOverlayContent.tsx | 2 +- .../DistrosDashboardView.tsx | 10 +- .../views/Distributions/dataTransformers.ts | 6 +- .../EditCustomProductView.tsx | 4 +- .../components/EditStandardProductForm.tsx | 5 +- .../components/EnableStandardProductForm.tsx | 5 +- .../components/CreateShipment.tsx | 41 +- .../Transfers/ShipmentView/ShipmentView.tsx | 71 +- .../ShipmentView/components/ShipmentCard.tsx | 6 +- .../components/ShipmentContent.tsx | 4 +- .../ShipmentView/components/ShipmentTabs.tsx | 2 +- package.json | 28 +- pnpm-lock.yaml | 1344 +++++------------ shared-components/.eslintrc.cjs | 18 - .../custom-graphs/BarChartCenterAxis.tsx | 10 +- .../components/filter/TabbedTagDropdown.tsx | 29 +- .../components/filter/TabbedTagFilter.tsx | 4 +- .../components/filter/TimeRangeSelect.tsx | 7 +- .../statviz/components/nivo/SankeyChart.tsx | 6 +- .../statviz/components/nivo/Sunburst.tsx | 2 +- .../CreatedBoxesFilterContainer.tsx | 7 +- .../createdBoxes/TopCreatedProducts.tsx | 47 +- .../DemographicFilterContainer.tsx | 10 +- .../demographic/DemographicPyramid.tsx | 110 +- .../movedBoxes/BoxFlowSankey.tsx | 4 +- .../movedBoxes/MovedBoxesFilterContainer.tsx | 17 +- .../visualizations/stock/StockDataFilter.tsx | 4 +- .../visualizations/stock/StockOverviewPie.tsx | 2 +- .../statviz/hooks/useIncludeExcludeFilter.ts | 97 ++ .../statviz/hooks/useMultiSelectFilter.ts | 107 +- .../statviz/hooks/useShareableLink.ts | 24 +- .../statviz/hooks/useValueFilter.ts | 9 +- shared-components/tests/testUtils.tsx | 1 - shared-front/.eslintrc.cjs | 19 - shared-front/src/App.tsx | 15 +- 65 files changed, 1075 insertions(+), 1687 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.cjs create mode 100644 eslint.config.js delete mode 100644 front/.eslintrc.cjs delete mode 100644 shared-components/.eslintrc.cjs create mode 100644 shared-components/statviz/hooks/useIncludeExcludeFilter.ts delete mode 100644 shared-front/.eslintrc.cjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index be8ebb846a..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -build -dist -coverage -node_modules -public -*.js -*.old.* - -# Disabled until we move to tanStack table v8 -react-table-config.d.ts -# Disable linting for generated files from the GraphQL codegen -generated -graphql.ts -vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index ffb0653134..0000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,97 +0,0 @@ -/** @type {import("eslint").Linter.Config} */ -module.exports = { - // It does not look for a configuration file upwards from the root directory. - root: true, - // This defines env variables - env: { browser: true, es2020: true }, - // ignore linting for these files - ignorePatterns: ["dist", ".eslintrc.cjs", ".eslintrc"], - // loads settings and rules from other eslint configs - extends: [ - "eslint:recommended", - // TODO: try out plugin:@typescript-eslint/recommended-type-checked - "plugin:@typescript-eslint/eslint-recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended-legacy", - "plugin:jsx-a11y/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - // put prettier config last so that it can override all formatting rules - "prettier", - ], - // regarding @typescript-eslint: https://typescript-eslint.io/linting/typed-linting/monorepos - parser: "@typescript-eslint/parser", - parserOptions: { - tsconfigRootDir: __dirname, - project: ["./*/tsconfig.json", "./tsconfig.json"], - }, - plugins: ["@typescript-eslint"], - settings: { - react: { version: "detect" }, - // --------- Import Plugin Settings --------- - // This defines the parser to use for .ts and .tsx files - "import/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx"], - }, - // this defines how eslint resolves import statements - "import/resolver": { - node: { - // resolve imports with these extensions - extensions: [".ts", ".tsx"], - // look here for modules of import statements - moduleDirectory: ["node_modules", "src"], - }, - typescript: { - // always try to resolve types - alwaysTryTypes: true, - // look here for tsconfig files - project: ["./*/tsconfig.json", "./tsconfig.json"], - }, - }, - }, - rules: { - // --------- typescipt-eslint Plugin Rules --------- - // enforce to have interfaces/type should start with "I". - "@typescript-eslint/naming-convention": [ - "error", - { - selector: "interface", - format: ["PascalCase"], - }, - ], - // --------- React Plugin Rules --------- - // we do not need to import React in every file - "react/react-in-jsx-scope": "off", - "react/jsx-props-no-spreading": "off", - // allow other than jsx extensions - "react/jsx-filename-extension": [1, { extensions: [".js", ".jsx", ".ts", ".tsx"] }], - // --------- Import Plugin Rules --------- - // ensure that all modules that are imported are actually declared in a package.json file - "import/no-extraneous-dependencies": ["error"], - // ensure that all modules that are imported can be resolved to a module on the local filesystem - "import/no-unresolved": [2, { caseSensitive: true }], - // ensure consistent use of file extension within the import statements - "import/extensions": [ - "error", - // ignore rule when importing from packages - "ignorePackages", - // ignore rule when importing from .js, .jsx, .ts, .tsx files - { - js: "never", - jsx: "never", - ts: "never", - tsx: "never", - }, - ], - }, - overrides: [ - { - files: [ - "**/?(__)tests?(__)/**/*.[jt]s?(x)", - "**/?(*.)+(spec|test).[jt]s?(x)", - "**/mocks/**/*.[jt]s?(x)", - ], - extends: ["plugin:testing-library/react"], - }, - ], -}; diff --git a/.vscode/settings.json b/.vscode/settings.json index f7d635bcef..10759ecc4d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -30,7 +30,8 @@ "typescript.tsdk": "node_modules/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, - "eslint.useFlatConfig": false, + + "eslint.useFlatConfig": true, "git.enableCommitSigning": true } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000..a6bce9a224 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,168 @@ +const path = require("path"); +const js = require("@eslint/js"); +const tsParser = require("@typescript-eslint/parser"); +const tsPlugin = require("@typescript-eslint/eslint-plugin"); +const reactPlugin = require("eslint-plugin-react"); +const hooksPlugin = require("eslint-plugin-react-hooks"); +const jsxA11yPlugin = require("eslint-plugin-jsx-a11y"); +const importPlugin = require("eslint-plugin-import"); +const testingLibraryPlugin = require("eslint-plugin-testing-library"); +const prettierConfig = require("eslint-config-prettier"); +const globals = require("globals"); +const { fixupPluginRules } = require("@eslint/compat"); +const { reactRefresh } = require("eslint-plugin-react-refresh"); + +module.exports = [ + // 1. Global Ignores (Replaces ignorePatterns) + { + ignores: [ + "**/dist/**", + "**/build/**", + "**/coverage/**", + "**/node_modules/**", + "**/.eslintrc.config.cjs", + "**/vite.config.ts", + "**/generated/**", + "**/graphql.ts", + "back/scripts/**", + "front/public/**", + "shared-front/public/**", + "eslint.config.js", + ], + }, + + // 2. Base Configuration for JS/TS/React + { + files: ["**/*.{js,jsx,ts,tsx}"], + languageOptions: { + parser: tsParser, + globals: { + ...globals.browser, + ...globals.es2020, + }, + parserOptions: { + tsconfigRootDir: __dirname, + project: ["./*/tsconfig.json", "./tsconfig.json"], + ecmaFeatures: { jsx: true }, + }, + }, + plugins: { + "@typescript-eslint": tsPlugin, + react: reactPlugin, + "react-hooks": fixupPluginRules(hooksPlugin), + "jsx-a11y": jsxA11yPlugin, + import: fixupPluginRules(importPlugin), + }, + settings: { + react: { version: "detect" }, + "import/resolver": { + typescript: { + alwaysTryTypes: true, + project: ["./*/tsconfig.json", "./tsconfig.json"], + }, + node: { + extensions: [".ts", ".tsx"], + moduleDirectory: ["node_modules", "src"], + }, + }, + }, + rules: { + ...js.configs.recommended.rules, + ...tsPlugin.configs.recommended.rules, + ...reactPlugin.configs.recommended.rules, + ...hooksPlugin.configs.recommended.rules, + ...jsxA11yPlugin.configs.recommended.rules, + + // Custom Rules + "@typescript-eslint/naming-convention": [ + "error", + { + selector: "interface", + format: ["PascalCase"], + }, + ], + "react/react-in-jsx-scope": "off", + "no-undef": "off", + "react/jsx-props-no-spreading": "off", + "react/jsx-filename-extension": [1, { extensions: [".js", ".jsx", ".ts", ".tsx"] }], + "import/no-extraneous-dependencies": ["error"], + "import/no-unresolved": ["error", { caseSensitive: true }], + "import/extensions": [ + "error", + "ignorePackages", + { + js: "never", + jsx: "never", + ts: "never", + tsx: "never", + }, + ], + //TODO This is done so that 'any' types can be change slowly, and not all at once + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-wrapper-object-types": "error", + }, + }, + + // 3. Testing Overrides + { + files: [ + "**/?(__)tests?(__)/**/*.[jt]s?(x)", + "**/?(*.)+(spec|test).[jt]s?(x)", + "**/mocks/**/*.[jt]s?(x)", + ], + plugins: { + "testing-library": testingLibraryPlugin, + }, + rules: { + ...testingLibraryPlugin.configs.react.rules, + }, + }, + + //sub-stuff + { + files: ["front/**/*.{ts,tsx,js,jsx}"], + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + // look for package.json files also in the parent directory + packageDir: [path.resolve(__dirname, "front"), __dirname], + }, + ], + }, + }, + + { + files: ["shared-components/**/*.{ts,tsx,js,jsx}"], + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + // look for package.json files also in the parent directory + packageDir: [path.resolve(__dirname, "shared-components"), __dirname], + }, + ], + }, + }, + + { + files: ["shared-front/**/*.{ts,tsx,js,jsx}"], + plugins: { + "react-refresh": reactRefresh.plugin, + }, + rules: { + // This needed to resolve dependencies correctly + "import/no-extraneous-dependencies": [ + "error", + { + // look for package.json files also in the parent directory + packageDir: [path.resolve(__dirname, "shared-front"), __dirname], + }, + ], + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], + }, + }, + + // 4. Prettier (Must be last to override formatting) + prettierConfig, +]; diff --git a/front/.eslintrc.cjs b/front/.eslintrc.cjs deleted file mode 100644 index bfc43e8f28..0000000000 --- a/front/.eslintrc.cjs +++ /dev/null @@ -1,17 +0,0 @@ -const path = require("path"); - -// PLEASE DO NOT ADD CONFIG HERE -// Add config to ../.eslintrc.cjs instead -// This file is just needed to resolve dependencies correctly -module.exports = { - extends: ["../.eslintrc.cjs"], - rules: { - "import/no-extraneous-dependencies": [ - "error", - { - // look for package.json files also in the parent directory - packageDir: [__dirname, path.join(__dirname, "../")], - }, - ], - }, -}; diff --git a/front/src/App.tsx b/front/src/App.tsx index 640de721ef..6cfd6b1050 100644 --- a/front/src/App.tsx +++ b/front/src/App.tsx @@ -102,11 +102,10 @@ function App() { const hasExecutedInitialFetchOfBoxes = useRef(false); // store previous location to return to if you are not authorized - useEffect(() => { - const regex = /^\/bases\/\d+\//; - // only store previous location if a base is selected - if (regex.test(location.pathname)) setPrevLocation(location.pathname); - }, [location]); + // only store previous location if a base is selected + if (/^\/bases\/\d+\//.test(location.pathname) && location.pathname !== prevLocation) { + setPrevLocation(location.pathname); + } if (error) { return ; diff --git a/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx b/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx index bf2280f154..cf3a0a7b6e 100644 --- a/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx +++ b/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx @@ -15,7 +15,6 @@ import { mockedCreateToast, mockedTriggerError } from "tests/setupTests"; import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions"; vi.mock("@auth0/auth0-react"); -// @ts-ignore window.scrollTo = vi.fn(); // .mocked() is a nice helper function from jest for typescript support diff --git a/front/src/components/BoxReconciliationOverlay/components/BoxReconciliationAccordion.tsx b/front/src/components/BoxReconciliationOverlay/components/BoxReconciliationAccordion.tsx index 6a6c232ae4..d3ce6b4075 100644 --- a/front/src/components/BoxReconciliationOverlay/components/BoxReconciliationAccordion.tsx +++ b/front/src/components/BoxReconciliationOverlay/components/BoxReconciliationAccordion.tsx @@ -15,7 +15,7 @@ import { RiQuestionFill } from "react-icons/ri"; import { ILocationData, IProductWithSizeRangeData } from "./BoxReconciliationView"; import { MatchProductsFormData, MatchProductsForm } from "./MatchProductsForm"; import { IReceiveLocationFormData, ReceiveLocationForm } from "./ReceiveLocationForm"; -import { useAtom, useAtomValue, useSetAtom } from "jotai"; +import { useAtomValue, useSetAtom } from "jotai"; import { reconciliationMatchProductAtom, reconciliationReceiveLocationAtom, @@ -55,27 +55,25 @@ export function BoxReconcilationAccordion({ onBoxUndelivered, onBoxDelivered, }: IBoxReconcilationAccordionProps) { - const [reconciliationMatchProductCache, setReconciliationMatchProductCache] = useAtom( - reconciliationMatchProductAtom, - ); - const cachedReconciliationMatchProduct = useAtomValue(reconciliationMatchProductAtom); + const reconciliationMatchProductCache = useAtomValue(reconciliationMatchProductAtom); + const setReconciliationMatchProductCache = useSetAtom(reconciliationMatchProductAtom); const setReconciliationReceiveLocationCache = useSetAtom(reconciliationReceiveLocationAtom); // source side const sourceProductId = shipmentDetail.sourceProduct?.id; const sourceSizeId = shipmentDetail.sourceSize?.id; const isSourceProductInCache = - sourceProductId && !!cachedReconciliationMatchProduct[sourceProductId]; + sourceProductId && !!reconciliationMatchProductCache[sourceProductId]; // target side const isTargetProductAutoMatched = !!shipmentDetail?.autoMatchingTargetProduct; const targetProductName = isSourceProductInCache - ? cachedReconciliationMatchProduct[sourceProductId].productId.label + ? reconciliationMatchProductCache[sourceProductId].productId.label : isTargetProductAutoMatched && shipmentDetail?.autoMatchingTargetProduct ? shipmentDetail.autoMatchingTargetProduct.name : undefined; const targetProductId = isSourceProductInCache - ? cachedReconciliationMatchProduct[sourceProductId].productId.value + ? reconciliationMatchProductCache[sourceProductId].productId.value : isTargetProductAutoMatched && shipmentDetail?.autoMatchingTargetProduct ? shipmentDetail.autoMatchingTargetProduct.id : undefined; @@ -86,12 +84,12 @@ export function BoxReconcilationAccordion({ return sourceSizeId && possibleSizeIds.includes(sourceSizeId); }); const targetSizeName = isSourceProductInCache - ? cachedReconciliationMatchProduct[sourceProductId].sizeId.label + ? reconciliationMatchProductCache[sourceProductId].sizeId.label : isTargetProductAutoMatched && isSourceSizeInRangeOfTargetProduct && shipmentDetail?.sourceSize ? shipmentDetail.sourceSize.label : undefined; const targetSizeId = isSourceProductInCache - ? cachedReconciliationMatchProduct[sourceProductId].sizeId.value + ? reconciliationMatchProductCache[sourceProductId].sizeId.value : isTargetProductAutoMatched && isSourceSizeInRangeOfTargetProduct && shipmentDetail?.sourceSize ? shipmentDetail.sourceSize.id : undefined; @@ -187,9 +185,10 @@ export function BoxReconcilationAccordion({ setAccordionIndex(1); if (shipmentDetail.sourceProduct?.id) { - reconciliationMatchProductCache[shipmentDetail.sourceProduct.id] = - matchedProductsFormData; - setReconciliationMatchProductCache(reconciliationMatchProductCache); + setReconciliationMatchProductCache({ + ...reconciliationMatchProductCache, + [shipmentDetail.sourceProduct.id]: matchedProductsFormData, + }); } setProductFormData({ diff --git a/front/src/components/BoxReconciliationOverlay/components/MatchProductsForm.tsx b/front/src/components/BoxReconciliationOverlay/components/MatchProductsForm.tsx index da13328a7e..3dc4b35231 100644 --- a/front/src/components/BoxReconciliationOverlay/components/MatchProductsForm.tsx +++ b/front/src/components/BoxReconciliationOverlay/components/MatchProductsForm.tsx @@ -1,9 +1,9 @@ -import { useEffect, useRef, useState } from "react"; +import { useEffect, useMemo, useRef } from "react"; import { Box, Button, Flex, Text, Wrap, WrapItem } from "@chakra-ui/react"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { groupBy } from "lodash"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { BiSubdirectoryRight } from "react-icons/bi"; import { BsFillCheckCircleFill } from "react-icons/bs"; import { IProductWithSizeRangeData } from "./BoxReconciliationView"; @@ -69,7 +69,6 @@ export function MatchProductsForm({ const { handleSubmit, control, - watch, resetField, formState: { errors, isSubmitting }, } = useForm({ @@ -78,39 +77,32 @@ export function MatchProductsForm({ }); // needed for updating size select field for new product - const productId = watch("productId"); - const sizeId = watch("sizeId"); + const productId = useWatch({ control, name: "productId" }); + const sizeId = useWatch({ control, name: "sizeId" }); const productRef = useRef(); // sizes reset depending on selected product - const [sizesOptionsForCurrentProduct, setSizesOptionsForCurrentProduct] = useState< - IDropdownOption[] - >([]); + const sizesOptionsForCurrentProduct: IDropdownOption[] = useMemo( + () => + productId + ? (productAndSizesData + .find((p) => p.id === productId.value) + ?.sizeRange?.sizes?.map((s) => ({ label: s.label, value: s.id })) ?? []) + : [], + [productId, productAndSizesData], + ); useEffect(() => { - if (productId != null) { - const productAndSizeDataForCurrentProduct = productAndSizesData.find( - (p) => p.id === productId.value, - ); - const prepSizesOptionsForCurrentProduct = - productAndSizeDataForCurrentProduct?.sizeRange?.sizes?.map((s) => ({ - label: s.label, - value: s.id, - })) || []; - setSizesOptionsForCurrentProduct(() => prepSizesOptionsForCurrentProduct); - - // Reset size if the product reference is different than the currently selected product - if (productRef.current !== productId.value) { - productRef.current = productId.value; - // if there is only one option select it directly - if (prepSizesOptionsForCurrentProduct.length === 1) { - resetField("sizeId", { defaultValue: prepSizesOptionsForCurrentProduct[0] }); - } else { - resetField("sizeId", { defaultValue: undefined }); - } + if (productId != null && productRef.current !== productId.value) { + productRef.current = productId.value; + // if there is only one option select it directly + if (sizesOptionsForCurrentProduct.length === 1) { + resetField("sizeId", { defaultValue: sizesOptionsForCurrentProduct[0] }); + } else { + resetField("sizeId", { defaultValue: undefined }); } } - }, [productId, productAndSizesData, resetField]); + }, [productId, sizesOptionsForCurrentProduct, resetField]); // Option Preparations for select fields const productsGroupedByCategory: Record = groupBy( diff --git a/front/src/components/BoxReconciliationOverlay/components/ReceiveLocationForm.tsx b/front/src/components/BoxReconciliationOverlay/components/ReceiveLocationForm.tsx index c2354005f8..50459d35ef 100644 --- a/front/src/components/BoxReconciliationOverlay/components/ReceiveLocationForm.tsx +++ b/front/src/components/BoxReconciliationOverlay/components/ReceiveLocationForm.tsx @@ -2,7 +2,7 @@ import { Button, Flex } from "@chakra-ui/react"; import { zodResolver } from "@hookform/resolvers/zod"; import SelectField from "components/Form/SelectField"; import { useEffect } from "react"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { BsFillCheckCircleFill } from "react-icons/bs"; import { FaWarehouse } from "react-icons/fa"; import { z } from "zod"; @@ -57,7 +57,6 @@ export function ReceiveLocationForm({ // react-hook-form const { control, - watch, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ @@ -65,7 +64,7 @@ export function ReceiveLocationForm({ defaultValues, }); - const locationId = watch("locationId"); + const locationId = useWatch({ control, name: "locationId" }); useEffect(() => { if ( diff --git a/front/src/components/HeaderMenu/BaseSwitcher.tsx b/front/src/components/HeaderMenu/BaseSwitcher.tsx index aec440a141..c3e0f2ca5d 100644 --- a/front/src/components/HeaderMenu/BaseSwitcher.tsx +++ b/front/src/components/HeaderMenu/BaseSwitcher.tsx @@ -11,7 +11,7 @@ import { RadioGroup, Stack, } from "@chakra-ui/react"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useNavigate, useLocation, useParams } from "react-router-dom"; import { useAtomValue } from "jotai"; import { availableBasesAtom, selectedBaseIdAtom } from "stores/globalPreferenceStore"; @@ -25,11 +25,13 @@ function BaseSwitcher({ isOpen, onClose }: { isOpen: boolean; onClose: () => voi const currentOrganisationBases = availableBases.filter((base) => base.id !== baseId); const firstAvailableBaseId = currentOrganisationBases.find((base) => base)?.id; const [value, setValue] = useState(firstAvailableBaseId); + const [prevFirstAvailableBaseId, setPrevFirstAvailableBaseId] = useState(firstAvailableBaseId); - // Need to set this as soon as we have this value available to set the default radio selection. - useEffect(() => { + // Need to reset the default radio selection whenever the available bases change. + if (firstAvailableBaseId !== prevFirstAvailableBaseId) { + setPrevFirstAvailableBaseId(firstAvailableBaseId); setValue(firstAvailableBaseId); - }, [firstAvailableBaseId, baseId]); + } const switchBase = () => { const currentPath = pathname.split(`/bases/${urlBaseId}`)[1]; diff --git a/front/src/components/QrReader/QrReaderContainer.tsx b/front/src/components/QrReader/QrReaderContainer.tsx index 636ecf09b3..da783494b8 100644 --- a/front/src/components/QrReader/QrReaderContainer.tsx +++ b/front/src/components/QrReader/QrReaderContainer.tsx @@ -90,7 +90,7 @@ function QrReaderContainer({ onSuccess }: IQrReaderContainerProps) { // Only execute for Multi Box tab // add box reference to query for list of all scanned boxes - if (qrResolvedValue?.box!) addBoxToScannedBoxes(qrResolvedValue?.box!); + if (qrResolvedValue.box) addBoxToScannedBoxes(qrResolvedValue.box); } setIsProcessingQrCode(false); break; diff --git a/front/src/components/QrReader/components/QrReaderMultiBoxContainer.tsx b/front/src/components/QrReader/components/QrReaderMultiBoxContainer.tsx index 096f985561..0b9245296d 100644 --- a/front/src/components/QrReader/components/QrReaderMultiBoxContainer.tsx +++ b/front/src/components/QrReader/components/QrReaderMultiBoxContainer.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useMemo, useState } from "react"; import { useQuery } from "@apollo/client"; import { useAtomValue } from "jotai"; import { GET_SCANNED_BOXES } from "queries/local-only"; @@ -168,11 +168,11 @@ function QrReaderMultiBoxContainer() { }, [baseId, hasShipmentPermission, optionsQueryResult.data]); // Assign To Shipment is default MultiBoxAction if there are shipments - useEffect(() => { - if (shipmentOptions.length > 0) { - setMultiBoxAction(IMultiBoxAction.assignShipment); - } - }, [shipmentOptions]); + const [prevShipmentOptionsLength, setPrevShipmentOptionsLength] = useState(0); + if (shipmentOptions.length > 0 && prevShipmentOptionsLength === 0) { + setPrevShipmentOptionsLength(shipmentOptions.length); + setMultiBoxAction(IMultiBoxAction.assignShipment); + } const notInStockBoxes = useMemo( () => scannedBoxesQueryResult.data?.scannedBoxes.filter((box) => box.state !== "InStock") ?? [], diff --git a/front/src/components/Table/Filter.tsx b/front/src/components/Table/Filter.tsx index 7318e84fc0..34b6b43840 100644 --- a/front/src/components/Table/Filter.tsx +++ b/front/src/components/Table/Filter.tsx @@ -20,7 +20,7 @@ interface ISelectOption { } // Utility Function to show Objects in filter in a more readible way -function ObjectToString(object: Object) { +function ObjectToString(object: object) { return Object.values(object).join(" - "); } diff --git a/front/src/components/Timeline/Timeline.tsx b/front/src/components/Timeline/Timeline.tsx index a3c497673c..981dc53d28 100644 --- a/front/src/components/Timeline/Timeline.tsx +++ b/front/src/components/Timeline/Timeline.tsx @@ -5,7 +5,7 @@ import { User } from "../../../../graphql/types"; export interface ITimelineEntry { action: string; createdOn: Date; - createdBy: User; + createdBy: Partial | null | undefined; } export interface IGroupedRecordEntry { diff --git a/front/src/hooks/useLoadAndSetGlobalPreferences.ts b/front/src/hooks/useLoadAndSetGlobalPreferences.ts index 3d442d75e6..f81553fba9 100644 --- a/front/src/hooks/useLoadAndSetGlobalPreferences.ts +++ b/front/src/hooks/useLoadAndSetGlobalPreferences.ts @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useMemo } from "react"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { useAuth0 } from "@auth0/auth0-react"; import { useLazyQuery } from "@apollo/client"; @@ -17,7 +17,6 @@ export const useLoadAndSetGlobalPreferences = () => { const { user } = useAuth0(); const authorize = useAuthorization(); const location = useLocation(); - const [error, setError] = useState(); const setOrganisation = useSetAtom(organisationAtom); const [selectedBase, setSelectedBase] = useAtom(selectedBaseAtom); const [availableBases, setAvailableBases] = useAtom(availableBasesAtom); @@ -32,15 +31,25 @@ export const useLoadAndSetGlobalPreferences = () => { authorize({ requiredAbps: ["create_shareable_link"] }).toString(), ); - // validate if base Ids are set in auth0 id token - if (!user || (!isGod && !user[JWT_AVAILABLE_BASES]?.length)) - setError("You do not have access to any bases."); - const [ runOrganisationAndBasesQuery, { loading: isOrganisationAndBasesQueryLoading, data: organisationAndBaseData }, ] = useLazyQuery(ORGANISATION_AND_BASES_QUERY); + const error = useMemo(() => { + if (!user || (!isGod && !user[JWT_AVAILABLE_BASES]?.length)) { + return "You do not have access to any bases."; + } else { + const urlBaseIdInput = location.pathname.match(/\/bases\/(\d+)(\/)?/); + const urlBaseId = urlBaseIdInput?.length && urlBaseIdInput[1]; + if (urlBaseId && !isGod && !user[JWT_AVAILABLE_BASES].map(String).includes(urlBaseId)) { + return "The requested base is not available to you."; + } + } + + return undefined; + }, [isGod, location.pathname, user]); + // run query only if // - the access token is in the request header from the apollo client and // - the base Name is not set @@ -74,8 +83,6 @@ export const useLoadAndSetGlobalPreferences = () => { // only overwrite the selected base ID if the id is different from the existing one. setSelectedBase({ id: urlBaseId }); } - } else { - setError("The requested base is not available to you."); } } } @@ -110,14 +117,8 @@ export const useLoadAndSetGlobalPreferences = () => { setSelectedBase({ id: matchingBase.id, name: matchingBase.name }); // set organisation for selected base setOrganisation(matchingBase.organisation); - } else { - // this error is set if the requested base is not part of the available bases - setError("The requested base is not available to you."); } } - } else { - // this error is set if the bases query returned an empty array for bases - setError("There are no available bases."); } } }, [ @@ -129,9 +130,29 @@ export const useLoadAndSetGlobalPreferences = () => { setSelectedBase, ]); + const finalError = useMemo(() => { + const basesWithOrgData = organisationAndBaseData?.bases; + const bases = basesWithOrgData?.map((base) => ({ + id: base.id, + name: base.name, + })); + + if (!bases || bases.length <= 0) { + return "There are no available bases."; + } else if (selectedBase?.id) { + const matchingBase = basesWithOrgData?.find((base) => base.id === selectedBase.id); + + if (!matchingBase) { + return "The requested base is not available to you."; + } + } + + return error; + }, [error, organisationAndBaseData?.bases, selectedBase?.id]); + const isLoading = !selectedBase?.name || isOrganisationAndBasesQueryLoading; const isInitialized = selectedBaseId !== "0"; - return { isLoading, error, isInitialized }; + return { isLoading, finalError, isInitialized }; }; diff --git a/front/src/mocks/functions.ts b/front/src/mocks/functions.ts index 4f57fe0977..2c2f4fe6cf 100644 --- a/front/src/mocks/functions.ts +++ b/front/src/mocks/functions.ts @@ -1,7 +1,7 @@ import { GraphQLError } from "graphql"; import { vi } from "vitest"; -export function mockMatchMediaQuery(returnBool: Boolean) { +export function mockMatchMediaQuery(returnBool: boolean) { // Jest does not implement window.matchMedia() which is used in the chackra ui hook useMediaQuery(). // To mock a result of useMediaQuery you have to define this property. The 'matches' boolean is the return value. // https://jestjs.io/docs/26.x/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom diff --git a/front/src/providers/ApolloAuth0Provider.tsx b/front/src/providers/ApolloAuth0Provider.tsx index f81fe07068..2ae5d340c8 100644 --- a/front/src/providers/ApolloAuth0Provider.tsx +++ b/front/src/providers/ApolloAuth0Provider.tsx @@ -14,7 +14,7 @@ import { getActiveSpan, startSpanManual } from "@sentry/react"; function ApolloAuth0Provider({ children }: { children: ReactNode }) { const { triggerError } = useErrorHandling(); const { isAuthenticated, getAccessTokenSilently } = useAuth0(); - const [auth0Token, setAuth0Token] = useState(""); + const [auth0Token, setAuth0Token] = useState(""); const httpLink = new HttpLink({ uri: import.meta.env.FRONT_GRAPHQL_SERVER, }); diff --git a/front/src/tests/test-utils.tsx b/front/src/tests/test-utils.tsx index 997830ae35..958ee86291 100644 --- a/front/src/tests/test-utils.tsx +++ b/front/src/tests/test-utils.tsx @@ -1,4 +1,3 @@ -/* eslint-disable import/export */ // TODO: Investigate possible render function overload. import React, { ReactNode } from "react"; diff --git a/front/src/views/Box/BoxView.tsx b/front/src/views/Box/BoxView.tsx index 1277debc3e..2e277a9026 100644 --- a/front/src/views/Box/BoxView.tsx +++ b/front/src/views/Box/BoxView.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo } from "react"; import { useMutation, useQuery, NetworkStatus } from "@apollo/client"; import { graphql } from "gql.tada"; import { @@ -210,7 +210,6 @@ function BTBox() { const { createToast } = useNotification(); const labelIdentifier = useParams<{ labelIdentifier: string }>().labelIdentifier!; const baseId = useAtomValue(selectedBaseIdAtom); - const [currentBoxState, setCurrentState] = useState(); const { isOpen: isHistoryOpen, onOpen: onHistoryOpen, onClose: onHistoryClose } = useDisclosure(); const { assignBoxesToShipment, @@ -231,10 +230,6 @@ function BTBox() { }, ); - const boxInTransit = currentBoxState - ? ["Receiving", "MarkedForShipment", "InTransit"].includes(currentBoxState) - : false; - // map over each box HistoryEntry to compile its timeline records const boxLogs: ITimelineEntry[] = allData.data?.box?.history?.flatMap((histories) => _.compact([ @@ -314,8 +309,11 @@ function BTBox() { const boxData = allData.data?.box; + const boxInTransit = boxData?.state + ? ["Receiving", "MarkedForShipment", "InTransit"].includes(boxData.state) + : false; + useEffect(() => { - setCurrentState(boxData?.state); const shipmentId = boxData?.shipmentDetail?.shipment.id; // open reconciliation overlay if the box state is receiving and if we're on the receiving side if ( diff --git a/front/src/views/Box/components/AddItemsToBoxOverlay.tsx b/front/src/views/Box/components/AddItemsToBoxOverlay.tsx index 4e8a3d5673..7abe1624ed 100644 --- a/front/src/views/Box/components/AddItemsToBoxOverlay.tsx +++ b/front/src/views/Box/components/AddItemsToBoxOverlay.tsx @@ -10,7 +10,7 @@ import { ModalOverlay, Spacer, } from "@chakra-ui/react"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { IChangeNumberOfItemsBoxData } from "../BoxView"; import { NumberField } from "@boxtribute/shared-components"; @@ -30,14 +30,13 @@ function AddItemsToBoxOverlay({ const { control, handleSubmit, - watch, formState: { isSubmitting, errors }, } = useForm({ defaultValues: { numberOfItems: 1, }, }); - const numberOfItems = watch("numberOfItems"); + const numberOfItems = useWatch({ control, name: "numberOfItems" }); return ( diff --git a/front/src/views/Box/components/BoxCard.tsx b/front/src/views/Box/components/BoxCard.tsx index 5d702b5a92..31ad5a58e1 100644 --- a/front/src/views/Box/components/BoxCard.tsx +++ b/front/src/views/Box/components/BoxCard.tsx @@ -261,8 +261,9 @@ function BoxCard({ onStateChange( // If the current box state 'Scrap' is toggled, set the defaultBoxState of the box location boxData?.state === "Scrap" && - boxData?.location?.__typename !== "DistributionSpot" - ? boxData?.location?.defaultBoxState! + boxData?.location?.__typename !== "DistributionSpot" && + boxData?.location?.defaultBoxState + ? boxData?.location?.defaultBoxState : "Scrap", ) } @@ -290,8 +291,9 @@ function BoxCard({ onStateChange( // If the current box state 'Lost' is toggled, set the defaultBoxState of the box location boxData?.state === "Lost" && - boxData?.location?.__typename !== "DistributionSpot" - ? boxData?.location?.defaultBoxState! + boxData?.location?.__typename !== "DistributionSpot" && + boxData?.location?.defaultBoxState + ? boxData?.location?.defaultBoxState : "Lost", ) } diff --git a/front/src/views/Box/components/TakeItemsFromBoxOverlay.tsx b/front/src/views/Box/components/TakeItemsFromBoxOverlay.tsx index 56f7e97ffe..07ca98c05b 100644 --- a/front/src/views/Box/components/TakeItemsFromBoxOverlay.tsx +++ b/front/src/views/Box/components/TakeItemsFromBoxOverlay.tsx @@ -15,7 +15,7 @@ import { VStack, } from "@chakra-ui/react"; import SelectField, { IDropdownOption } from "components/Form/SelectField"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { IChangeNumberOfItemsBoxData } from "../BoxView"; import { useAuthorization } from "hooks/useAuthorization"; import { NumberField } from "@boxtribute/shared-components"; @@ -44,7 +44,6 @@ function TakeItemsFromBoxOverlay({ const { handleSubmit, control, - watch, formState: { isSubmitting, errors }, } = useForm({ defaultValues: { @@ -54,8 +53,8 @@ function TakeItemsFromBoxOverlay({ }); const authorize = useAuthorization(); - const selectedLocationId = watch("locationId"); - const numberOfItems = watch("numberOfItems"); + const selectedLocationId = useWatch({ control, name: "locationId" }); + const numberOfItems = useWatch({ control, name: "numberOfItems" }); const onSubmit = (data: ITakeItemsFromBoxData) => { if (data.locationId?.value && onSubmitCreateBoxFromBox) { diff --git a/front/src/views/BoxCreate/BoxCreateView.tsx b/front/src/views/BoxCreate/BoxCreateView.tsx index 95c077e31c..ae91303b2c 100644 --- a/front/src/views/BoxCreate/BoxCreateView.tsx +++ b/front/src/views/BoxCreate/BoxCreateView.tsx @@ -160,13 +160,10 @@ function BoxCreateView() { })) .sort((a, b) => Number(a?.seq) - Number(b?.seq)); - useEffect(() => { - // Disable form submission if no warehouse location or products associated with base, but only if the query response is available - if (allLocations !== undefined && allLocations.length < 1) setNoLocation(true); - else if (noLocation) setNoLocation(false); - if (allProducts !== undefined && allProducts.length < 1) setNoProducts(true); - else if (noProducts) setNoProducts(false); - }, [allLocations, allProducts, noLocation, noProducts]); + if (allLocations !== undefined && allLocations.length < 1 && !noLocation) setNoLocation(true); + else if (noLocation) setNoLocation(false); + if (allProducts !== undefined && allProducts.length < 1 && !noProducts) setNoProducts(true); + else if (noProducts) setNoProducts(false); // check data for form useEffect(() => { diff --git a/front/src/views/BoxCreate/components/BoxCreate.tsx b/front/src/views/BoxCreate/components/BoxCreate.tsx index 4e8aaa698d..c546929798 100644 --- a/front/src/views/BoxCreate/components/BoxCreate.tsx +++ b/front/src/views/BoxCreate/components/BoxCreate.tsx @@ -1,7 +1,7 @@ import { Box, Button, FormLabel, Heading, Input, List, ListItem, Stack } from "@chakra-ui/react"; -import { useEffect, useState } from "react"; -import { SubmitHandler, useForm } from "react-hook-form"; +import { useEffect } from "react"; +import { SubmitHandler, useForm, useWatch } from "react-hook-form"; import { useNavigate, useParams } from "react-router-dom"; import { useAtomValue } from "jotai"; @@ -138,42 +138,35 @@ export function BoxCreate({ control, register, resetField, - watch, setValue, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(CreateBoxFormDataSchema), }); - const [sizesOptionsForCurrentProduct, setSizesOptionsForCurrentProduct] = useState< - IDropdownOption[] - >([]); + const productId = useWatch({ control, name: "productId" }); - const productId = watch("productId"); + const productAndSizeDataForCurrentProduct = productId + ? productAndSizesData.find((p) => p.id === productId.value) + : undefined; + const sizesOptionsForCurrentProduct: IDropdownOption[] = + productAndSizeDataForCurrentProduct?.sizeRange?.sizes?.map((s) => ({ + label: s.label, + value: s.id, + })) ?? []; useEffect(() => { if (productId != null) { - const productAndSizeDataForCurrentProduct = productAndSizesData.find( - (p) => p.id === productId.value, - ); - setSizesOptionsForCurrentProduct( - () => - productAndSizeDataForCurrentProduct?.sizeRange?.sizes?.map((s) => ({ - label: s.label, - value: s.id, - })) || [], - ); - resetField("sizeId"); // Put a default value for sizeId when there's only one option if (productAndSizeDataForCurrentProduct?.sizeRange?.sizes?.length === 1) { setValue("sizeId", { - label: productAndSizeDataForCurrentProduct?.sizeRange?.sizes[0].label, - value: productAndSizeDataForCurrentProduct?.sizeRange?.sizes[0].id, + label: productAndSizeDataForCurrentProduct.sizeRange.sizes[0].label, + value: productAndSizeDataForCurrentProduct.sizeRange.sizes[0].id, }); } } - }, [productId, productAndSizesData, resetField, setValue]); + }, [productId, productAndSizeDataForCurrentProduct, resetField, setValue]); return ( diff --git a/front/src/views/BoxEdit/components/BoxEdit.tsx b/front/src/views/BoxEdit/components/BoxEdit.tsx index 76b09fef49..11483dcac4 100644 --- a/front/src/views/BoxEdit/components/BoxEdit.tsx +++ b/front/src/views/BoxEdit/components/BoxEdit.tsx @@ -10,13 +10,13 @@ import { Stack, } from "@chakra-ui/react"; import SelectField, { IDropdownOption } from "components/Form/SelectField"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useMemo, useRef } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useAtomValue } from "jotai"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import _ from "lodash"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { selectedBaseIdAtom } from "stores/globalPreferenceStore"; import { ResultOf } from "gql.tada"; import { BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY } from "../BoxEditView"; @@ -168,46 +168,39 @@ function BoxEdit({ register, resetField, setError, - watch, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(BoxEditFormDataSchema), defaultValues, }); - // sizes reset depending on selected product - const [sizesOptionsForCurrentProduct, setSizesOptionsForCurrentProduct] = useState< - IDropdownOption[] - >([]); - // needed for updating size select field for new product - const productId = watch("productId"); + const productId = useWatch({ control, name: "productId" }); const productRef = useRef(boxData?.product?.id); - useEffect(() => { - if (productId != null) { - const productAndSizeDataForCurrentProduct = productAndSizesData.find( - (p) => p.id === productId.value, - ); - const prepSizesOptionsForCurrentProduct = - productAndSizeDataForCurrentProduct?.sizeRange?.sizes?.map((s) => ({ - label: s.label, - value: s.id, - })) || []; - setSizesOptionsForCurrentProduct(() => prepSizesOptionsForCurrentProduct); + // sizes derived from selected product + const sizesOptionsForCurrentProduct: IDropdownOption[] = useMemo( + () => + (productId != null + ? productAndSizesData + .find((p) => p.id === productId.value) + ?.sizeRange?.sizes?.map((s) => ({ label: s.label, value: s.id })) + : undefined) ?? [], + [productId, productAndSizesData], + ); - // Reset size if the product referenec is different than the currently selected product - if (productRef.current !== productId.value) { - productRef.current = productId.value; - // if there is only one option select it directly - if (prepSizesOptionsForCurrentProduct.length === 1) { - resetField("sizeId", { defaultValue: prepSizesOptionsForCurrentProduct[0] }); - } else { - resetField("sizeId", { defaultValue: null }); - } + useEffect(() => { + if (productId != null && productRef.current !== productId.value) { + // Reset size if the product reference is different than the currently selected product + productRef.current = productId.value; + // if there is only one option select it directly + if (sizesOptionsForCurrentProduct.length === 1) { + resetField("sizeId", { defaultValue: sizesOptionsForCurrentProduct[0] }); + } else { + resetField("sizeId", { defaultValue: null }); } } - }, [productId, productAndSizesData, boxData, resetField]); + }, [productId, sizesOptionsForCurrentProduct, resetField]); // If the product is deleted show a custom error message for productId useEffect(() => { diff --git a/front/src/views/Boxes/components/BoxesFilter.tsx b/front/src/views/Boxes/components/BoxesFilter.tsx index afd4f35ff3..8dd5e4f1f8 100644 --- a/front/src/views/Boxes/components/BoxesFilter.tsx +++ b/front/src/views/Boxes/components/BoxesFilter.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useState, useMemo } from "react"; +import { useCallback, useState, useMemo } from "react"; import { VStack, Button, Box, FormControl, FormLabel, SimpleGrid } from "@chakra-ui/react"; import { Filters } from "react-table"; import { boxStateIds } from "utils/constants"; @@ -76,22 +76,22 @@ export function BoxesFilter({ })); }, []); - useEffect(() => { - if (isOpen) { - const filtersMap: Record = {}; - columnFilters.forEach((filter) => { - if (filter.value == null) { - return; - } - if (Array.isArray(filter.value)) { - filtersMap[filter.id] = filter.value.map(String); - } else { - filtersMap[filter.id] = [String(filter.value)]; - } - }); - setStagedFilters(filtersMap); - } - }, [isOpen, columnFilters]); + const [prevIsOpen, setPrevIsOpen] = useState(isOpen); + if (isOpen && !prevIsOpen) { + setPrevIsOpen(true); + const filtersMap: Record = {}; + columnFilters.forEach((filter) => { + if (filter.value == null) return; + if (Array.isArray(filter.value)) { + filtersMap[filter.id] = filter.value.map(String); + } else { + filtersMap[filter.id] = [String(filter.value)]; + } + }); + setStagedFilters(filtersMap); + } else if (!isOpen && prevIsOpen) { + setPrevIsOpen(false); + } const handleFilterChange = useCallback((filterId: string, values: string[]) => { setStagedFilters((prev) => ({ diff --git a/front/src/views/Boxes/components/RemoveTagsButton.tsx b/front/src/views/Boxes/components/RemoveTagsButton.tsx index ba04da682c..f64294f5fc 100644 --- a/front/src/views/Boxes/components/RemoveTagsButton.tsx +++ b/front/src/views/Boxes/components/RemoveTagsButton.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { Row } from "react-table"; import { BoxRow } from "./types"; @@ -25,15 +25,15 @@ const RemoveTagsButton: React.FC = ({ const { createToast } = useNotification(); const [isInputOpen, setIsInputOpen] = useState(false); - const [selectedTagOptions, setSelectedTagOptions] = useState([]); + const [selectedTagOptions, setSelectedTagOptions] = useState( + currentTagOptions.length >= 1 ? currentTagOptions : [], + ); + const [prevCurrentTagOptions, setPrevCurrentTagOptions] = useState(currentTagOptions); - useEffect(() => { - if (currentTagOptions.length >= 1) { - setSelectedTagOptions(currentTagOptions); - } else { - setSelectedTagOptions([]); - } - }, [currentTagOptions]); + if (currentTagOptions !== prevCurrentTagOptions) { + setPrevCurrentTagOptions(currentTagOptions); + setSelectedTagOptions(currentTagOptions.length >= 1 ? currentTagOptions : []); + } const handleOpenInput = () => { if (selectedBoxes.length === 0) { diff --git a/front/src/views/CreateCustomProduct/components/CreateCustomProductForm.tsx b/front/src/views/CreateCustomProduct/components/CreateCustomProductForm.tsx index 9a1331a5ff..67d4dafc56 100644 --- a/front/src/views/CreateCustomProduct/components/CreateCustomProductForm.tsx +++ b/front/src/views/CreateCustomProduct/components/CreateCustomProductForm.tsx @@ -23,10 +23,7 @@ const categoryErrorText = "Please select a category."; const sizeRangeErrorText = "Please select a size range."; const genderErrorText = "Please select a gender."; -const SingleSelectOptionSchema = z.object({ - label: z.string(), - value: z.string(), -}); +type SingleSelectOptionSchema = { label: string; value: string }; const CreateCustomProductFormSchema = z.object({ name: z @@ -102,9 +99,9 @@ export type ICreateCustomProductFormOutput = z.output[]; - sizeRangeOptions: z.infer[]; - genderOptions: z.infer[]; + categoryOptions: SingleSelectOptionSchema[]; + sizeRangeOptions: SingleSelectOptionSchema[]; + genderOptions: SingleSelectOptionSchema[]; onSubmit: (createCustomProductFormOutput: ICreateCustomProductFormOutput) => void; }; diff --git a/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackedContentListOverlay.tsx b/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackedContentListOverlay.tsx index 12661f5dc3..4076b8fc8d 100644 --- a/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackedContentListOverlay.tsx +++ b/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackedContentListOverlay.tsx @@ -31,7 +31,7 @@ import { useDisclosure, } from "@chakra-ui/react"; import { Link as RouterLink } from "react-router-dom"; -import { useContext, useEffect, useMemo, useState } from "react"; +import { useContext, useMemo, useState } from "react"; import { BoxData, IPackingListEntry, UnboxedItemsCollectionData } from "views/Distributions/types"; import { useGetUrlForResourceHelpers } from "hooks/hooks"; import { DistroEventDetailsForPackingStateContext } from "../DistroEventDetailsForPackingStateContainer"; @@ -53,12 +53,14 @@ function UnboxedItemsCollectionListEntry({ }) { const removeUnboxedItemsOverlayState = useDisclosure(); const [numberOfItemsToRemove, setNumberOfItemsToRemove] = useState(); + const [prevIsOpen, setPrevIsOpen] = useState(removeUnboxedItemsOverlayState.isOpen); - const ctx = useContext(DistroEventDetailsForPackingStateContext); - - useEffect(() => { + if (removeUnboxedItemsOverlayState.isOpen !== prevIsOpen) { + setPrevIsOpen(removeUnboxedItemsOverlayState.isOpen); setNumberOfItemsToRemove(undefined); - }, [removeUnboxedItemsOverlayState.isOpen]); + } + + const ctx = useContext(DistroEventDetailsForPackingStateContext); return ( <> @@ -219,7 +221,7 @@ PackedContentListOverlayProps) { )} - {unboxedItemsCollectionData.length > 0 && ( + {unboxedItemsCollectionData.length > 0 && packingListEntry.size?.id && ( )} diff --git a/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackingAddBoxOrItemsForPackingListEntryOverlay/PackingScanBoxOrFindByLabelOverlayContent.tsx b/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackingAddBoxOrItemsForPackingListEntryOverlay/PackingScanBoxOrFindByLabelOverlayContent.tsx index e7a78b0f54..79c089ed37 100644 --- a/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackingAddBoxOrItemsForPackingListEntryOverlay/PackingScanBoxOrFindByLabelOverlayContent.tsx +++ b/front/src/views/Distributions/DistroEventView/components/State2Packing/components/PackingAddBoxOrItemsForPackingListEntryOverlay/PackingScanBoxOrFindByLabelOverlayContent.tsx @@ -146,7 +146,7 @@ const PackingScanBoxOrFindByLabelOverlay = ({ variables: { qrCode }, }) .then(({ data }) => { - // @ts-ignore + // @ts-expect-error incomplete type from Apollo const boxLabelIdentifier = data?.qrCode?.box?.labelIdentifier; if (boxLabelIdentifier == null) { // onScanningDone([ diff --git a/front/src/views/Distributions/DistrosDashboardView/DistrosDashboardView.tsx b/front/src/views/Distributions/DistrosDashboardView/DistrosDashboardView.tsx index 2408f181c5..9c2b14daed 100644 --- a/front/src/views/Distributions/DistrosDashboardView/DistrosDashboardView.tsx +++ b/front/src/views/Distributions/DistrosDashboardView/DistrosDashboardView.tsx @@ -17,7 +17,7 @@ import { useDisclosure, } from "@chakra-ui/react"; import APILoadingIndicator from "components/APILoadingIndicator"; -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useState } from "react"; import { useNavigate, useParams, useSearchParams } from "react-router-dom"; import { z } from "zod"; import { DISTRIBUTION_EVENTS_FOR_BASE_ID } from "../queries"; @@ -44,11 +44,9 @@ const DistrosDashboardView = () => { // Also then set the initial state value of currentTabIndex based on the search param. // This way, even in (unlikely) cases of incompatible browsers etc, the switching of the tab // will be supported via the UI. - useEffect(() => { - if (tabIndexSearchParamAsNumber !== currentTabIndex) { - setCurrentTabIndex(tabIndexSearchParamAsNumber!); - } - }, [currentTabIndex, tabIndexSearchParamAsNumber]); + if (tabIndexSearchParamAsNumber !== currentTabIndex) { + setCurrentTabIndex(tabIndexSearchParamAsNumber); + } // TODO: consider to move this into a container (so this view file only extracts the baseId from the url params) const { data, error, loading } = useQuery(DISTRIBUTION_EVENTS_FOR_BASE_ID, { diff --git a/front/src/views/Distributions/dataTransformers.ts b/front/src/views/Distributions/dataTransformers.ts index d474007348..6242be8b14 100644 --- a/front/src/views/Distributions/dataTransformers.ts +++ b/front/src/views/Distributions/dataTransformers.ts @@ -19,9 +19,9 @@ export const graphqlPackingListEntriesForDistributionEventTransformer = ( id: entry.id, // TODO: for productName, sizse and gender: remove the bangs again once we have proper (e.g. zod based) validation of query result product: { - id: entry.product?.id!, - name: entry.product?.name!, - gender: entry.product?.gender!, + id: entry.product?.id ?? "", + name: entry.product?.name ?? "", + gender: entry.product?.gender ?? "none", }, size: entry.size!, numberOfItems: entry.numberOfItems, diff --git a/front/src/views/EditCustomProduct/EditCustomProductView.tsx b/front/src/views/EditCustomProduct/EditCustomProductView.tsx index 26e22dd0b0..57ab0ba49e 100644 --- a/front/src/views/EditCustomProduct/EditCustomProductView.tsx +++ b/front/src/views/EditCustomProduct/EditCustomProductView.tsx @@ -105,8 +105,8 @@ function EditCustomProductFormContainer() { variables: { id: customProductId!, name: editProductFormOutput.name, - categoryId: parseInt(editProductFormOutput.category?.value!), - sizeRangeId: parseInt(editProductFormOutput.sizeRange?.value!), + categoryId: parseInt(editProductFormOutput.category?.value ?? ""), + sizeRangeId: parseInt(editProductFormOutput.sizeRange?.value ?? ""), gender: editProductFormOutput.gender?.value as NonNullProductGender, price: editProductFormOutput.price, inShop: editProductFormOutput.inShop, diff --git a/front/src/views/EditStandardProduct/components/EditStandardProductForm.tsx b/front/src/views/EditStandardProduct/components/EditStandardProductForm.tsx index 02016c10e2..542e72e0e7 100644 --- a/front/src/views/EditStandardProduct/components/EditStandardProductForm.tsx +++ b/front/src/views/EditStandardProduct/components/EditStandardProductForm.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { @@ -51,14 +51,13 @@ function EditStandardProductForm({ handleSubmit, control, register, - watch, formState: { errors }, } = useForm({ resolver: zodResolver(StandardProductFormSchema), ...(defaultValues ? { defaultValues } : {}), }); - const selectedStandardProduct = watch("standardProduct"); + const selectedStandardProduct = useWatch({ control, name: "standardProduct" }); useEffect(() => { if (defaultValues && selectedStandardProduct.value !== defaultValues.standardProduct.value) { diff --git a/front/src/views/EnableStandardProduct/components/EnableStandardProductForm.tsx b/front/src/views/EnableStandardProduct/components/EnableStandardProductForm.tsx index 667fb3c23f..1bb73e46fd 100644 --- a/front/src/views/EnableStandardProduct/components/EnableStandardProductForm.tsx +++ b/front/src/views/EnableStandardProduct/components/EnableStandardProductForm.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; -import { useForm } from "react-hook-form"; +import { useForm, useWatch } from "react-hook-form"; import { useAtomValue } from "jotai"; import { HStack, @@ -52,14 +52,13 @@ function EnableStandardProductForm({ handleSubmit, control, register, - watch, formState: { errors }, } = useForm({ resolver: zodResolver(StandardProductFormSchema), ...(defaultValues ? { defaultValues } : {}), }); - const selectedStandardProduct = watch("standardProduct"); + const selectedStandardProduct = useWatch({ control, name: "standardProduct" }); useEffect(() => { if (defaultValues && selectedStandardProduct.value !== defaultValues.standardProduct.value) { diff --git a/front/src/views/Transfers/CreateShipment/components/CreateShipment.tsx b/front/src/views/Transfers/CreateShipment/components/CreateShipment.tsx index b46a937abe..7094c03bac 100644 --- a/front/src/views/Transfers/CreateShipment/components/CreateShipment.tsx +++ b/front/src/views/Transfers/CreateShipment/components/CreateShipment.tsx @@ -20,7 +20,7 @@ import { Textarea, } from "@chakra-ui/react"; import { useEffect, useState } from "react"; -import { SubmitHandler, useForm } from "react-hook-form"; +import { SubmitHandler, useForm, useWatch } from "react-hook-form"; import { useAtomValue } from "jotai"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; @@ -102,7 +102,6 @@ function CreateShipment({ handleSubmit, control, resetField, - watch, setValue, register, formState: { errors, isSubmitting }, @@ -150,12 +149,15 @@ function CreateShipment({ const haveIntraOrganisationOptions = intraOrganisationOptions.length > 0; // selected Option for organisation field - const receivingOrganisation = watch("receivingOrganisation"); + const receivingOrganisation = useWatch({ control, name: "receivingOrganisation" }); // Display agreement comment, if any. const [agreementNote, setAgreementNote] = useState(""); - // Prepare options for the base field - const [basesOptions, setBasesOptions] = useState([]); + // Derive base options directly from the selected organisation (no state needed) + const basesOptions: IDropdownOption[] = + organisationBaseData + .find((org) => org.id === receivingOrganisation?.value) + ?.bases?.map((base) => ({ label: base.name, value: base.id })) ?? []; useEffect(() => { if (receivingOrganisation) { @@ -163,19 +165,12 @@ function CreateShipment({ (organisation) => organisation.id === receivingOrganisation.value, ); - setBasesOptions( - basesForSelectedOrganisation?.bases?.map((base) => ({ - label: base.name, - value: base.id, - })) || [], - ); - resetField("receivingBase"); // Put a default value for partnerOrganisationSelectedBases when there's only one option. if (basesForSelectedOrganisation?.bases.length === 1) { setValue("receivingBase", { - label: basesForSelectedOrganisation?.bases[0].name, - value: basesForSelectedOrganisation?.bases[0].id, + label: basesForSelectedOrganisation.bases[0].name, + value: basesForSelectedOrganisation.bases[0].id, }); } } @@ -190,16 +185,6 @@ function CreateShipment({ }); }, [intraOrganisationOptions, setValueIntraOrg]); - const NoAcceptedAgreementsAlert = () => ( - - - - You must have an ACCEPTED agreement with a network partner before creating a - shipment. - - - ); - return ( @@ -248,7 +233,13 @@ function CreateShipment({ /> {noAcceptedAgreements ? ( - + + + + You must have an ACCEPTED agreement with a network partner before + creating a shipment. + + ) : ( <> (); // State to pass Data from a row to the Overlay const [shipmentOverlayData, setShipmentOverlayData] = useState(); const { isLoading: isGlobalStateLoading } = useLoadAndSetGlobalPreferences(); @@ -154,13 +153,6 @@ function ShipmentView() { fetchPolicy: "cache-and-network", }); - useEffect(() => { - setShipmentState(data?.shipment?.state || undefined); - return () => { - setShipmentState(undefined); - }; - }, [data]); - // Mutations for shipment actions const [updateShipmentWhenPreparing, updateShipmentWhenPreparingStatus] = useMutation(REMOVE_BOX_FROM_SHIPMENT); @@ -350,9 +342,6 @@ function ShipmentView() { updateShipmentWhenReceivingStatus.loading || lostShipmentStatus.loading; - // transform shipment data for UI - const shipmentData = data?.shipment!; - const shipmentContents = (data?.shipment?.details.filter((item) => item.removedOn === null) ?? []) as ShipmentDetailWithAutomatchProduct[]; @@ -399,28 +388,28 @@ function ShipmentView() { const shipmentLogs: ITimelineEntry[] = generateShipmentHistory({ [ShipmentActionEvent.ShipmentStarted]: { - createdOn: shipmentData?.startedOn, - createdBy: shipmentData?.startedBy!, + createdOn: data?.shipment?.startedOn || "", + createdBy: data?.shipment?.startedBy as User, }, [ShipmentActionEvent.ShipmentCanceled]: { - createdOn: shipmentData?.canceledOn || "", - createdBy: shipmentData?.canceledBy!, + createdOn: data?.shipment?.canceledOn || "", + createdBy: data?.shipment?.canceledBy as User, }, [ShipmentActionEvent.ShipmentSent]: { - createdOn: shipmentData?.sentOn || "", - createdBy: shipmentData?.sentBy!, + createdOn: data?.shipment?.sentOn || "", + createdBy: data?.shipment?.sentBy as User, }, [ShipmentActionEvent.ShipmentStartReceiving]: { - createdOn: shipmentData?.receivingStartedOn || "", - createdBy: shipmentData?.receivingStartedBy!, + createdOn: data?.shipment?.receivingStartedOn || "", + createdBy: data?.shipment?.receivingStartedBy as User, }, [ShipmentActionEvent.ShipmentCompleted]: { - createdOn: shipmentData?.completedOn || "", - createdBy: shipmentData?.completedBy!, + createdOn: data?.shipment?.completedOn || "", + createdBy: data?.shipment?.completedBy as User, }, }); - const shipmentDetailLogs = (data?.shipment?.details! as ShipmentDetail[])?.flatMap((detail) => + const shipmentDetailLogs = (data?.shipment?.details as ShipmentDetail[])?.flatMap((detail) => _.compact([ detail?.createdBy && { box: detail.box.labelIdentifier, @@ -431,19 +420,19 @@ function ShipmentView() { detail?.removedOn && { box: detail.box.labelIdentifier, action: ShipmentActionEvent.BoxRemoved, - createdBy: detail?.removedBy! as User, + createdBy: detail?.removedBy as User, createdOn: new Date(detail?.removedOn), }, detail?.lostOn && { box: detail.box.labelIdentifier, action: ShipmentActionEvent.BoxLost, - createdBy: detail?.lostBy! as User, + createdBy: detail?.lostBy as User, createdOn: new Date(detail?.lostOn), }, detail?.receivedOn && { box: detail.box.labelIdentifier, action: ShipmentActionEvent.BoxReceived, - createdBy: detail?.receivedBy! as User, + createdBy: detail?.receivedBy as User, createdOn: new Date(detail?.receivedOn), }, ]), @@ -497,26 +486,26 @@ function ShipmentView() { shipmentTab = ; shipmentActionButtons = ; } else { - if ("Preparing" === shipmentState && isSender) { + if ("Preparing" === data?.shipment?.state && isSender) { canUpdateShipment = true; canCancelShipment = true; shipmentTitle = Prepare Shipment; - } else if ("Sent" === shipmentState && isSender) { + } else if ("Sent" === data?.shipment?.state && isSender) { canLooseShipment = true; - } else if ("Sent" === shipmentState && !isSender) { + } else if ("Sent" === data?.shipment?.state && !isSender) { canLooseShipment = true; - } else if ("Receiving" === shipmentState && !isSender) { + } else if ("Receiving" === data?.shipment?.state && !isSender) { canLooseShipment = true; shipmentTitle = Receiving Shipment; - } else if ("Preparing" === shipmentState && !isSender) { + } else if ("Preparing" === data?.shipment?.state && !isSender) { canCancelShipment = true; } shipmentActionButtons = ( ); - shipmentCard = ( + shipmentCard = data?.shipment ? ( - ); + ) : undefined; } let shipmentViewComponents; - if (shipmentState === "Receiving" && !isSender && isSender !== undefined) { - shipmentViewComponents = ( + if (data?.shipment?.state === "Receiving" && !isSender && isSender !== undefined) { + shipmentViewComponents = data?.shipment ? ( <> Receiving Shipment - + - ); + ) : undefined; } else { shipmentViewComponents = ( diff --git a/front/src/views/Transfers/ShipmentView/components/ShipmentCard.tsx b/front/src/views/Transfers/ShipmentView/components/ShipmentCard.tsx index c204872ded..630c6328a8 100644 --- a/front/src/views/Transfers/ShipmentView/components/ShipmentCard.tsx +++ b/front/src/views/Transfers/ShipmentView/components/ShipmentCard.tsx @@ -25,9 +25,9 @@ import ShipmentColoredStatus from "./ShipmentColoredStatus"; import { Shipment } from "queries/types"; export interface IShipmentProps { - canCancelShipment: Boolean; - canUpdateShipment: Boolean; - canLooseShipment: Boolean; + canCancelShipment: boolean; + canUpdateShipment: boolean; + canLooseShipment: boolean; isLoadingMutation: boolean | undefined; shipment: Shipment; onRemove: () => void; diff --git a/front/src/views/Transfers/ShipmentView/components/ShipmentContent.tsx b/front/src/views/Transfers/ShipmentView/components/ShipmentContent.tsx index 70383c1cbe..6c741278b0 100644 --- a/front/src/views/Transfers/ShipmentView/components/ShipmentContent.tsx +++ b/front/src/views/Transfers/ShipmentView/components/ShipmentContent.tsx @@ -30,7 +30,7 @@ export interface IShipmentContent { interface IShipmentContentProps { shipmentState: ShipmentState | undefined; items: IShipmentContent[]; - showRemoveIcon: Boolean; + showRemoveIcon: boolean; isLoadingMutation: boolean | undefined; onRemoveBox: (id: string) => void; onBulkRemoveBox: (ids: string[]) => void; @@ -125,7 +125,7 @@ function ShipmentContent({ }} onClick={ !isExpanded && !isLoadingMutation - ? () => onBulkRemoveBox(item.boxes.map((b) => b?.labelIdentifier!)) + ? () => onBulkRemoveBox(item.boxes.map((b) => b?.labelIdentifier ?? "")) : undefined } /> diff --git a/front/src/views/Transfers/ShipmentView/components/ShipmentTabs.tsx b/front/src/views/Transfers/ShipmentView/components/ShipmentTabs.tsx index 4576fc1b3d..bab438135b 100644 --- a/front/src/views/Transfers/ShipmentView/components/ShipmentTabs.tsx +++ b/front/src/views/Transfers/ShipmentView/components/ShipmentTabs.tsx @@ -34,7 +34,7 @@ export interface IShipmentTabsProps { details: ShipmentDetail[]; histories: IGroupedRecordEntry[]; isLoadingMutation: boolean | undefined; - showRemoveIcon: Boolean; + showRemoveIcon: boolean; onRemoveBox: (id: string) => void; onBulkRemoveBox: (ids: string[]) => void; } diff --git a/package.json b/package.json index c29272e0a3..28f6380550 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "format:check": "prettier --check --ignore-path .eslintignore", "format:write:all": "pnpm format:write \"+(front|shared-components|shared-front)/**/*.{js,json,ts,tsx}\"", "format:write": "prettier --write --ignore-path .eslintignore", - "lint": "eslint --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint": "eslint --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --no-warn-ignored", "lint:fix": "pnpm lint --fix", "lint:all": "pnpm lint shared-components front shared-front", "lint:all:fix": "pnpm lint:fix shared-components front shared-front", @@ -54,26 +54,30 @@ "zod": "^4.2.1" }, "devDependencies": { + "@eslint/compat": "2.0.3", + "@eslint/eslintrc": "3.3.5", + "@eslint/js": "9.39.4", "@sentry/types": "^10.43.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.5.2", "@types/react": "^18.3.13", "@types/react-dom": "^18.3.1", - "@typescript-eslint/eslint-plugin": "^8.57.0", - "@typescript-eslint/parser": "^8.57.0", + "@typescript-eslint/eslint-plugin": "8.57.1", + "@typescript-eslint/parser": "8.57.1", "@vitejs/plugin-react-swc": "^3.11.0", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", - "eslint": "^8.56.0", - "eslint-config-prettier": "^10.1.8", - "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^6.1.1", - "eslint-plugin-react-refresh": "^0.4.26", - "eslint-plugin-testing-library": "^7.16.0", + "eslint": "9.39.4", + "eslint-config-prettier": "10.1.8", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-refresh": "0.5.2", + "eslint-plugin-testing-library": "7.16.1", + "globals": "17.4.0", "husky": "^9.1.7", "jsdom": "26.1.0", "lint-staged": "^16.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ad24473ca..2a052acb87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,6 +111,15 @@ importers: specifier: ^4.2.1 version: 4.2.1 devDependencies: + '@eslint/compat': + specifier: 2.0.3 + version: 2.0.3(eslint@9.39.4) + '@eslint/eslintrc': + specifier: 3.3.5 + version: 3.3.5 + '@eslint/js': + specifier: 9.39.4 + version: 9.39.4 '@sentry/types': specifier: ^10.43.0 version: 10.43.0 @@ -130,11 +139,11 @@ importers: specifier: ^18.3.1 version: 18.3.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.57.0 - version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: 8.57.1 + version: 8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.57.0 - version: 8.57.0(eslint@8.57.1)(typescript@5.9.3) + specifier: 8.57.1 + version: 8.57.1(eslint@9.39.4)(typescript@5.9.3) '@vitejs/plugin-react-swc': specifier: ^3.11.0 version: 3.11.0(vite@6.4.1(@types/node@22.10.1)(yaml@2.8.2)) @@ -145,32 +154,35 @@ importers: specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) eslint: - specifier: ^8.56.0 - version: 8.57.1 + specifier: 9.39.4 + version: 9.39.4 eslint-config-prettier: - specifier: ^10.1.8 - version: 10.1.8(eslint@8.57.1) + specifier: 10.1.8 + version: 10.1.8(eslint@9.39.4) eslint-import-resolver-typescript: - specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@8.57.1) + specifier: 4.4.4 + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.4) eslint-plugin-import: - specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) + specifier: 2.32.0 + version: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@8.57.1) + specifier: 6.10.2 + version: 6.10.2(eslint@9.39.4) eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) + specifier: 7.37.5 + version: 7.37.5(eslint@9.39.4) eslint-plugin-react-hooks: - specifier: ^6.1.1 - version: 6.1.1(eslint@8.57.1) + specifier: 7.0.1 + version: 7.0.1(eslint@9.39.4) eslint-plugin-react-refresh: - specifier: ^0.4.26 - version: 0.4.26(eslint@8.57.1) + specifier: 0.5.2 + version: 0.5.2(eslint@9.39.4) eslint-plugin-testing-library: - specifier: ^7.16.0 - version: 7.16.0(eslint@8.57.1)(typescript@5.9.3) + specifier: 7.16.1 + version: 7.16.1(eslint@9.39.4)(typescript@5.9.3) + globals: + specifier: 17.4.0 + version: 17.4.0 husky: specifier: ^9.1.7 version: 9.1.7 @@ -1165,33 +1177,56 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/compat@2.0.3': + resolution: {integrity: sha512-SjIJhGigp8hmd1YGIBwh7Ovri7Kisl42GYFjrOyHhtfYGGoLW6teYi/5p8W50KSsawUPpuLOSmsq1bD0NGQLBw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^8.40 || 9 || 10 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@1.1.1': + resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.7.4': resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} @@ -1232,18 +1267,21 @@ packages: peerDependencies: react-hook-form: ^7.55.0 - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} @@ -1393,18 +1431,6 @@ packages: peerDependencies: react: ^16.14 || ^17.0 || ^18.0 || ^19.0 - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -1843,6 +1869,9 @@ packages: '@types/geojson@7946.0.14': resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} @@ -1887,46 +1916,40 @@ packages: '@types/warning@3.0.3': resolution: {integrity: sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==} - '@typescript-eslint/eslint-plugin@8.57.0': - resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} + '@typescript-eslint/eslint-plugin@8.57.1': + resolution: {integrity: sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.57.0 + '@typescript-eslint/parser': ^8.57.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.57.0': - resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} + '@typescript-eslint/parser@8.57.1': + resolution: {integrity: sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.56.1': - resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.57.0': resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.56.1': - resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + '@typescript-eslint/project-service@8.57.1': + resolution: {integrity: sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.57.0': resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.56.1': - resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + '@typescript-eslint/scope-manager@8.57.1': + resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/tsconfig-utils@8.57.0': resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} @@ -1934,26 +1957,26 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.57.0': - resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} + '@typescript-eslint/tsconfig-utils@8.57.1': + resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.56.1': - resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + '@typescript-eslint/type-utils@8.57.1': + resolution: {integrity: sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.57.0': resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.56.1': - resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + '@typescript-eslint/types@8.57.1': + resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/typescript-estree@8.57.0': resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} @@ -1961,11 +1984,10 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.56.1': - resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + '@typescript-eslint/typescript-estree@8.57.1': + resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.57.0': @@ -1975,16 +1997,20 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.56.1': - resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + '@typescript-eslint/utils@8.57.1': + resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.57.0': resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/visitor-keys@8.57.1': + resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.9.2': resolution: {integrity: sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==} @@ -2225,8 +2251,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -2234,8 +2260,8 @@ packages: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} @@ -2279,18 +2305,10 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -2307,10 +2325,6 @@ packages: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.3: resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} @@ -2319,10 +2333,6 @@ packages: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -2408,10 +2418,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -2632,26 +2638,14 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - data-view-byte-length@1.0.2: resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.1: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} @@ -2676,15 +2670,6 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -2741,10 +2726,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -2790,18 +2771,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.7: - resolution: {integrity: sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} - es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -2809,10 +2778,6 @@ packages: es-cookie@1.3.2: resolution: {integrity: sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q==} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -2832,17 +2797,10 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-shim-unscopables@1.1.0: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} @@ -2932,16 +2890,16 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@6.1.1: - resolution: {integrity: sha512-St9EKZzOAQF704nt2oJvAKZHjhrpg25ClQoaAlHmPZuajFldVLqRDW4VBNAS01NzeiQF0m0qhG1ZA807K6aVaQ==} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.26: - resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} peerDependencies: - eslint: '>=8.40' + eslint: ^9 || ^10 eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} @@ -2949,33 +2907,41 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-testing-library@7.16.0: - resolution: {integrity: sha512-lHZI6/Olb2oZqxd1+s1nOLCtL2PXKrc1ERz6oDbUKS0xZAMFH3Fy6wJo75z3pXTop3BV6+loPi2MSjIYt3vpAg==} + eslint-plugin-testing-library@7.16.1: + resolution: {integrity: sha512-/pCFzJuro/wOq6FCp43DwS3fpCr0hM2gByJAxi8bPdL7DXKdmH3p3BEpVKQkneUxT6T2XbUXG4J+c5GSAm12lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -3012,9 +2978,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3027,9 +2990,9 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -3042,9 +3005,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -3078,9 +3041,6 @@ packages: framesync@6.1.2: resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3089,10 +3049,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -3124,10 +3080,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -3148,10 +3100,6 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - globalize@0.1.1: resolution: {integrity: sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA==} @@ -3159,9 +3107,13 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@17.4.0: + resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} + engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} @@ -3180,9 +3132,6 @@ packages: peerDependencies: typescript: ^5.0.0 - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -3193,9 +3142,6 @@ packages: resolution: {integrity: sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -3226,6 +3172,12 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -3273,13 +3225,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -3294,10 +3239,6 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -3309,9 +3250,6 @@ packages: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} @@ -3320,10 +3258,6 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -3339,10 +3273,6 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} @@ -3386,10 +3316,6 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -3398,17 +3324,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-regex@1.2.0: - resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -3417,10 +3335,6 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} @@ -3433,10 +3347,6 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} @@ -3445,13 +3355,6 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} - engines: {node: '>= 0.4'} - is-weakref@1.1.1: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} @@ -3516,8 +3419,8 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsdom@26.1.0: @@ -3667,6 +3570,9 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3738,10 +3644,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -3770,9 +3672,6 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -3824,10 +3723,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3896,9 +3791,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-big-calendar@1.19.4: resolution: {integrity: sha512-FrvbDx2LF6JAWFD96LU1jjloppC5OgIvMYUYIPzAw5Aq+ArYFPxAjLqXc4DyxfsQDN0TJTMuS/BIbcSB7Pg0YA==} peerDependencies: @@ -4050,17 +3942,9 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - reflect.getprototypeof@1.0.9: - resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} - engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -4103,18 +3987,9 @@ packages: rettime@0.10.1: resolution: {integrity: sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -4126,9 +4001,6 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -4137,10 +4009,6 @@ packages: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -4291,10 +4159,6 @@ packages: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} @@ -4352,9 +4216,6 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -4464,34 +4325,18 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@5.4.4: resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} engines: {node: '>=20'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} - engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} @@ -4505,9 +4350,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -4853,9 +4695,6 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -4868,10 +4707,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.16: - resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} - engines: {node: '>= 0.4'} - which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -4906,9 +4741,6 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.1: resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} @@ -5049,7 +4881,7 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -5063,7 +4895,7 @@ snapshots: '@babel/core@7.28.4': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) @@ -5083,10 +4915,10 @@ snapshots: '@babel/generator@7.26.5': dependencies: - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/generator@7.28.3': @@ -5125,7 +4957,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -5163,13 +4995,13 @@ snapshots: '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@babel/parser': 7.28.4 '@babel/types': 7.28.4 @@ -5187,7 +5019,7 @@ snapshots: '@babel/traverse@7.28.4': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.4 @@ -5205,7 +5037,7 @@ snapshots: '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@bcoe/v8-coverage@1.0.2': {} @@ -6112,35 +5944,61 @@ snapshots: '@esbuild/win32-x64@0.25.11': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': dependencies: - eslint: 8.57.1 + eslint: 9.39.4 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/compat@2.0.3(eslint@9.39.4)': dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 + '@eslint/core': 1.1.1 + optionalDependencies: + eslint: 9.39.4 + + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 - '@eslint-community/regexpp@4.12.1': {} + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 - '@eslint-community/regexpp@4.12.2': {} + '@eslint/core@1.1.1': + dependencies: + '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.12.6 - debug: 4.3.7 - espree: 9.6.1 - globals: 13.24.0 + ajv: 6.14.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 + js-yaml: 4.1.1 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.39.4': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 '@floating-ui/core@1.7.4': dependencies: @@ -6175,17 +6033,16 @@ snapshots: '@standard-schema/utils': 0.3.0 react-hook-form: 7.62.0(react@18.3.1) - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@inquirer/ansi@1.0.2': {} @@ -6239,8 +6096,8 @@ snapshots: '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} @@ -6466,18 +6323,6 @@ snapshots: transitivePeerDependencies: - react-dom - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - '@open-draft/deferred-promise@2.2.0': {} '@open-draft/logger@0.3.0': @@ -6835,6 +6680,8 @@ snapshots: '@types/geojson@7946.0.14': {} + '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} '@types/lodash.mergewith@4.6.7': @@ -6884,15 +6731,15 @@ snapshots: '@types/warning@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.0 - eslint: 8.57.1 + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.1 + '@typescript-eslint/type-utils': 8.57.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.1(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.1 + eslint: 9.39.4 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -6900,84 +6747,69 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.0 + '@typescript-eslint/scope-manager': 8.57.1 + '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.1 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) - '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) + '@typescript-eslint/types': 8.57.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.56.1': - dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 - '@typescript-eslint/scope-manager@8.57.0': dependencies: '@typescript-eslint/types': 8.57.0 '@typescript-eslint/visitor-keys': 8.57.0 - '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.57.1': dependencies: - typescript: 5.9.3 + '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/visitor-keys': 8.57.1 '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@8.57.1)(typescript@5.9.3) + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.57.1(eslint@9.39.4)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.1(eslint@9.39.4)(typescript@5.9.3) debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.39.4 ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.56.1': {} - '@typescript-eslint/types@8.57.0': {} - '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 - debug: 4.4.3 - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.57.1': {} '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': dependencies: @@ -6994,39 +6826,52 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.1(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/project-service': 8.57.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) + '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/visitor-keys': 8.57.1 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.0(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) '@typescript-eslint/scope-manager': 8.57.0 '@typescript-eslint/types': 8.57.0 '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - eslint: 8.57.1 + eslint: 9.39.4 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.56.1': + '@typescript-eslint/utils@8.57.1(eslint@9.39.4)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.56.1 - eslint-visitor-keys: 5.0.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@typescript-eslint/scope-manager': 8.57.1 + '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) + eslint: 9.39.4 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@8.57.0': dependencies: '@typescript-eslint/types': 8.57.0 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.2.0': {} + '@typescript-eslint/visitor-keys@8.57.1': + dependencies: + '@typescript-eslint/types': 8.57.1 + eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.9.2': optional: true @@ -7327,15 +7172,15 @@ snapshots: dependencies: '@zag-js/dom-query': 0.16.0 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.14.0 + acorn: 8.16.0 - acorn@8.14.0: {} + acorn@8.16.0: {} agent-base@7.1.3: {} - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -7375,25 +7220,11 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - is-array-buffer: 3.0.4 - array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.7 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -7409,10 +7240,10 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.6: dependencies: @@ -7431,13 +7262,6 @@ snapshots: es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 @@ -7449,20 +7273,9 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -7552,14 +7365,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7783,36 +7588,18 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-data-view: 1.0.1 - data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.4 @@ -7831,10 +7618,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.4.1: dependencies: ms: 2.1.3 @@ -7879,10 +7662,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -7920,159 +7699,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.5: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.6 - get-intrinsic: 1.3.0 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.2.0 - is-shared-array-buffer: 1.0.3 - is-string: 1.1.1 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.3 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.3 - typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.16 - - es-abstract@1.23.7: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.0 - math-intrinsics: 1.1.0 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.3 - safe-regex-test: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-abstract@1.23.9: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.0 - math-intrinsics: 1.1.0 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -8132,10 +7758,6 @@ snapshots: es-cookie@1.3.2: {} - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.3.0 - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -8145,7 +7767,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -8165,12 +7787,6 @@ snapshots: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -8178,10 +7794,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -8225,9 +7837,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@8.57.1): + eslint-config-prettier@10.1.8(eslint@9.39.4): dependencies: - eslint: 8.57.1 + eslint: 9.39.4 eslint-import-context@0.1.9(unrs-resolver@1.9.2): dependencies: @@ -8244,33 +7856,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.4): dependencies: - debug: 4.4.1 - eslint: 8.57.1 + debug: 4.4.3 + eslint: 9.39.4 eslint-import-context: 0.1.9(unrs-resolver@1.9.2) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 unrs-resolver: 1.9.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4)(typescript@5.9.3) + eslint: 9.39.4 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.4) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8279,9 +7891,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.4 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.4) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8293,54 +7905,55 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.57.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4): dependencies: aria-query: 5.3.2 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.2 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.57.1 + eslint: 9.39.4 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@6.1.1(eslint@8.57.1): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4): dependencies: '@babel/core': 7.28.4 - '@babel/parser': 7.27.7 - eslint: 8.57.1 + '@babel/parser': 7.28.4 + eslint: 9.39.4 + hermes-parser: 0.25.1 zod: 4.2.1 zod-validation-error: 4.0.2(zod@4.2.1) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.26(eslint@8.57.1): + eslint-plugin-react-refresh@0.5.2(eslint@9.39.4): dependencies: - eslint: 8.57.1 + eslint: 9.39.4 - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@9.39.4): dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 8.57.1 + eslint: 9.39.4 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -8354,72 +7967,70 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@7.16.0(eslint@8.57.1)(typescript@5.9.3): + eslint-plugin-testing-library@7.16.1(eslint@9.39.4)(typescript@5.9.3): dependencies: - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@5.9.3) + eslint: 9.39.4 transitivePeerDependencies: - supports-color - typescript - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} - eslint@8.57.1: + eslint@9.39.4: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 - doctrine: 3.0.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 - minimatch: 3.1.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color - espree@9.6.1: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 esquery@1.6.0: dependencies: @@ -8447,19 +8058,15 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 fflate@0.8.2: {} - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -8472,11 +8079,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.3: {} @@ -8505,20 +8111,11 @@ snapshots: dependencies: tslib: 2.4.0 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.5 - functions-have-names: 1.2.3 - function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -8556,12 +8153,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -8589,22 +8180,13 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - globalize@0.1.1: {} globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} + + globals@17.4.0: {} globalthis@1.0.4: dependencies: @@ -8627,8 +8209,6 @@ snapshots: - '@gql.tada/vue-support' - graphql - graphemer@1.4.0: {} - graphql-tag@2.12.6(graphql@16.13.1): dependencies: graphql: 16.13.1 @@ -8636,8 +8216,6 @@ snapshots: graphql@16.13.1: {} - has-bigints@1.0.2: {} - has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -8662,6 +8240,12 @@ snapshots: headers-polyfill@4.0.3: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -8705,13 +8289,6 @@ snapshots: indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -8726,11 +8303,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -8747,10 +8319,6 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-bigint@1.1.0: dependencies: has-bigints: 1.1.0 @@ -8759,11 +8327,6 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.8 - has-tostringtag: 1.0.2 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -8771,7 +8334,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.4 is-callable@1.2.7: {} @@ -8779,10 +8342,6 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - is-data-view@1.0.2: dependencies: call-bound: 1.0.4 @@ -8823,10 +8382,6 @@ snapshots: is-node-process@1.2.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -8834,17 +8389,8 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-potential-custom-element-name@1.0.1: {} - is-regex@1.2.0: - dependencies: - call-bind: 1.0.7 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -8854,10 +8400,6 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.8 - is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 @@ -8873,24 +8415,12 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.16 - is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.8 - - is-weakref@1.1.0: - dependencies: - call-bound: 1.0.4 - is-weakref@1.1.1: dependencies: call-bound: 1.0.4 @@ -8953,7 +8483,7 @@ snapshots: js-tokens@9.0.1: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -9004,7 +8534,7 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.8 + array-includes: 3.1.9 array.prototype.flat: 1.3.3 object.assign: 4.1.7 object.values: 1.2.1 @@ -9114,6 +8644,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -9177,8 +8711,6 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.3: {} - object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -9219,10 +8751,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -9285,8 +8813,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -9338,8 +8864,6 @@ snapshots: punycode@2.3.1: {} - queue-microtask@1.2.3: {} - react-big-calendar@1.19.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.27.1 @@ -9530,26 +9054,8 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - reflect.getprototypeof@1.0.9: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -9589,14 +9095,8 @@ snapshots: rettime@0.10.1: {} - reusify@1.0.4: {} - rfdc@1.4.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - robust-predicates@3.0.2: {} rollup@4.59.0: @@ -9632,10 +9132,6 @@ snapshots: rrweb-cssom@0.8.0: {} - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -9649,12 +9145,6 @@ snapshots: es-errors: 1.3.0 isarray: 2.0.5 - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.2.0 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -9710,27 +9200,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -9801,16 +9291,16 @@ snapshots: string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.24.0 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -9824,7 +9314,7 @@ snapshots: string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -9836,13 +9326,6 @@ snapshots: es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.1.1 - string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 @@ -9896,8 +9379,6 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 - text-table@0.2.0: {} - tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -9985,32 +9466,16 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type-fest@5.4.4: dependencies: tagged-tag: 1.0.0 - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.13 - typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 @@ -10019,16 +9484,6 @@ snapshots: has-proto: 1.2.0 is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.3: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.13 - reflect.getprototypeof: 1.0.9 - typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 @@ -10050,13 +9505,6 @@ snapshots: typescript@5.9.3: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.8 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.0.2 - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -10380,7 +9828,7 @@ snapshots: vite-node@3.2.4(@types/node@22.10.1)(yaml@2.8.2): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.4.1(@types/node@22.10.1)(yaml@2.8.2) @@ -10497,14 +9945,6 @@ snapshots: tr46: 5.1.0 webidl-conversions: 7.0.0 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.1.1 - is-symbol: 1.1.1 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -10536,14 +9976,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.16: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 @@ -10589,8 +10021,6 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - wrappy@1.0.2: {} - ws@8.18.1: {} xml-name-validator@5.0.0: {} diff --git a/shared-components/.eslintrc.cjs b/shared-components/.eslintrc.cjs deleted file mode 100644 index e32d7bcb36..0000000000 --- a/shared-components/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -const path = require("path"); - -// PLEASE DO NOT ADD CONFIG HERE -// Add config to ../.eslintrc.cjs instead -// This file is just needed to resolve dependencies correctly -/** @type {import("eslint").Linter.Config} */ -module.exports = { - extends: ["../.eslintrc.cjs"], - rules: { - "import/no-extraneous-dependencies": [ - "error", - { - // look for package.json files also in the parent directory - packageDir: [__dirname, path.join(__dirname, "../")], - }, - ], - }, -}; diff --git a/shared-components/statviz/components/custom-graphs/BarChartCenterAxis.tsx b/shared-components/statviz/components/custom-graphs/BarChartCenterAxis.tsx index d98fd90213..626aebeeb2 100644 --- a/shared-components/statviz/components/custom-graphs/BarChartCenterAxis.tsx +++ b/shared-components/statviz/components/custom-graphs/BarChartCenterAxis.tsx @@ -74,7 +74,7 @@ export default function BarChartCenterAxis(chart: IBarChartCenterAxis) { tooltipOpen: false, }); - let tooltipTimeout: number; + const tooltipTimeoutRef = useRef(undefined); if (!fields.settings) { fields.settings = {}; @@ -174,10 +174,10 @@ export default function BarChartCenterAxis(chart: IBarChartCenterAxis) { x={x} y={Math.round(y - barHight / 2)} onMouseLeave={() => { - tooltipTimeout = window.setTimeout(() => hideTooltip(), 300); + tooltipTimeoutRef.current = window.setTimeout(() => hideTooltip(), 300); }} onMouseMove={(event) => { - if (tooltipTimeout) clearTimeout(tooltipTimeout); + if (tooltipTimeoutRef.current) clearTimeout(tooltipTimeoutRef.current); const localY = localPoint(event)?.y ?? 0; showTooltip({ tooltipData: tooltip, @@ -205,10 +205,10 @@ export default function BarChartCenterAxis(chart: IBarChartCenterAxis) { y={Math.round(y - barHight / 2)} fill={fields.colorBarRight} onMouseLeave={() => { - tooltipTimeout = window.setTimeout(() => hideTooltip(), 300); + tooltipTimeoutRef.current = window.setTimeout(() => hideTooltip(), 300); }} onMouseMove={(event) => { - if (tooltipTimeout) clearTimeout(tooltipTimeout); + if (tooltipTimeoutRef.current) clearTimeout(tooltipTimeoutRef.current); const localY = localPoint(event)?.y ?? 0; showTooltip({ diff --git a/shared-components/statviz/components/filter/TabbedTagDropdown.tsx b/shared-components/statviz/components/filter/TabbedTagDropdown.tsx index d5452fcac4..42399f840f 100644 --- a/shared-components/statviz/components/filter/TabbedTagDropdown.tsx +++ b/shared-components/statviz/components/filter/TabbedTagDropdown.tsx @@ -1,4 +1,4 @@ -import { useRef, useMemo, useCallback, useState } from "react"; +import { useMemo, useCallback, useState } from "react"; import { Box, Flex } from "@chakra-ui/react"; import { CheckIcon } from "@chakra-ui/icons"; import { Select, chakraComponents } from "chakra-react-select"; @@ -25,7 +25,8 @@ interface ISelectActionMeta { // Extended selectProps type for custom data passed through to custom components interface ICustomSelectProps { - tabIndexRef?: React.MutableRefObject; + tabIndex?: number; + onTabChange?: (index: number) => void; includedTags?: ITagFilterValue[]; excludedTags?: ITagFilterValue[]; } @@ -37,15 +38,10 @@ interface ICustomSelectProps { // input and closes the dropdown. Using plain Box elements with onMouseDown preventDefault // prevents focus transfer without that side-effect. function CustomMenu(menuProps: { selectProps: ICustomSelectProps; children: React.ReactNode }) { - const { tabIndexRef } = menuProps.selectProps; - // Initialize from the ref so the active tab is remembered across menu open/close cycles. - const [tabIndex, setTabIndex] = useState(() => tabIndexRef?.current ?? 0); + const { tabIndex = 0, onTabChange } = menuProps.selectProps; const handleTabChange = (index: number) => { - setTabIndex(index); - if (tabIndexRef) { - tabIndexRef.current = index; - } + onTabChange?.(index); }; const TAB_LABELS = ["Include", "Exclude"] as const; @@ -121,15 +117,13 @@ export default function TabbedTagDropdown({ onClearAll, placeholder = "Filter by tags", }: ITabbedTagDropdownProps) { - // Ref to track the currently active tab (0 = Include, 1 = Exclude). - // Using a ref instead of state avoids re-rendering the Select on tab change. - const tabIndexRef = useRef(0); + const [tabIndex, setTabIndex] = useState(0); const handleChange = useCallback( (_newValue: unknown, actionMeta: ISelectActionMeta) => { if (actionMeta.action === "select-option" && actionMeta.option) { const added = actionMeta.option; - if (tabIndexRef.current === 0) { + if (tabIndex === 0) { // Include tab: add to included list. // Only remove from excluded if it was actually there (avoids a second setSearchParams // call that would overwrite the first one with a stale URL params snapshot). @@ -164,13 +158,18 @@ export default function TabbedTagDropdown({ } } }, - [includedTags, excludedTags, onIncludedChange, onExcludedChange, onClearAll], + [tabIndex, excludedTags, onIncludedChange, includedTags, onExcludedChange, onClearAll], ); const value = useMemo(() => [...includedTags, ...excludedTags], [includedTags, excludedTags]); // Custom props forwarded to custom components via selectProps - const customSelectProps: ICustomSelectProps = { tabIndexRef, includedTags, excludedTags }; + const customSelectProps: ICustomSelectProps = { + tabIndex, + onTabChange: setTabIndex, + includedTags, + excludedTags, + }; return (