diff --git a/package.json b/package.json index fc389fc46d..80c2f95703 100644 --- a/package.json +++ b/package.json @@ -75,25 +75,25 @@ "@testing-library/react": "^14.2.2", "@testing-library/react-hooks": "^8.0.1", "@tsconfig/create-react-app": "^1.0.2", - "@types/node": "^20.14.2", + "@types/node": "^20.14.9", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/react-flatpickr": "^3.8.11", "@types/react-redux": "^7.1.24", "@typescript-eslint/eslint-plugin": "^5.23.0", - "@typescript-eslint/parser": "^7.13.0", + "@typescript-eslint/parser": "^7.14.1", "@vitest/coverage-istanbul": "^1.6.0", "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "babel-plugin-istanbul": "^6.1.1", "babel-plugin-lodash": "^3.3.4", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", - "caniuse-lite": "^1.0.30001636", + "caniuse-lite": "^1.0.30001639", "chokidar-cli": "^3.0.0", "concurrently": "^8.2.2", "core-js": "^3.37.1", "css-loader": "^7.1.2", - "cssnano": "^7.0.2", + "cssnano": "^7.0.3", "cypress": "^9.6.1", "dotenv": "^16.4.5", "eslint": "^8.57.0", @@ -106,36 +106,36 @@ "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react": "^7.34.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-webpack-plugin": "^4.2.0", "glob": "^8.0.1", - "happy-dom": "^14.12.0", + "happy-dom": "^14.12.3", "istanbul-lib-coverage": "^3.2.2", "markdownlint-cli2": "^0.4.0", "mutationobserver-shim": "^0.3.7", "nyc": "^17.0.0", "orval": "^6.26.0", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "postcss-cli": "^11.0.0", "postcss-loader": "^8.1.1", "postcss-scss": "^4.0.9", "prettier": "^2.6.2", "replace-in-file": "^6.3.2", - "sass": "^1.77.5", + "sass": "^1.77.6", "source-map-support": "^0.5.21", "style-loader": "^4.0.0", "stylelint": "^15.11.0", "stylelint-config-prettier": "^9.0.5", "stylelint-config-recommended-scss": "^6.0.0", "stylelint-prettier": "^2.0.0", - "stylelint-scss": "^6.3.1", + "stylelint-scss": "^6.3.2", "stylelint-webpack-plugin": "^5.0.1", "svg-url-loader": "^8.0.0", "ts-node": "^10.9.2", "typescript": "^4.6.4", "vitest": "^0.28.5", - "webpack": "^5.92.0", + "webpack": "^5.92.1", "webpack-cli": "^5.1.4", "webpack-version-file-plugin": "^0.4.0" }, @@ -144,7 +144,7 @@ "prop-types": "Since we use former ddb-react components that depend on prop-types we keep this. Should be removed when usage of prop-types is deprecated." }, "dependencies": { - "@danskernesdigitalebibliotek/dpl-design-system": "^2024.25.0-44a88057ebe723f137f5ebe751cf0b6953c029b3", + "@danskernesdigitalebibliotek/dpl-design-system": "^2024.27.0-50a60f2057fffa8dac33aaaa4ceff523369c6b68", "@fullcalendar/core": "^6.1.14", "@fullcalendar/daygrid": "^6.1.14", "@fullcalendar/interaction": "^6.1.14", @@ -158,7 +158,7 @@ "dayjs": "^1.11.11", "downshift": "8.5.0", "focus-trap-react": "^10.2.3", - "graphql": "^16.8.2", + "graphql": "^16.9.0", "graphql-tag": "^2.12.6", "lodash": "^4.17.21", "prop-types": "^15.8.1", @@ -175,6 +175,6 @@ "unfetch": "^4.2.0" }, "peerDependencies": { - "postcss": "^8.4.38" + "postcss": "^8.4.39" } } diff --git a/src/apps/dashboard/dashboard-notification-list/dashboard-notification-list.tsx b/src/apps/dashboard/dashboard-notification-list/dashboard-notification-list.tsx index 78f1a023f3..113d8abe34 100644 --- a/src/apps/dashboard/dashboard-notification-list/dashboard-notification-list.tsx +++ b/src/apps/dashboard/dashboard-notification-list/dashboard-notification-list.tsx @@ -55,6 +55,11 @@ const DashboardNotificationList: FC = ({ soonOverdue: loansSoonOverduePhysical, farFromOverdue: loansFarFromOverduePhysical, isLoading: isLoadingLoansPhysical + }, + publizon: { + soonOverdue: loansSoonOverdueDigital, + farFromOverdue: loansFarFromOverdueDigital, + isLoading: isLoadingLoansDigital } } = useLoans(); @@ -120,12 +125,16 @@ const DashboardNotificationList: FC = ({ break; case soon: - setLoansToDisplay(loansSoonOverduePhysical); + setLoansToDisplay( + loansSoonOverduePhysical.concat(loansSoonOverdueDigital) + ); setModalHeader(t("loansSoonOverdueText")); break; case longer: - setLoansToDisplay(loansFarFromOverduePhysical); + setLoansToDisplay( + loansFarFromOverduePhysical.concat(loansFarFromOverdueDigital) + ); setModalHeader(t("loansNotOverdueText")); break; @@ -140,6 +149,8 @@ const DashboardNotificationList: FC = ({ loansFarFromOverduePhysical, loansOverduePhysical, loansSoonOverduePhysical, + loansSoonOverdueDigital, + loansFarFromOverdueDigital, t ] ); @@ -158,7 +169,8 @@ const DashboardNotificationList: FC = ({ : openDueDateModal(yesterday) }, { - listLength: loansSoonOverduePhysical.length, + listLength: + loansSoonOverduePhysical.length + loansSoonOverdueDigital.length, badge: t("statusBadgeWarningText"), header: t("loansSoonOverdueText"), color: "warning", @@ -170,7 +182,8 @@ const DashboardNotificationList: FC = ({ : openDueDateModal(soon) }, { - listLength: loansFarFromOverduePhysical.length, + listLength: + loansFarFromOverduePhysical.length + loansFarFromOverdueDigital.length, header: t("loansNotOverdueText"), dataCy: "loans-not-overdue", color: "neutral", @@ -218,7 +231,11 @@ const DashboardNotificationList: FC = ({ materialsCount={loans.length} header={t("physicalLoansText")} emptyListText={t("noPhysicalLoansText")} - isLoading={isLoadingLoans || isLoadingLoansPhysical} + isLoading={ + isLoadingLoans || + isLoadingLoansPhysical || + isLoadingLoansDigital + } linkText={t("dashboardLoansLinkText")} linkUrl={physicalLoansUrl} /> @@ -242,7 +259,10 @@ const DashboardNotificationList: FC = ({ ...dashboardNotificationsReservations ]} isLoading={ - isLoadingLoans || isLoadingLoansPhysical || isLoadingReservations + isLoadingLoans || + isLoadingLoansPhysical || + isLoadingLoansDigital || + isLoadingReservations } /> )} diff --git a/src/apps/patron-page/PatronPage.tsx b/src/apps/patron-page/PatronPage.tsx index 32f910b866..a2a78c1807 100644 --- a/src/apps/patron-page/PatronPage.tsx +++ b/src/apps/patron-page/PatronPage.tsx @@ -1,11 +1,5 @@ import React, { useEffect, useState, FC, FormEvent } from "react"; import { set } from "lodash"; -import { useQueryClient } from "react-query"; -import { PatronV5, UpdatePatronRequestV4 } from "../../core/fbs/model"; -import { - useUpdateV5, - getGetPatronInformationByPatronIdV2QueryKey -} from "../../core/fbs/fbs"; import { useText } from "../../core/utils/text"; import Link from "../../components/atoms/links/Link"; import BasicDetailsSection from "./sections/BasicDetailsSection"; @@ -17,15 +11,15 @@ import { useUrls } from "../../core/utils/url"; import { useNotificationMessage } from "../../core/utils/useNotificationMessage"; import { usePatronData } from "../../core/utils/helpers/usePatronData"; import PatronPageSkeleton from "./PatronPageSkeleton"; +import useSavePatron from "../../core/utils/useSavePatron"; +import { Patron } from "../../core/utils/types/entities"; const PatronPage: FC = () => { - const queryClient = useQueryClient(); const t = useText(); const u = useUrls(); const deletePatronUrl = u("deletePatronUrl"); - const { mutate } = useUpdateV5(); const { data: patronData, isLoading } = usePatronData(); - const [patron, setPatron] = useState(null); + const [patron, setPatron] = useState(null); const [pin, setPin] = useState(null); const [isPinChangeValid, setIsPinChangeValid] = useState(true); const [disableSubmitButton, setDisableSubmitButton] = useState(false); @@ -34,6 +28,34 @@ const PatronPage: FC = () => { ); const [NotificationComponent, handleNotificationMessage] = useNotificationMessage(); + const { savePatron, savePincode } = useSavePatron({ + patron: patron || undefined, + fetchHandlers: { + savePatron: { + onSuccess: () => { + setDisableSubmitButton(false); + handleNotificationMessage( + t("patronPageHandleResponseInformationText") + ); + }, + onError: () => { + setDisableSubmitButton(false); + } + }, + savePincode: { + onSuccess: () => { + setDisableSubmitButton(false); + setSuccessPinMessage(t("patronPinSavedSuccessText")); + handleNotificationMessage( + t("patronPageHandleResponseInformationText") + ); + }, + onError: () => { + setDisableSubmitButton(false); + } + } + } + }); useEffect(() => { if (patronData && patronData.patron) { @@ -46,7 +68,7 @@ const PatronPage: FC = () => { } // Changes the patron object by key. - // So using the paramters 123 and "phoneNumber" would change the phoneNumber to 123. + // So using the parameters 123 and "phoneNumber" would change the phoneNumber to 123. const changePatron = (newValue: string | boolean, key: string) => { // Deeeep copy const copyUser = JSON.parse(JSON.stringify(patron)); @@ -57,50 +79,15 @@ const PatronPage: FC = () => { const save = () => { if (patron) { setDisableSubmitButton(true); - // The save patron request is done in another section of the code, but in that section - // it is saved differently. Here, we save the input from the user, in the other scenario, - // the checkboxes (subscribe to texts, subscribe to emails) will be set automatically - const data: UpdatePatronRequestV4 = { - patron: { - emailAddress: patron.emailAddress, - receivePostalMail: patron.receivePostalMail, - phoneNumber: patron.phoneNumber, - onHold: patron.onHold, - preferredPickupBranch: patron.preferredPickupBranch, - receiveEmail: patron.receiveEmail, - receiveSms: patron.receiveSms - } - }; // If pincode is changed, the pincode should be updated. if (pin) { - data.pincodeChange = { + savePincode({ pincode: pin, libraryCardNumber: patron.patronId.toString() - }; + }); + } else { + savePatron(patron); } - mutate( - { - data - }, - { - onSuccess: () => { - queryClient.invalidateQueries( - getGetPatronInformationByPatronIdV2QueryKey() - ); - if (pin) { - setSuccessPinMessage(t("patronPinSavedSuccessText")); - } - setDisableSubmitButton(false); - handleNotificationMessage( - t("patronPageHandleResponseInformationText") - ); - }, - // todo error handling, missing in figma - onError: () => { - setDisableSubmitButton(false); - } - } - ); } }; diff --git a/src/apps/reservation-list/modal/pause-reservation/pause-reservation.tsx b/src/apps/reservation-list/modal/pause-reservation/pause-reservation.tsx index acb892c934..9a9c02fd30 100644 --- a/src/apps/reservation-list/modal/pause-reservation/pause-reservation.tsx +++ b/src/apps/reservation-list/modal/pause-reservation/pause-reservation.tsx @@ -1,78 +1,68 @@ import React, { FC, useCallback, useState, useEffect, useId } from "react"; import dayjs from "dayjs"; -import { useQueryClient } from "react-query"; import Link from "../../../../components/atoms/links/Link"; import Modal, { useModalButtonHandler } from "../../../../core/utils/modal"; import { useText } from "../../../../core/utils/text"; -import { - useUpdateV5, - getGetPatronInformationByPatronIdV2QueryKey -} from "../../../../core/fbs/fbs"; -import { Patron, PatronV5 } from "../../../../core/fbs/model"; import { useUrls } from "../../../../core/utils/url"; import { getModalIds } from "../../../../core/utils/helpers/modal-helpers"; import DateRangeInput from "../../../../components/date-inputs/DateRangeInput"; +import useSavePatron from "../../../../core/utils/useSavePatron"; +import { Patron } from "../../../../core/utils/types/entities"; interface PauseReservationProps { id: string; - user: PatronV5; + user: Patron; } const PauseReservation: FC = ({ id, user }) => { const t = useText(); const u = useUrls(); const pauseReservationInfoUrl = u("pauseReservationInfoUrl"); - - const queryClient = useQueryClient(); - const { mutate } = useUpdateV5(); const { close } = useModalButtonHandler(); const { pauseReservation } = getModalIds(); + const [isLoading, setIsLoading] = useState(false); + const { savePatron } = useSavePatron({ + patron: user, + fetchHandlers: { + savePatron: { + onSuccess: () => { + setIsLoading(false); + close(pauseReservation as string); + }, + onError: () => { + setIsLoading(false); + } + } + } + }); const saveFormId = useId(); const currentDate = dayjs().format("YYYY-MM-DD"); const [startDate, setStartDate] = useState(currentDate); const [endDate, setEndDate] = useState(""); const pauseActive = user?.onHold?.from && user?.onHold?.to; - const [isLoading, setIsLoading] = useState(false); - const save = useCallback( - (localStartDate?: string, localEndDate?: string) => { + const saveDates = useCallback( + (start?: string, end?: string) => { if (!user) { return; } + setIsLoading(true); - // TODO: Create a hook for this that fetches + updates user data. - const saveData = { ...user } as Patron; - saveData.onHold = { - from: localStartDate === "" ? undefined : localStartDate, - to: localEndDate === "" ? undefined : localEndDate - }; - mutate( - { - data: { patron: saveData } - }, - { - onSuccess: () => { - queryClient.invalidateQueries( - getGetPatronInformationByPatronIdV2QueryKey() - ); - setIsLoading(false); - close(pauseReservation as string); - }, - // todo error handling, missing in figma - onError: () => { - setIsLoading(false); - } + savePatron({ + onHold: { + from: start === "" ? undefined : start, + to: end === "" ? undefined : end } - ); + }); }, - [close, mutate, pauseReservation, queryClient, user] + [savePatron, user] ); const resetPauseDates = useCallback(() => { setStartDate(currentDate); setEndDate(""); - save(); - }, [currentDate, save]); + saveDates(); + }, [currentDate, saveDates]); useEffect(() => { if (user?.onHold?.from) { @@ -106,7 +96,7 @@ const PauseReservation: FC = ({ id, user }) => { onSubmit={(e) => { e.preventDefault(); if (startDate && endDate) { - save(startDate, endDate); + saveDates(startDate, endDate); } }} > diff --git a/src/components/material/material-buttons/online/MaterialButtonOnlineExternal.tsx b/src/components/material/material-buttons/online/MaterialButtonOnlineExternal.tsx index 3c59db6146..3ba4e2d737 100644 --- a/src/components/material/material-buttons/online/MaterialButtonOnlineExternal.tsx +++ b/src/components/material/material-buttons/online/MaterialButtonOnlineExternal.tsx @@ -56,24 +56,23 @@ const MaterialButtonOnlineExternal: FC = ({ ); const t = useText(); const { data, error } = useProxyUrlGET( - { - url: externalUrl - }, - { - enabled: urlWasTranslated === null && externalUrl.length > 0 - } + { url: externalUrl }, + { enabled: urlWasTranslated === null && externalUrl.length > 0 } ); + // Update translatedUrl and reset urlWasTranslated when externalUrl changes useEffect(() => { - if (urlWasTranslated) { - return; - } + setTranslatedUrl(new URL(externalUrl)); + setUrlWasTranslated(null); + }, [externalUrl]); - if (!error && data?.data?.url) { + // Handle URL translation when data or error changes + useEffect(() => { + if (urlWasTranslated === false && !error && data?.data?.url) { setTranslatedUrl(new URL(data.data.url)); setUrlWasTranslated(true); } - }, [data, error, translatedUrl, urlWasTranslated]); + }, [data, error, urlWasTranslated]); const label = ( sourceName: AccessUrl["origin"], diff --git a/src/components/material/material-buttons/online/MaterialButtonsOnline.tsx b/src/components/material/material-buttons/online/MaterialButtonsOnline.tsx index 20ecc74c8d..4acb169a0b 100644 --- a/src/components/material/material-buttons/online/MaterialButtonsOnline.tsx +++ b/src/components/material/material-buttons/online/MaterialButtonsOnline.tsx @@ -38,7 +38,10 @@ const MaterialButtonsOnline: FC = ({ }); }; - const accessElement = manifestations[0].access[0]; + // Find 'Ereol' object or default to the first 'access' object + const accessElement = + manifestations[0].access.find((item) => item.__typename === "Ereol") || + manifestations[0].access[0]; // If the access type is an external type we'll show corresponding button. if ( diff --git a/src/components/reservation/forms/ModalReservationFormText.tsx b/src/components/reservation/forms/ModalReservationFormText.tsx index 79aa362c35..d4e66abc39 100644 --- a/src/components/reservation/forms/ModalReservationFormText.tsx +++ b/src/components/reservation/forms/ModalReservationFormText.tsx @@ -1,10 +1,5 @@ import { isEqual } from "lodash"; import React, { memo, useState } from "react"; -import { useQueryClient } from "react-query"; -import { - getGetPatronInformationByPatronIdV2QueryKey, - useUpdateV5 -} from "../../../core/fbs/fbs"; import { PatronV5 } from "../../../core/fbs/model"; import { stringifyValue } from "../../../core/utils/helpers/general"; import Modal, { useModalButtonHandler } from "../../../core/utils/modal"; @@ -17,6 +12,7 @@ import { saveText } from "./helper"; import ReservationForm from "./ReservationForm"; +import useSavePatron from "../../../core/utils/useSavePatron"; export interface ModalReservationFormTextProps { type: ModalReservationFormTextType; @@ -53,10 +49,23 @@ const ModalReservationFormText = ({ patron }: ModalReservationFormTextProps) => { const { close } = useModalButtonHandler(); - const queryClient = useQueryClient(); const t = useText(); const [text, setText] = useState(stringifyValue(defaultText)); - const { mutate } = useUpdateV5(); + const { savePatron } = useSavePatron({ + patron, + fetchHandlers: { + savePatron: { + onSuccess: () => { + close(modalReservationFormId(type)); + }, + // If an error occurred make sure to reset the text to the old value. + onError: () => { + setText(stringifyValue(defaultText)); + close(modalReservationFormId(type)); + } + } + } + }); const onChange = (input: string) => { setText(input); }; @@ -66,26 +75,8 @@ const ModalReservationFormText = ({ changedText: text, savedText: defaultText, patron, - mutate - }) - .then((response) => { - // If we succeeded in saving we can cache the new data. - if (response) { - queryClient.setQueryData( - getGetPatronInformationByPatronIdV2QueryKey(), - response - ); - } - }) - .catch((e) => { - // If an error ocurred make sure to reset the text to the old value. - setText(stringifyValue(defaultText)); - throw e; - }) - .finally(() => { - // Close modal no matter what. - close(modalReservationFormId(type)); - }); + savePatron + }); }; const { modalId, screenReaderModalDescriptionText, closeModalAriaLabelText } = modalProps(type, t); diff --git a/src/components/reservation/forms/helper.ts b/src/components/reservation/forms/helper.ts index 57fb88b84f..97c50bf00a 100644 --- a/src/components/reservation/forms/helper.ts +++ b/src/components/reservation/forms/helper.ts @@ -1,9 +1,5 @@ -import { UseMutateFunction } from "react-query"; -import { - AuthenticatedPatronV6, - PatronV5, - UpdatePatronRequestV4 -} from "../../../core/fbs/model"; +import { PatronV5 } from "../../../core/fbs/model"; +import useSavePatron from "../../../core/utils/useSavePatron"; export type ModalReservationFormTextType = | "email" @@ -63,14 +59,7 @@ type SaveText = { changedText: string; savedText?: string; patron: PatronV5; - mutate: UseMutateFunction< - AuthenticatedPatronV6 | null, - void, - { - data: UpdatePatronRequestV4; - }, - unknown - >; + savePatron: ReturnType["savePatron"]; }; export const saveText = ({ @@ -78,48 +67,26 @@ export const saveText = ({ changedText, savedText, patron, - mutate + savePatron }: SaveText) => { - return new Promise((resolve, reject) => { - const textDiffers = changedText !== savedText; - const updatedPatronData = constructPatronSaveData({ - type, - value: changedText, - patron - }); + const textDiffers = changedText !== savedText; + const updatedPatronData = constructPatronSaveData({ + type, + value: changedText, + patron + }); - // If we cannot construct the updated patron data we do not want to save anything. - if (!updatedPatronData) { - reject(new Error("Cannot construct updated patron data")); - return; - } - // If the email address is the same we do not want to save anything. - if (!textDiffers) { - resolve(""); - return; - } + // If we cannot construct the updated patron data we do not want to save anything. + if (!updatedPatronData) { + throw new Error("Cannot construct updated patron data"); + } + // If the text has not changed we do not want to save anything. + if (!textDiffers) { + return; + } - // Update user data. - mutate( - { - data: { - patron: updatedPatronData - } - }, - { - onSuccess: (response) => { - if (!response) { - reject(new Error("We did not get a response from the server")); - return; - } - resolve(response); - }, - onError: (e) => { - reject(e); - } - } - ); - }); + // Update patron data. + savePatron(updatedPatronData); }; export function modalReservationFormSelectTypeIsInterestPeriod( diff --git a/src/core/mount.js b/src/core/mount.js index 1c50421e88..c4d0ba9d52 100644 --- a/src/core/mount.js +++ b/src/core/mount.js @@ -6,6 +6,7 @@ import Store from "../components/store"; import { persistor, store } from "./store"; import ErrorBoundaryAlert from "../components/error-boundary-alert/ErrorBoundaryAlert"; import { closeLastModal } from "./modal.slice"; +import forwardError from "./utils/forwardError"; /** * We look for containers and corresponding applications. @@ -37,6 +38,8 @@ function mount(context) { // Logging should be acceptable in an error handler. // eslint-disable-next-line no-console console.error(error, info); + + forwardError(error, info); } }), { diff --git a/src/core/utils/extractErrorDetails.js b/src/core/utils/extractErrorDetails.js new file mode 100644 index 0000000000..f9796584b9 --- /dev/null +++ b/src/core/utils/extractErrorDetails.js @@ -0,0 +1,33 @@ +/** + * Extracts error details from a stack trace. + * + * @param {string} stack - The stack trace. + * @returns {Object} An object containing filename, lineNumber, and column. + */ +const extractErrorDetails = (stack) => { + const stackLines = (stack || "").split("\n"); + const match = stackLines + .map((line) => { + // Extract filename, lineNumber, and column from a string formatted like "filename:line:column" + const parts = line.match(/(?:\()?(.*?):(\d+):(\d+)(?:\))?/); + if (parts) { + const [, filename, lineNumber, column] = parts; + return { + filename, + lineNumber, + column + }; + } + return null; + }) + .find((m) => m); + return ( + match || { + filename: "unknown", + lineNumber: "0", + column: "0" + } + ); +}; + +export default extractErrorDetails; diff --git a/src/core/utils/forwardError.js b/src/core/utils/forwardError.js new file mode 100644 index 0000000000..26db9968cd --- /dev/null +++ b/src/core/utils/forwardError.js @@ -0,0 +1,29 @@ +import extractErrorDetails from "./extractErrorDetails"; + +/** + * Forwards an error to the window.onerror handler. + * + * @param {Error} error - The error object. + * @param {Object} info - Additional info, including component stack trace. + */ +const forwardError = (error, info) => { + const { filename, lineNumber, column } = extractErrorDetails( + info.componentStack + ); + + // Call window.onerror to send the error to the error logging system. + if (window.onerror) { + window.onerror( + `${error.name}: ${error.message}`, + filename, + lineNumber, + column, + { + ...info, + stack: info.componentStack + } + ); + } +}; + +export default forwardError; diff --git a/src/core/utils/useSavePatron.tsx b/src/core/utils/useSavePatron.tsx new file mode 100644 index 0000000000..b6a1481d83 --- /dev/null +++ b/src/core/utils/useSavePatron.tsx @@ -0,0 +1,88 @@ +import { useQueryClient } from "react-query"; +import { Patron } from "./types/entities"; +import { PatronSettingsV4, PincodeChange } from "../fbs/model"; +import { + getGetPatronInformationByPatronIdV2QueryKey, + useUpdateV5 +} from "../fbs/fbs"; + +export interface FetchHandlers { + onSuccess?: () => void; + onError?: () => void; +} + +interface UseSavePatron { + patron?: Patron; + fetchHandlers?: { + savePatron?: FetchHandlers; + savePincode?: FetchHandlers; + }; +} + +const useSavePatron = ({ patron, fetchHandlers }: UseSavePatron) => { + const { mutate } = useUpdateV5(); + const queryClient = useQueryClient(); + + const savePatron = (data: Partial) => { + const { onSuccess, onError } = fetchHandlers?.savePatron || {}; + + if (!patron) { + return; + } + + mutate( + { + data: { patron: { ...patron, ...data } } + }, + { + onSuccess: () => { + queryClient.invalidateQueries( + getGetPatronInformationByPatronIdV2QueryKey() + ); + if (onSuccess) { + onSuccess(); + } + }, + // todo error handling + onError: () => { + if (onError) { + onError(); + } + } + } + ); + }; + + const savePincode = (data: PincodeChange) => { + const { onSuccess, onError } = fetchHandlers?.savePincode || {}; + if (!patron) { + return; + } + + mutate( + { + data: { pincodeChange: data } + }, + { + onSuccess: () => { + queryClient.invalidateQueries( + getGetPatronInformationByPatronIdV2QueryKey() + ); + if (onSuccess) { + onSuccess(); + } + }, + // todo error handling + onError: () => { + if (onError) { + onError(); + } + } + } + ); + }; + + return { savePatron, savePincode }; +}; + +export default useSavePatron; diff --git a/yarn.lock b/yarn.lock index e2e940cb18..eed1ebc35e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1575,10 +1575,10 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@danskernesdigitalebibliotek/dpl-design-system@^2024.25.0-44a88057ebe723f137f5ebe751cf0b6953c029b3": - version "2024.25.0-44a88057ebe723f137f5ebe751cf0b6953c029b3" - resolved "https://npm.pkg.github.com/download/@danskernesdigitalebibliotek/dpl-design-system/2024.25.0-44a88057ebe723f137f5ebe751cf0b6953c029b3/6f33c5c5585bc18f741154259d12281082ff412d#6f33c5c5585bc18f741154259d12281082ff412d" - integrity sha512-gEJ/WogSL0SrLJ44paBATHOdwmyr6LWDm3Bhu03P7NWrW9ll2ehTbjSO+X26IUR6L70l327+gctyDFIaYncwwg== +"@danskernesdigitalebibliotek/dpl-design-system@^2024.27.0-50a60f2057fffa8dac33aaaa4ceff523369c6b68": + version "2024.27.0-50a60f2057fffa8dac33aaaa4ceff523369c6b68" + resolved "https://npm.pkg.github.com/download/@danskernesdigitalebibliotek/dpl-design-system/2024.27.0-50a60f2057fffa8dac33aaaa4ceff523369c6b68/1de5c2809566426843328d6de056c659a996709d#1de5c2809566426843328d6de056c659a996709d" + integrity sha512-sKLcf9Q+JrY16EsFZ7SAej1UPl4WT4WJAWDDQvMoEPIH5yTSW7NO1hDxx8GF8DdDoBXljHQsDNUJp4hp7zbz4Q== "@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": version "0.5.7" @@ -4733,10 +4733,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^20.14.2": - version "20.14.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" - integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== +"@types/node@*", "@types/node@^20.14.9": + version "20.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" + integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== dependencies: undici-types "~5.26.4" @@ -4970,15 +4970,15 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/parser@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.13.0.tgz#9489098d68d57ad392f507495f2b82ce8b8f0a6b" - integrity sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA== +"@typescript-eslint/parser@^7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.14.1.tgz#13d97f357aed3c5719f259a6cc3d1a1f065d3692" + integrity sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA== dependencies: - "@typescript-eslint/scope-manager" "7.13.0" - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/typescript-estree" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" + "@typescript-eslint/scope-manager" "7.14.1" + "@typescript-eslint/types" "7.14.1" + "@typescript-eslint/typescript-estree" "7.14.1" + "@typescript-eslint/visitor-keys" "7.14.1" debug "^4.3.4" "@typescript-eslint/scope-manager@5.23.0": @@ -4989,13 +4989,13 @@ "@typescript-eslint/types" "5.23.0" "@typescript-eslint/visitor-keys" "5.23.0" -"@typescript-eslint/scope-manager@7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz#6927d6451537ce648c6af67a2327378d4cc18462" - integrity sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng== +"@typescript-eslint/scope-manager@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz#63de7a577bc6fe8ee6e412a5b85499f654b93ee5" + integrity sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA== dependencies: - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" + "@typescript-eslint/types" "7.14.1" + "@typescript-eslint/visitor-keys" "7.14.1" "@typescript-eslint/type-utils@5.23.0": version "5.23.0" @@ -5011,10 +5011,10 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.23.0.tgz" integrity sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw== -"@typescript-eslint/types@7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.13.0.tgz#0cca95edf1f1fdb0cfe1bb875e121b49617477c5" - integrity sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA== +"@typescript-eslint/types@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.14.1.tgz#a43a540dbe5df7f2a11269683d777fc50b4350aa" + integrity sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg== "@typescript-eslint/typescript-estree@5.23.0": version "5.23.0" @@ -5029,13 +5029,13 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz#4cc24fc155088ebf3b3adbad62c7e60f72c6de1c" - integrity sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw== +"@typescript-eslint/typescript-estree@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz#ba7c9bac8744487749d19569e254d057754a1575" + integrity sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA== dependencies: - "@typescript-eslint/types" "7.13.0" - "@typescript-eslint/visitor-keys" "7.13.0" + "@typescript-eslint/types" "7.14.1" + "@typescript-eslint/visitor-keys" "7.14.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -5063,12 +5063,12 @@ "@typescript-eslint/types" "5.23.0" eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz#2eb7ce8eb38c2b0d4a494d1fe1908e7071a1a353" - integrity sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw== +"@typescript-eslint/visitor-keys@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz#cc79b5ea154aea734b2a13b983670749f5742274" + integrity sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA== dependencies: - "@typescript-eslint/types" "7.13.0" + "@typescript-eslint/types" "7.14.1" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -5932,15 +5932,15 @@ array.prototype.toreversed@^1.1.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.2: @@ -6806,15 +6806,15 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0, browserslist@^4.23.1: + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" bser@2.1.1: version "2.1.1" @@ -7089,10 +7089,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001636: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001629, caniuse-lite@^1.0.30001639: + version "1.0.30001639" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz#972b3a6adeacdd8f46af5fc7f771e9639f6c1521" + integrity sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg== capital-case@^1.0.4: version "1.0.4" @@ -8133,38 +8133,38 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.2.tgz#65fab7e93d2d28b7b1fd96fbcb0be55dc50f6f87" - integrity sha512-z95kGKZx8VWHfERj7LFzuiTxylbvEp07ZEYaFu+t6bFyNOXLd/+3oPyNaY7ISwcrfHFCkt8OfRo4IZxVRJZ7dg== +cssnano-preset-default@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.3.tgz#dd554e4d5bef3da50e40d725c7ba0b49053a993c" + integrity sha512-dQ3Ba1p/oewICp/szF1XjFFgql8OlOBrI2YNBUUwhHQnJNoMOcQTa+Bi7jSJN8r/eM1egW0Ud1se/S7qlduWKA== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" css-declaration-sorter "^7.2.0" cssnano-utils "^5.0.0" postcss-calc "^10.0.0" - postcss-colormin "^7.0.0" - postcss-convert-values "^7.0.0" - postcss-discard-comments "^7.0.0" + postcss-colormin "^7.0.1" + postcss-convert-values "^7.0.1" + postcss-discard-comments "^7.0.1" postcss-discard-duplicates "^7.0.0" postcss-discard-empty "^7.0.0" postcss-discard-overridden "^7.0.0" - postcss-merge-longhand "^7.0.1" - postcss-merge-rules "^7.0.1" + postcss-merge-longhand "^7.0.2" + postcss-merge-rules "^7.0.2" postcss-minify-font-values "^7.0.0" postcss-minify-gradients "^7.0.0" - postcss-minify-params "^7.0.0" - postcss-minify-selectors "^7.0.1" + postcss-minify-params "^7.0.1" + postcss-minify-selectors "^7.0.2" postcss-normalize-charset "^7.0.0" postcss-normalize-display-values "^7.0.0" postcss-normalize-positions "^7.0.0" postcss-normalize-repeat-style "^7.0.0" postcss-normalize-string "^7.0.0" postcss-normalize-timing-functions "^7.0.0" - postcss-normalize-unicode "^7.0.0" + postcss-normalize-unicode "^7.0.1" postcss-normalize-url "^7.0.0" postcss-normalize-whitespace "^7.0.0" - postcss-ordered-values "^7.0.0" - postcss-reduce-initial "^7.0.0" + postcss-ordered-values "^7.0.1" + postcss-reduce-initial "^7.0.1" postcss-reduce-transforms "^7.0.0" postcss-svgo "^7.0.1" postcss-unique-selectors "^7.0.1" @@ -8174,13 +8174,13 @@ cssnano-utils@^5.0.0: resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== -cssnano@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.2.tgz#a36578a30aaf3d90da2a95cbebd41d9178d81bd6" - integrity sha512-LXm/Xx6TNLzfHM2lBaIQHfvtdW5QfdbyLzfJAWZrclCAb47yVa0/yJG69+amcw3Lq0YZ+kyU40rbsMPLcMt9aw== +cssnano@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.3.tgz#f7ea770931c84ffd4e7c07fbd1993cee602e4dd1" + integrity sha512-lsekJctOTqdCn4cNrtrSwsuMR/fHC+oiVMHkp/OugBWtwjH8XJag1/OtGaYJGtz0un1fQcRy4ryfYTQsfh+KSQ== dependencies: - cssnano-preset-default "^7.0.2" - lilconfig "^3.1.1" + cssnano-preset-default "^7.0.3" + lilconfig "^3.1.2" csso@^5.0.5: version "5.0.5" @@ -8899,10 +8899,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz" integrity sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ== -electron-to-chromium@^1.4.668: - version "1.4.681" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.681.tgz#5f23fad8aa7e1f64cbb7dd9d15c7e39a1cd7e6e3" - integrity sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg== +electron-to-chromium@^1.4.796: + version "1.4.810" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz#7dee01b090b9e048e6db752f7b30921790230654" + integrity sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ== elegant-spinner@^1.0.1: version "1.0.1" @@ -9267,7 +9267,7 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== @@ -9446,7 +9446,7 @@ esbuild@^0.19.11: "@esbuild/win32-ia32" "0.19.12" "@esbuild/win32-x64" "0.19.12" -escalade@^3.1.1: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -9601,16 +9601,16 @@ eslint-plugin-react-hooks@^4.6.2: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== -eslint-plugin-react@^7.34.2: - version "7.34.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz#2780a1a35a51aca379d86d29b9a72adc6bfe6b66" - integrity sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw== +eslint-plugin-react@^7.34.3: + version "7.34.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" + integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" es-iterator-helpers "^1.0.19" estraverse "^5.3.0" @@ -11041,10 +11041,10 @@ graphql-ws@^5.4.1: resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.8.1.tgz" integrity sha512-UVf/fxlHultC1+12tX9ShTIipqQFNZ96g7N51RFQlk7MFPsDUUMCR3QXVEzHEd5xlTp16rs5vCyfBljvcPN3fA== -graphql@^16.8.2: - version "16.8.2" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.2.tgz#54771c7ff195da913f5e70af8044a026d32eca2a" - integrity sha512-cvVIBILwuoSyD54U4cF/UXDh5yAobhNV/tPygI4lZhgOIJQE/WLWC4waBRb4I6bDVYb3OVx3lfHbaQOEoUD5sg== +graphql@^16.9.0: + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== gud@^1.0.0: version "1.0.0" @@ -11063,10 +11063,10 @@ handlebars@^4.7.7: optionalDependencies: uglify-js "^3.1.4" -happy-dom@^14.12.0: - version "14.12.0" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-14.12.0.tgz#40c748578c6ebfb707e6ae69179d6c541d8f63b3" - integrity sha512-dHcnlGFY2o2CdxfuYpqwSrBrpj/Kuzv4u4f3TU5yHW1GL24dKij4pv1BRjXnXc3uWo8qsCbToF9weaDsm/He8A== +happy-dom@^14.12.3: + version "14.12.3" + resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-14.12.3.tgz#1b5892c670461fd1db041bee690981c22d3d521f" + integrity sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g== dependencies: entities "^4.5.0" webidl-conversions "^7.0.0" @@ -13053,10 +13053,10 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@^3.0.0, lilconfig@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== +lilconfig@^3.0.0, lilconfig@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== lines-and-columns@^1.1.6: version "1.1.6" @@ -15266,10 +15266,10 @@ picocolors@^0.2.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" @@ -15412,28 +15412,30 @@ postcss-cli@^11.0.0: slash "^5.0.0" yargs "^17.0.0" -postcss-colormin@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.0.tgz#76b9e40eff69a363c1fc5ce2f0ece1d4a01d1de8" - integrity sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg== +postcss-colormin@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.1.tgz#6534c7d1175e30f788d4ced891436ad2fa3bd173" + integrity sha512-uszdT0dULt3FQs47G5UHCduYK+FnkLYlpu1HpWu061eGsKZ7setoG7kA+WC9NQLsOJf69D5TxGHgnAdRgylnFQ== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" caniuse-api "^3.0.0" colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.0.tgz#4a53e79c4bd81cfed8a7ed3fffb7b255a2f5f300" - integrity sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w== +postcss-convert-values@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.1.tgz#df84dab80a03b30a4b4dba68b348fb07e649a3c3" + integrity sha512-9x2ofb+hYPwHWMlWAzyWys2yMDZYGfkX9LodbaVTmLdlupmtH2AGvj8Up95wzzNPRDEzPIxQIkUaPJew3bT6xA== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" postcss-value-parser "^4.2.0" -postcss-discard-comments@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.0.tgz#3919e4237630f74927f3976ac5789cfc26731494" - integrity sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA== +postcss-discard-comments@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.1.tgz#00b01c5a99e95f97927b0ba12a1c422ab90bf55f" + integrity sha512-GVrQxUOhmle1W6jX2SvNLt4kmN+JYhV7mzI6BMnkAWR9DtVvg8e67rrV0NfdWhn7x1zxvzdWkMBPdBDCls+uwQ== + dependencies: + postcss-selector-parser "^6.1.0" postcss-discard-duplicates@^7.0.0: version "7.0.0" @@ -15490,20 +15492,20 @@ postcss-media-query-parser@^0.2.3: resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= -postcss-merge-longhand@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.1.tgz#5ea565f9fd13e81c92eceea6bdbe405e22250aea" - integrity sha512-qZlD26hnqSTMxSSOMS8+QCeRWtqOdMKeQHvHcBhjL3mJxKUs47cvO1Y1x3iTdYIk3ioMcRHTiy229TT0mEMH/A== +postcss-merge-longhand@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.2.tgz#b9fddce88498ca7e45ff130163b69864b25c05dc" + integrity sha512-06vrW6ZWi9qeP7KMS9fsa9QW56+tIMW55KYqF7X3Ccn+NI2pIgPV6gFfvXTMQ05H90Y5DvnCDPZ2IuHa30PMUg== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^7.0.1" + stylehacks "^7.0.2" -postcss-merge-rules@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.1.tgz#7666fc259eb8af7b8bc89e02fa60c73d4e0c7c84" - integrity sha512-bb8McYQbo2etgs0uVt6AfngajACK3FHSVP3sGLhprrjbtHJWgG03JZ4KKBlJ8/5Fb8/Rr+mMKaybMYeoYrAg0A== +postcss-merge-rules@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz#f7c991576cff4c7d0a8f16101c20bbfa9426695c" + integrity sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" caniuse-api "^3.0.0" cssnano-utils "^5.0.0" postcss-selector-parser "^6.1.0" @@ -15524,20 +15526,21 @@ postcss-minify-gradients@^7.0.0: cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.0.tgz#dfa8263d38570b1116da2c72f69190ea665b17aa" - integrity sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ== +postcss-minify-params@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.1.tgz#08d753bb09d3ebf1a6d6fb0968d60bb3b981e513" + integrity sha512-e+Xt8xErSRPgSRFxHeBCSxMiO8B8xng7lh8E0A5ep1VfwYhY8FXhu4Q3APMjgx9YDDbSp53IBGENrzygbUvgUQ== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.1.tgz#83844f37130c3fb04b4c1382085be84ed56ecc1a" - integrity sha512-YfIbGtcgMFquPxV2L/ASs36ZS4DsgfcDX9tQ8cTEIvBTv+0GXFKtcvvpi9tCKto/+DWGWYKMCESFG3Pnan0Feg== +postcss-minify-selectors@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.2.tgz#869c8ef885a4f9c2550d0d5ec1a2876027d3965c" + integrity sha512-dCzm04wqW1uqLmDZ41XYNBJfjgps3ZugDpogAmJXoCb5oCiTzIX4oPXXKxDpTvWOnKxQKR4EbV4ZawJBLcdXXA== dependencies: + cssesc "^3.0.0" postcss-selector-parser "^6.1.0" postcss-modules-extract-imports@^2.0.0: @@ -15641,12 +15644,12 @@ postcss-normalize-timing-functions@^7.0.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.0.tgz#bd66bfc238bf4d1eaea356639260c04fce408476" - integrity sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w== +postcss-normalize-unicode@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.1.tgz#6545debfff2b4b154583cb24bb388b9681ffa119" + integrity sha512-PTPGdY9xAkTw+8ZZ71DUePb7M/Vtgkbbq+EoI33EuyQEzbKemEQMhe5QSr0VP5UfZlreANDPxSfcdSprENcbsg== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" postcss-value-parser "^4.2.0" postcss-normalize-url@^7.0.0: @@ -15663,20 +15666,20 @@ postcss-normalize-whitespace@^7.0.0: dependencies: postcss-value-parser "^4.2.0" -postcss-ordered-values@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.0.tgz#cea4e2a140ed1c7b055e0ab967b82a36b584debf" - integrity sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w== +postcss-ordered-values@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz#8b4b5b8070ca7756bd49f07d5edf274b8f6782e0" + integrity sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw== dependencies: cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-reduce-initial@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.0.tgz#a9e64778dd44604c2bda109e2fd14b99ab0d1416" - integrity sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ== +postcss-reduce-initial@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.1.tgz#d5308153f757ff9dd5b041cd4954a7592ef0d43b" + integrity sha512-0JDUSV4bGB5FGM5g8MkS+rvqKukJZ7OTHw/lcKn7xPNqeaqJyQbUO8/dJpvyTpaVwPsd3Uc33+CfNzdVowp2WA== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" caniuse-api "^3.0.0" postcss-reduce-transforms@^7.0.0: @@ -15745,13 +15748,13 @@ postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0 picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.15, postcss@^8.4.21, postcss@^8.4.28, postcss@^8.4.33, postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.2.15, postcss@^8.4.21, postcss@^8.4.28, postcss@^8.4.33, postcss@^8.4.39: + version "8.4.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" + integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" + picocolors "^1.0.1" source-map-js "^1.2.0" preact@~10.12.1: @@ -17113,10 +17116,10 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sass@^1.69.5, sass@^1.77.5: - version "1.77.5" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.5.tgz#5f9009820297521356e962c0bed13ee36710edfe" - integrity sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg== +sass@^1.69.5, sass@^1.77.6: + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -18227,12 +18230,12 @@ style-to-object@0.3.0, style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -stylehacks@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.1.tgz#0e071acfbfdbc5ff422c27f1894a60a8bfe58885" - integrity sha512-PnrT4HzajnxbjfChpeBKLSpSykilnGBlD+pIffCoT5KbLur9fcL8uKRQJJap85byR2wCYZl/4Otk5eq76qeZxQ== +stylehacks@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.2.tgz#cc0ec317e9d5b30fdbdfe7ed6b8d3b1a8c57fa06" + integrity sha512-HdkWZS9b4gbgYTdMg4gJLmm7biAUug1qTqXjS+u8X+/pUd+9Px1E+520GnOW3rST9MNsVOVpsJG+mPHNosxjOQ== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.1" postcss-selector-parser "^6.1.0" stylelint-config-prettier@^9.0.5: @@ -18272,10 +18275,10 @@ stylelint-scss@^4.0.0: postcss-selector-parser "^6.0.6" postcss-value-parser "^4.1.0" -stylelint-scss@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.3.1.tgz#eb56f23f4d3e0896647365ab1681653a00bdbc2b" - integrity sha512-w/czBoWUZxJNk5fBRPODcXSN4qcPv3WHjTSSpFovVY+TE3MZTMR0yRlbmaDYrm8tTWHvpwQAuEBZ0lk2wwkboQ== +stylelint-scss@^6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.3.2.tgz#085072e774e5a31e65aa2acefaad5417a29d6ec1" + integrity sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA== dependencies: known-css-properties "^0.31.0" postcss-media-query-parser "^0.2.3" @@ -19391,13 +19394,13 @@ upath@^1.1.1: resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" upper-case-first@^2.0.2: version "2.0.2" @@ -19938,10 +19941,10 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -"webpack@>=4.43.0 <6.0.0", webpack@^5.9.0, webpack@^5.92.0: - version "5.92.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.0.tgz#cc114c71e6851d220b1feaae90159ed52c876bdf" - integrity sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA== +"webpack@>=4.43.0 <6.0.0", webpack@^5.9.0, webpack@^5.92.1: + version "5.92.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.1.tgz#eca5c1725b9e189cffbd86e8b6c3c7400efc5788" + integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -20203,15 +20206,10 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@^8.2.3: - version "8.5.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@^8.3.0: - version "8.6.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz" - integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== +ws@^8.2.3, ws@^8.3.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== x-default-browser@^0.4.0: version "0.4.0"