diff --git a/apps/ui-community/src/App.stories.tsx b/apps/ui-community/src/App.stories.tsx index 65be47257..adad0411d 100644 --- a/apps/ui-community/src/App.stories.tsx +++ b/apps/ui-community/src/App.stories.tsx @@ -1,10 +1,12 @@ import { ApolloProvider } from '@apollo/client'; +import { FeatureFlagProvider } from '@ocom/ui-shared'; import type { Meta, StoryObj } from '@storybook/react-vite'; import { AuthProvider } from 'react-oidc-context'; import { MemoryRouter } from 'react-router-dom'; import { expect } from 'storybook/test'; import App from './App.tsx'; import { client } from './components/ui/organisms/apollo-connection/apollo-client-links.tsx'; +import { featureFlagConfig } from './config/feature-flag-config.ts'; // Mock environment variables const mockEnv = { @@ -64,17 +66,19 @@ const meta = { }, decorators: [ (Story) => ( - - - - - + + + + + + + ), ], } satisfies Meta; diff --git a/apps/ui-community/src/App.tsx b/apps/ui-community/src/App.tsx index 83cd0fd0f..0497e3f37 100644 --- a/apps/ui-community/src/App.tsx +++ b/apps/ui-community/src/App.tsx @@ -2,6 +2,7 @@ import { RequireAuth } from '@cellix/ui-core'; import { Accounts } from '@ocom/ui-community-route-accounts'; import { Admin } from '@ocom/ui-community-route-admin'; import { Root } from '@ocom/ui-community-route-root'; +import { MaintenanceMessage, MaintenanceMessageProvider, useMaintenanceMessage } from '@ocom/ui-shared'; import { Route, Routes } from 'react-router-dom'; import './App.css'; import { AuthLanding } from './components/ui/molecules/auth-landing/index.tsx'; @@ -16,41 +17,47 @@ export default function App() { const rootSection = ; - const communitySection = ( - - - } - /> - } - /> - } - /> - - - ); - return ( - - - - - + + + + + } + /> + + ); } + +function CommunitySection() { + const { isMaintenance } = useMaintenanceMessage(); + + const routes = ( + + } + /> + } + /> + } + /> + + ); + + return {isMaintenance ? : routes}; +} diff --git a/apps/ui-staff/src/App.tsx b/apps/ui-staff/src/App.tsx index 0541f62e4..c56bd80f5 100644 --- a/apps/ui-staff/src/App.tsx +++ b/apps/ui-staff/src/App.tsx @@ -1,5 +1,5 @@ import { RequireAuth } from '@cellix/ui-core'; -import { HandleLogout } from '@ocom/ui-shared'; +import { HandleLogout, MaintenanceMessage, MaintenanceMessageProvider, useMaintenanceMessage } from '@ocom/ui-shared'; import { Root as CommunityManagement } from '@ocom/ui-staff-route-community-management'; import { Root as Finance } from '@ocom/ui-staff-route-finance'; import { Root } from '@ocom/ui-staff-route-root'; @@ -115,34 +115,33 @@ export default function App() { return ( - - - - } - /> - - {/* StaffSection renders StaffAuthProvider + StaffRoutes which handles all - authenticated sub-routes with permission guards. No nested Route children - are needed here because StaffRoutes defines its own Routes block. */} - - + + + + + } + /> + + + ); } function StaffSection({ identity }: { identity: Parameters[0]['value'] }) { const { permissions, enterpriseAppRole, user, loading } = useStaffPermissions(); + const { isMaintenance } = useMaintenanceMessage(); if (loading) { return ( @@ -151,6 +150,9 @@ function StaffSection({ identity }: { identity: Parameters ); } + if (isMaintenance) { + return ; + } return ( diff --git a/packages/ocom/graphql/src/schema/types/server-date.graphql b/packages/ocom/graphql/src/schema/types/server-date.graphql new file mode 100644 index 000000000..99bf4f92f --- /dev/null +++ b/packages/ocom/graphql/src/schema/types/server-date.graphql @@ -0,0 +1,3 @@ +extend type Query { + serverDate: DateTime! +} diff --git a/packages/ocom/graphql/src/schema/types/server-date.resolvers.ts b/packages/ocom/graphql/src/schema/types/server-date.resolvers.ts new file mode 100644 index 000000000..d05aee680 --- /dev/null +++ b/packages/ocom/graphql/src/schema/types/server-date.resolvers.ts @@ -0,0 +1,9 @@ +import type { Resolvers } from '../builder/generated.ts'; + +const serverDate: Resolvers = { + Query: { + serverDate: () => new Date(), + }, +}; + +export default serverDate; diff --git a/packages/ocom/ui-community-route-accounts/src/section-layout.tsx b/packages/ocom/ui-community-route-accounts/src/section-layout.tsx index c204ae9ab..03524f989 100644 --- a/packages/ocom/ui-community-route-accounts/src/section-layout.tsx +++ b/packages/ocom/ui-community-route-accounts/src/section-layout.tsx @@ -1,10 +1,11 @@ -import { LoggedInUserContainer } from '@ocom/ui-shared'; +import { ImpendingMessage, LoggedInUserContainer, MaintenanceMessage, useMaintenanceMessage } from '@ocom/ui-shared'; import { Layout, theme } from 'antd'; import { Outlet } from 'react-router-dom'; const { Header } = Layout; export const SectionLayout: React.FC = () => { + const { isImpending, isMaintenance } = useMaintenanceMessage(); const { token: { colorBgContainer }, } = theme.useToken(); @@ -29,8 +30,10 @@ export const SectionLayout: React.FC = () => { + {isImpending && } + {isMaintenance && } - + = (props) => { const params = useParams(); + const { isImpending, isMaintenance } = useMaintenanceMessage(); const sidebarCollapsed = localStorage.getItem(LocalSettingsKeys.SidebarCollapsed); const [isExpanded, setIsExpanded] = useState(!sidebarCollapsed); const { @@ -86,8 +87,13 @@ export const SectionLayout: React.FC = (props) => { + {isImpending && } + {isMaintenance && } - + ( + + + + ), + ], } satisfies Meta; export default meta; diff --git a/packages/ocom/ui-shared/package.json b/packages/ocom/ui-shared/package.json index a399c06c1..1d8cb2d78 100644 --- a/packages/ocom/ui-shared/package.json +++ b/packages/ocom/ui-shared/package.json @@ -35,7 +35,9 @@ "@graphql-typed-document-node/core": "^3.2.0", "antd": "catalog:", "async-retry": "^1.3.3", + "dayjs": "^1.11.19", "graphql": "catalog:", + "html-react-parser": "^5.2.6", "lru-cache": "^11.3.6", "react": "catalog:", "react-dom": "catalog:", diff --git a/packages/ocom/ui-shared/src/components/organisms/index.tsx b/packages/ocom/ui-shared/src/components/organisms/index.tsx index e94d86ec1..dceed58a8 100644 --- a/packages/ocom/ui-shared/src/components/organisms/index.tsx +++ b/packages/ocom/ui-shared/src/components/organisms/index.tsx @@ -1,5 +1,6 @@ export { CommunitiesDropdownContainer } from './dropdown-menu/communities-dropdown.container.tsx'; export { type FeatureFlagConfig, type FeatureFlagInterface, FeatureFlagProvider, type FeatureFlagProviderProps, type FeatureFlags, FeatureFlagsContext, useFeatureFlags } from './feature-flag/index.tsx'; export { HandleLogout, LoggedInUserContainer } from './header/index.tsx'; +export { ImpendingMessage, MaintenanceMessage, MaintenanceMessageContext, type MaintenanceMessageInterface, MaintenanceMessageProvider, useMaintenanceMessage } from './maintinence-message/index.tsx'; export { MenuComponent, type MenuComponentProps, type PageLayoutProps } from './navigation/menu-component.tsx'; export { VerticalTabs } from './vertical-tabs/index.tsx'; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/impending-message.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/impending-message.tsx new file mode 100644 index 000000000..d3364a1b0 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/impending-message.tsx @@ -0,0 +1,65 @@ +import { Alert } from 'antd'; +import dayjs from 'dayjs'; +import timezone from 'dayjs/plugin/timezone.js'; +import utc from 'dayjs/plugin/utc.js'; +import type { FC } from 'react'; +import { useFeatureFlags } from '../feature-flag/index.tsx'; +import parse from './parse-html.ts'; +import useMaintenanceMessage from './use-maintenance-message.tsx'; +import 'dayjs/locale/en'; + +dayjs.locale('en'); +dayjs.extend(utc); +dayjs.extend(timezone); + +interface ImpendingMessageProps { + isRootPage?: boolean; + portalKey?: string; +} + +const ImpendingMessage: FC = (props) => { + const portalKey = props.portalKey ?? 'UI_STAFF_PORTAL'; + const { GetFeatureFlagByName } = useFeatureFlags(); + const replaceTokens = (str: string, mapObj: Record) => { + const re = new RegExp(Object.keys(mapObj).join('|'), 'g'); + return str.replace(re, (matched) => mapObj[matched] ?? matched); + }; + + const { isApproachingMaintenance } = useMaintenanceMessage(); + + const formatMessage = () => { + const maintenanceStartTimestamp = GetFeatureFlagByName(`MAINTENANCE_START_TIMESTAMP_${portalKey}`); + const maintenanceEndTimestamp = GetFeatureFlagByName(`MAINTENANCE_END_TIMESTAMP_${portalKey}`); + const impendingMessage = GetFeatureFlagByName(`MAINTENANCE_MSG_IMPENDING_${portalKey}`); + const startTimestampStr = dayjs(maintenanceStartTimestamp).locale('en').tz('America/New_York').format('h:mm a on dddd, MMMM DD, YYYY'); + const endTimestampStr = dayjs(maintenanceEndTimestamp).locale('en').tz('America/New_York').format('h:mm a on dddd, MMMM DD, YYYY'); + const startDateStr = dayjs(maintenanceStartTimestamp).locale('en').tz('America/New_York').format('MMMM DD'); + const endDateStr = dayjs(maintenanceEndTimestamp).locale('en').tz('America/New_York').format('MMMM DD'); + const timeRangeStr = startDateStr === endDateStr ? startDateStr : `${startDateStr} - ${endDateStr}`; + const mapObj = { + '##startTimestampStr##': startTimestampStr, + '##endTimestampStr##': endTimestampStr, + '##timeRangeStr##': timeRangeStr, + }; + return replaceTokens(impendingMessage, mapObj); + }; + + return ( + <> + {props.isRootPage ? ( +
+ {parse(formatMessage())}
} /> + + ) : ( +
+ {parse(formatMessage())}
} /> + + )} + + ); +}; + +export default ImpendingMessage; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/index.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/index.tsx new file mode 100644 index 000000000..b67f62a54 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/index.tsx @@ -0,0 +1,5 @@ +export { default as ImpendingMessage } from './impending-message.tsx'; +export { default as MaintenanceMessage } from './maintenance-message.tsx'; +export { default as MaintenanceMessageContext, type MaintenanceMessageInterface } from './maintenance-message-context.tsx'; +export { default as MaintenanceMessageProvider } from './maintenance-message-provider.tsx'; +export { default as useMaintenanceMessage } from './use-maintenance-message.tsx'; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.stories.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.stories.tsx new file mode 100644 index 000000000..d3ae9daad --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.stories.tsx @@ -0,0 +1,17 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { MaintenanceKickoutMessage } from './maintenance-kickout-message.tsx'; + +const meta = { + title: 'Organisms/Maintenance Kickout Message', + component: MaintenanceKickoutMessage, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + timer: '2:00', + }, +}; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.test.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.test.tsx new file mode 100644 index 000000000..0efd2abf0 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.test.tsx @@ -0,0 +1,44 @@ +import { act } from 'react'; +import { createRoot } from 'react-dom/client'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { MaintenanceKickoutMessage } from './maintenance-kickout-message.tsx'; + +describe('MaintenanceKickoutMessage', () => { + let container: HTMLDivElement; + let root: ReturnType; + + beforeEach(() => { + Object.defineProperty(window, 'matchMedia', { + writable: true, + value: vi.fn().mockImplementation((query: string) => ({ + matches: false, + media: query, + onchange: null, + addListener: vi.fn(), + removeListener: vi.fn(), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })), + }); + container = document.createElement('div'); + document.body.appendChild(container); + root = createRoot(container); + }); + + afterEach(() => { + act(() => { + root.unmount(); + }); + container.remove(); + }); + + it('shows the maintenance countdown warning', () => { + act(() => { + root.render(); + }); + + expect(container.getAttribute('role')).toBeNull(); + expect(container.querySelector('[role="alert"]')?.textContent).toContain('Maintenance will begin in 1:30. Please save your work and log out.'); + }); +}); diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.tsx new file mode 100644 index 000000000..2e1e1a7ed --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-kickout-message.tsx @@ -0,0 +1,17 @@ +import { Alert, Row } from 'antd'; + +export const MaintenanceKickoutMessage = (props: { timer: string }) => { + return ( + + + + ); +}; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-context.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-context.tsx new file mode 100644 index 000000000..d1f1a8f75 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-context.tsx @@ -0,0 +1,27 @@ +import { createContext } from 'react'; + +export interface MaintenanceMessageInterface { + isMaintenance: boolean | undefined; + isImpending: boolean | undefined; + impendingMessage?: string; + maintenanceMessage?: string; + impendingMaintenanceStartTimestamp: string; + maintenanceStartTimestamp: string; + maintenanceEndTimestamp: string; + isApproachingMaintenance: boolean | undefined; +} + +const initialContext = { + isMaintenance: undefined, + isImpending: undefined, + impendingMessage: '', + maintenanceMessage: '', + impendingMaintenanceStartTimestamp: '', + maintenanceStartTimestamp: '', + maintenanceEndTimestamp: '', + isApproachingMaintenance: undefined, +}; + +const MaintenanceMessageContext = createContext(initialContext); + +export default MaintenanceMessageContext; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-provider.graphql b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-provider.graphql new file mode 100644 index 000000000..0d0186d28 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-provider.graphql @@ -0,0 +1,3 @@ +query MaintenanceMessageProviderGetServerDate { + serverDate +} diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-provider.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-provider.tsx new file mode 100644 index 000000000..c22444e59 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message-provider.tsx @@ -0,0 +1,203 @@ +import { useApolloClient, useLazyQuery } from '@apollo/client'; +import dayjs from 'dayjs'; +import React, { type FC, type ReactNode, useEffect, useMemo, useState } from 'react'; +import { useAuth } from 'react-oidc-context'; +import { useNavigate } from 'react-router-dom'; +import { MaintenanceMessageProviderGetServerDateDocument } from '../../../generated.tsx'; +import { useFeatureFlags } from '../feature-flag/index.tsx'; +import { isInStorybookEnv } from '../feature-flag/is-in-storybook-env.ts'; +import { HandleLogout } from '../header/handle-logout.tsx'; +import { MaintenanceKickoutMessage } from './maintenance-kickout-message.tsx'; +import MaintenanceMessageContext from './maintenance-message-context.tsx'; + +type MaintenanceMessageProviderProps = { + children: ReactNode; + // Portal-specific feature-flag suffix, e.g. 'UI_STAFF_PORTAL' or 'UI_COMMUNITY_PORTAL'. + portalKey?: string; + storybookShowImpendingMessage?: boolean; + storybookShowMaintenanceMessage?: boolean; +}; + +const formatTimeCounter = (time: number) => { + const minutes = Math.floor(time / 60); + const seconds = time % 60; + return `${minutes}:${seconds < 10 ? `0${seconds}` : seconds}`; +}; + +const MaintenanceMessageProvider: FC = (props: MaintenanceMessageProviderProps): React.JSX.Element => { + const timeoutEnv = import.meta.env['VITE_APP_UI_STAFF_TIMEOUT_BEFORE_MAINTENANCE']; + const timeoutBeforeMaintenance = Number(timeoutEnv); + const timeoutValue = !Number.isNaN(timeoutBeforeMaintenance) && timeoutBeforeMaintenance > 0 ? timeoutBeforeMaintenance : 120; + const portalKey = props.portalKey ?? 'UI_STAFF_PORTAL'; + const [isImpending, setIsImpending] = useState(undefined); + const [isMaintenance, setIsMaintenance] = useState(undefined); + const [isApproachingMaintenance, setIsApproachingMaintenance] = useState(false); + const [maintenanceCountdown, setMaintenanceCountdown] = useState(timeoutValue); //in seconds + const auth = useAuth(); + const timerInstance = React.useRef | undefined>(undefined); + const apolloClient = useApolloClient(); + const { GetFeatureFlagByName } = useFeatureFlags(); + + const [getServerDate] = useLazyQuery(MaintenanceMessageProviderGetServerDateDocument, { fetchPolicy: 'network-only' }); + + const impendingMaintenanceStartTimestamp = GetFeatureFlagByName(`MAINTENANCE_IMPENDING_TIMESTAMP_${portalKey}`); + const maintenanceStartTimestamp = GetFeatureFlagByName(`MAINTENANCE_START_TIMESTAMP_${portalKey}`); + const maintenanceEndTimestamp = GetFeatureFlagByName(`MAINTENANCE_END_TIMESTAMP_${portalKey}`); + const upcomingMaintenance = GetFeatureFlagByName(`MAINTENANCE_UPCOMING_${portalKey}`); + const impendingMessage = GetFeatureFlagByName(`MAINTENANCE_MSG_IMPENDING_${portalKey}`); + const maintenanceMessage = GetFeatureFlagByName(`MAINTENANCE_MSG_SYSTEM_${portalKey}`); + + const navigate = useNavigate(); + + useEffect(() => { + if (maintenanceCountdown === 0 && auth.isAuthenticated) { + setIsApproachingMaintenance(false); + HandleLogout(auth, apolloClient, window.location.origin); + navigate('/'); + } + }, [maintenanceCountdown, auth, apolloClient, navigate]); + useEffect(() => { + if (!isApproachingMaintenance || !auth.isAuthenticated) { + return; + } + const interval = setInterval(() => { + setMaintenanceCountdown((countdown) => countdown - 1); + }, 1000); + //Clearing the interval + return () => clearInterval(interval); + }, [isApproachingMaintenance, auth]); + + useEffect(() => { + // use local feature flag when in storybook + if (isInStorybookEnv()) { + if (props.storybookShowImpendingMessage) { + setIsMaintenance(false); + setIsImpending(true); + return; + } + if (props.storybookShowMaintenanceMessage) { + setIsMaintenance(true); + setIsImpending(false); + return; + } else { + setIsMaintenance(false); + setIsImpending(false); + return; + } + } + + interface MaintenanceIntervalParams { + maintenanceStartTimestamp: string; + maintenanceEndTimestamp: string; + impendingMaintenanceStartTimestamp: string; + upcomingMaintenance: string; + } + const setIntervalImmediately = async (func: (params: MaintenanceIntervalParams) => Promise, interval: number, params: MaintenanceIntervalParams) => { + await func(params); + return setInterval(func, interval, params); + }; + + const getMaintenanceMessageStatus = async (params: MaintenanceIntervalParams) => { + //If the GetFeatureFlag hasn't resolved it will be empty string + if (params.upcomingMaintenance === '') return; + + if (params.upcomingMaintenance !== 'true') { + setIsMaintenance(false); + setIsImpending(false); + setIsApproachingMaintenance(false); + return; + } + await getServerDate() + .then((data) => { + const serverDate = data.data?.serverDate; + const serverTime = dayjs(serverDate); + const impendingTime = dayjs(params.impendingMaintenanceStartTimestamp); + const maintenanceStartTime = dayjs(params.maintenanceStartTimestamp); + const maintenanceEndTime = dayjs(params.maintenanceEndTimestamp); + + if (serverTime >= impendingTime && serverTime < maintenanceStartTime) { + setIsMaintenance(false); + setIsImpending(true); + // within 1 minute before maintenance start + if (maintenanceStartTime.diff(serverTime, 'seconds') <= timeoutValue) { + setIsApproachingMaintenance(true); + setMaintenanceCountdown(maintenanceStartTime.diff(serverTime, 'seconds')); + } + } else if (serverTime >= maintenanceStartTime && serverTime < maintenanceEndTime) { + setIsMaintenance(true); + setIsImpending(false); + setIsApproachingMaintenance(false); + return; + } else { + setIsMaintenance(false); + setIsImpending(false); + setIsApproachingMaintenance(false); + return; + } + }) + .catch((exception: unknown) => { + console.log('exception: ', exception); + }); + }; + + const intervalParams = { + maintenanceStartTimestamp: maintenanceStartTimestamp, + maintenanceEndTimestamp: maintenanceEndTimestamp, + impendingMaintenanceStartTimestamp: impendingMaintenanceStartTimestamp, + upcomingMaintenance: upcomingMaintenance, + }; + + if (timerInstance.current) { + //cancel timer + clearInterval(timerInstance.current); + timerInstance.current = undefined; + } + setIntervalImmediately(getMaintenanceMessageStatus, 5000, intervalParams) + .then((interval: ReturnType) => { + timerInstance.current = interval; + }) + .catch((exception: unknown) => { + console.log(exception); + }); + + // Cleanup on unmount + return () => { + if (timerInstance.current) { + clearInterval(timerInstance.current); + timerInstance.current = undefined; + } + }; + }, [ + impendingMaintenanceStartTimestamp, + maintenanceEndTimestamp, + maintenanceStartTimestamp, + upcomingMaintenance, + getServerDate, + props.storybookShowImpendingMessage, + props.storybookShowMaintenanceMessage, + timeoutBeforeMaintenance, + ]); + + const contextValues = useMemo( + () => ({ + isImpending: isImpending, + isMaintenance: isMaintenance, + impendingMessage: impendingMessage, + maintenanceMessage: maintenanceMessage, + impendingMaintenanceStartTimestamp: impendingMaintenanceStartTimestamp, + maintenanceStartTimestamp: maintenanceStartTimestamp, + maintenanceEndTimestamp: maintenanceEndTimestamp, + isApproachingMaintenance: isApproachingMaintenance, + }), + [isImpending, isMaintenance, isApproachingMaintenance, impendingMessage, maintenanceMessage, impendingMaintenanceStartTimestamp, maintenanceStartTimestamp, maintenanceEndTimestamp], + ); + + return ( + + {isApproachingMaintenance && auth.isAuthenticated && } + {props.children} + + ); +}; + +export default MaintenanceMessageProvider; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message.tsx new file mode 100644 index 000000000..7d01a8046 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/maintenance-message.tsx @@ -0,0 +1,59 @@ +import { Col, Result, Row } from 'antd'; +import dayjs from 'dayjs'; +import timezone from 'dayjs/plugin/timezone.js'; +import utc from 'dayjs/plugin/utc.js'; +import type { FC } from 'react'; +import { useFeatureFlags } from '../feature-flag/index.tsx'; +import parse from './parse-html.ts'; +import 'dayjs/locale/en'; + +dayjs.locale('en'); +dayjs.extend(utc); +dayjs.extend(timezone); + +interface MaintenanceMessageProps { + portalKey?: string; +} + +const MaintenanceMessage: FC = ({ portalKey = 'UI_STAFF_PORTAL' }) => { + const { GetFeatureFlagByName } = useFeatureFlags(); + const replaceTokens = (str: string, mapObj: Record) => { + const re = new RegExp(Object.keys(mapObj).join('|'), 'g'); + return str.replace(re, (matched) => mapObj[matched] ?? matched); + }; + + const getMessage = () => { + const maintenanceMessage = GetFeatureFlagByName(`MAINTENANCE_MSG_SYSTEM_${portalKey}`); + const maintenanceStartTimestamp = GetFeatureFlagByName(`MAINTENANCE_START_TIMESTAMP_${portalKey}`); + const maintenanceEndTimestamp = GetFeatureFlagByName(`MAINTENANCE_END_TIMESTAMP_${portalKey}`); + const startTimestampStr = dayjs(maintenanceStartTimestamp).tz('America/New_York').format('h:mm a on dddd, MMMM DD, YYYY'); + const endTimestampStr = dayjs(maintenanceEndTimestamp).tz('America/New_York').format('h:mm a on dddd, MMMM DD, YYYY'); + const startDateStr = dayjs(maintenanceStartTimestamp).tz('America/New_York').format('MMMM DD'); + const endDateStr = dayjs(maintenanceEndTimestamp).tz('America/New_York').format('MMMM DD'); + const timeRangeStr = startDateStr === endDateStr ? startDateStr : `${startDateStr} - ${endDateStr}`; + const mapObj = { + '##startTimestampStr##': startTimestampStr, + '##endTimestampStr##': endTimestampStr, + '##timeRangeStr##': timeRangeStr, + }; + return replaceTokens(maintenanceMessage, mapObj); + }; + + return ( +
+ + + + + +
+
{parse(getMessage() ?? '')}
+
+
+ ); +}; + +export default MaintenanceMessage; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/parse-html.ts b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/parse-html.ts new file mode 100644 index 000000000..ff1d015b2 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/parse-html.ts @@ -0,0 +1,10 @@ +import parseHtml from 'html-react-parser'; +import type { ReactNode } from 'react'; + +// The ESM runtime default export of `html-react-parser` is always a callable +// function. tsgo resolves the package's CJS type entry (whose default is typed +// as the module namespace) on clean builds, so we assert the runtime signature +// here to keep a single, faithful `parse(html)` call site everywhere else. +const parse = parseHtml as unknown as (html: string) => ReactNode; + +export default parse; diff --git a/packages/ocom/ui-shared/src/components/organisms/maintinence-message/use-maintenance-message.tsx b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/use-maintenance-message.tsx new file mode 100644 index 000000000..748b048b7 --- /dev/null +++ b/packages/ocom/ui-shared/src/components/organisms/maintinence-message/use-maintenance-message.tsx @@ -0,0 +1,6 @@ +import { useContext } from 'react'; +import MaintenanceMessageContext, { type MaintenanceMessageInterface } from './maintenance-message-context.tsx'; + +const useMaintenanceMessage = (): MaintenanceMessageInterface => useContext(MaintenanceMessageContext); + +export default useMaintenanceMessage; diff --git a/packages/ocom/ui-shared/src/vite-env.d.ts b/packages/ocom/ui-shared/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/packages/ocom/ui-shared/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/ocom/ui-staff-shared/src/section-layout.tsx b/packages/ocom/ui-staff-shared/src/section-layout.tsx index 93dd098d2..ef36f72ce 100644 --- a/packages/ocom/ui-staff-shared/src/section-layout.tsx +++ b/packages/ocom/ui-staff-shared/src/section-layout.tsx @@ -1,5 +1,5 @@ import { DollarOutlined, TeamOutlined, ToolOutlined } from '@ant-design/icons'; -import { MenuComponent, type MenuComponentProps, type PageLayoutProps } from '@ocom/ui-shared'; +import { ImpendingMessage, MaintenanceMessage, MenuComponent, type MenuComponentProps, type PageLayoutProps, useMaintenanceMessage } from '@ocom/ui-shared'; import { Button, Layout, theme } from 'antd'; import { useContext, useState } from 'react'; import { Outlet } from 'react-router-dom'; @@ -36,6 +36,7 @@ export interface SectionLayoutProps { export const SectionLayout: React.FC = (props) => { const auth = useContext(StaffAuthContext); + const { isImpending, isMaintenance } = useMaintenanceMessage(); // Debug logging to track displayName flow if (typeof window !== 'undefined' && typeof window.location !== 'undefined') { @@ -199,8 +200,13 @@ export const SectionLayout: React.FC = (props) => { )} + {isImpending && } + {isMaintenance && } - + xml2js': 0.5.0 tedious>@azure/identity: 4.2.1 -packageExtensionsChecksum: sha256-mDviJarBPcwNNCTUf3T37btBxDGgV1wZ/iUGQfx5OCA= +packageExtensionsChecksum: sha256-/YtMueJN2sKwTWfFUpuXRiXExc0qVbLwmzqnxX3LBP0= patchedDependencies: '@azure/functions@4.11.0': 69772ce521bf6df67d814ff4f419f19b5e966a41c4ce80b5938143ad628e5645 @@ -252,7 +252,7 @@ importers: version: 7.0.0-dev.20260428.1 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) chrome-devtools-mcp: specifier: ^1.3.0 version: 1.3.0 @@ -358,7 +358,7 @@ importers: version: link:../../packages/ocom/local-dev-config '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) archunit: specifier: 'catalog:' version: 2.1.63 @@ -440,7 +440,7 @@ importers: version: 6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -467,7 +467,7 @@ importers: version: 6.18.0 mongoose: specifier: 'catalog:' - version: 8.24.1(supports-color@8.1.1) + version: 8.24.1 devDependencies: '@cellix/config-typescript': specifier: workspace:* @@ -505,7 +505,7 @@ importers: version: link:../../packages/cellix/local-dev '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -611,7 +611,7 @@ importers: version: 6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) esbuild: specifier: 0.28.1 version: 0.28.1 @@ -723,7 +723,7 @@ importers: version: 6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) esbuild: specifier: 0.28.1 version: 0.28.1 @@ -795,7 +795,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -839,7 +839,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -867,7 +867,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -907,7 +907,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -935,7 +935,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -959,7 +959,7 @@ importers: version: 22.19.15 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -987,7 +987,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) mongodb: specifier: 'catalog:' version: 6.18.0 @@ -996,7 +996,7 @@ importers: version: 10.3.0(supports-color@8.1.1) mongoose: specifier: 'catalog:' - version: 8.24.1(supports-color@8.1.1) + version: 8.24.1 rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1011,7 +1011,7 @@ importers: dependencies: '@apollo/server': specifier: 'catalog:' - version: 5.5.0(graphql@16.12.0)(supports-color@8.1.1) + version: 5.5.0(graphql@16.12.0) '@cellix/server-mongodb-memory-mock-seedwork': specifier: workspace:* version: link:../server-mongodb-memory-mock-seedwork @@ -1060,7 +1060,7 @@ importers: version: 19.2.7 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) playwright: specifier: 1.59.0 version: 1.59.0 @@ -1084,7 +1084,7 @@ importers: version: 10.3.0 mongoose: specifier: 'catalog:' - version: 8.24.1(supports-color@8.1.1) + version: 8.24.1 devDependencies: '@cellix/config-typescript': specifier: workspace:* @@ -1125,7 +1125,7 @@ importers: version: 5.0.5 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1159,7 +1159,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1202,7 +1202,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) execa: specifier: ^9.6.0 version: 9.6.1 @@ -1266,7 +1266,7 @@ importers: version: 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) jsdom: specifier: 'catalog:' version: 26.1.0 @@ -1598,7 +1598,7 @@ importers: version: link:../../ocom-verification/archunit-tests '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1644,7 +1644,7 @@ importers: version: link:../../cellix/mongoose-seedwork mongoose: specifier: 'catalog:' - version: 8.24.1(supports-color@8.1.1) + version: 8.24.1 devDependencies: '@cellix/archunit-tests': specifier: workspace:* @@ -1718,7 +1718,7 @@ importers: version: 3.43.0 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1780,7 +1780,7 @@ importers: version: link:../../ocom-verification/archunit-tests '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1795,7 +1795,7 @@ importers: dependencies: '@apollo/server': specifier: 'catalog:' - version: 5.5.0(graphql@16.12.0)(supports-color@8.1.1) + version: 5.5.0(graphql@16.12.0) '@apollo/utils.withrequired': specifier: ^3.0.0 version: 3.0.0 @@ -1823,7 +1823,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1851,7 +1851,7 @@ importers: version: 22.19.15 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1884,7 +1884,7 @@ importers: version: 6.18.0 mongoose: specifier: 'catalog:' - version: 8.24.1(supports-color@8.1.1) + version: 8.24.1 devDependencies: '@cellix/archunit-tests': specifier: workspace:* @@ -1900,7 +1900,7 @@ importers: version: link:../../ocom-verification/archunit-tests '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1934,7 +1934,7 @@ importers: dependencies: '@apollo/server': specifier: 'catalog:' - version: 5.5.0(graphql@16.12.0)(supports-color@8.1.1) + version: 5.5.0(graphql@16.12.0) '@cellix/api-services-spec': specifier: workspace:* version: link:../../cellix/api-services-spec @@ -1962,7 +1962,7 @@ importers: version: 1.1.6 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1987,7 +1987,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2008,7 +2008,7 @@ importers: version: link:../../cellix/mongoose-seedwork mongoose: specifier: 'catalog:' - version: 8.24.1(supports-color@8.1.1) + version: 8.24.1 devDependencies: '@cellix/config-typescript': specifier: workspace:* @@ -2018,7 +2018,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2076,7 +2076,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2101,7 +2101,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2129,7 +2129,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2333,6 +2333,9 @@ importers: '@ocom/ui-community-shared': specifier: workspace:* version: link:../ui-community-shared + '@ocom/ui-shared': + specifier: workspace:* + version: link:../ui-shared antd: specifier: 'catalog:' version: 6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -2497,9 +2500,15 @@ importers: async-retry: specifier: ^1.3.3 version: 1.3.3 + dayjs: + specifier: ^1.11.19 + version: 1.11.19 graphql: specifier: 'catalog:' version: 16.12.0 + html-react-parser: + specifier: ^5.2.6 + version: 5.2.17(@types/react@19.2.7)(react@19.2.8) lru-cache: specifier: ^11.3.6 version: 11.3.6 @@ -2560,7 +2569,7 @@ importers: version: 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + version: 4.1.10(vitest@4.1.10) jsdom: specifier: 'catalog:' version: 26.1.0 @@ -5573,8 +5582,8 @@ packages: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.38.0': - resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} engines: {node: '>=14'} '@oxc-parser/binding-android-arm-eabi@0.121.0': @@ -9696,6 +9705,9 @@ packages: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} + html-dom-parser@5.1.8: + resolution: {integrity: sha512-MCIUng//mF2qTtGHXJWr6OLfHWmg3Pm8ezpfiltF83tizPWY17JxT4dRLE8lykJ5bChJELoY3onQKPbufJHxYA==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -9713,6 +9725,15 @@ packages: engines: {node: ^14.13.1 || >=16.0.0} hasBin: true + html-react-parser@5.2.17: + resolution: {integrity: sha512-m+K/7Moq1jodAB4VL0RXSOmtwLUYoAsikZhwd+hGQe5Vtw2dbWfpFd60poxojMU0Tsh9w59mN1QLEcoHz0Dx9w==} + peerDependencies: + '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 + react: 0.14 || 15 || 16 || 17 || 18 || 19 + peerDependenciesMeta: + '@types/react': + optional: true + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -9732,6 +9753,9 @@ packages: webpack: optional: true + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -12286,6 +12310,9 @@ packages: oidc-client-ts: ^3.1.0 react: '>=16.14.0' + react-property@2.0.2: + resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + react-router-config@5.1.1: resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} peerDependencies: @@ -12717,11 +12744,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -14583,7 +14605,7 @@ snapshots: '@apollo/utils.logger': 3.0.0 graphql: 16.12.0 - '@apollo/server@5.5.0(graphql@16.12.0)(supports-color@8.1.1)': + '@apollo/server@5.5.0(graphql@16.12.0)': dependencies: '@apollo/cache-control-types': 1.0.3(graphql@16.12.0) '@apollo/server-gateway-interface': 2.0.0(graphql@16.12.0) @@ -14600,7 +14622,7 @@ snapshots: body-parser: 2.3.0 content-type: 1.0.5 cors: 2.8.5 - finalhandler: 2.1.1(supports-color@8.1.1) + finalhandler: 2.1.1 graphql: 16.12.0 loglevel: 1.9.2 lru-cache: 11.3.6 @@ -14824,6 +14846,7 @@ snapshots: '@azure/functions-extensions-base': 0.2.0 cookie: 0.7.2 long: 4.0.0 + undici-types: 6.21.0 '@azure/identity@4.13.1': dependencies: @@ -14901,7 +14924,7 @@ snapshots: dependencies: '@azure/core-auth': 1.10.1 '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.2 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) @@ -14909,7 +14932,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -15029,7 +15052,7 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.6(supports-color@8.1.1)': + '@babel/core@7.29.6': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -15038,7 +15061,7 @@ snapshots: '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 @@ -15087,27 +15110,27 @@ snapshots: '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.6) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3(supports-color@8.1.1) @@ -15122,31 +15145,31 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -15160,25 +15183,25 @@ snapshots: '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-replace-supers@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -15198,7 +15221,7 @@ snapshots: '@babel/helper-wrap-function@7.28.3': dependencies: '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -15218,25 +15241,25 @@ snapshots: '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.29.6) @@ -15245,64 +15268,64 @@ snapshots: '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.6) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-imports': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.6) @@ -15311,17 +15334,17 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: @@ -15329,7 +15352,7 @@ snapshots: '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: @@ -15337,55 +15360,55 @@ snapshots: '@babel/plugin-transform-classes@7.28.4(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.6) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.29.7 '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.6) transitivePeerDependencies: @@ -15393,17 +15416,17 @@ snapshots: '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: @@ -15411,36 +15434,36 @@ snapshots: '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: @@ -15448,7 +15471,7 @@ snapshots: '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: @@ -15456,17 +15479,17 @@ snapshots: '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: @@ -15474,39 +15497,39 @@ snapshots: '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.6) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.6) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.6) transitivePeerDependencies: @@ -15514,12 +15537,12 @@ snapshots: '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: @@ -15527,12 +15550,12 @@ snapshots: '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: @@ -15540,7 +15563,7 @@ snapshots: '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 @@ -15549,29 +15572,29 @@ snapshots: '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.6) transitivePeerDependencies: - supports-color '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 @@ -15582,29 +15605,29 @@ snapshots: '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-runtime@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.29.6) @@ -15616,12 +15639,12 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-spread@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: @@ -15629,22 +15652,22 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 @@ -15655,31 +15678,31 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/preset-env@7.28.5(@babel/core@7.29.6)': dependencies: '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 @@ -15754,14 +15777,14 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/types': 7.29.7 esutils: 2.0.3 '@babel/preset-react@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.6) @@ -15773,7 +15796,7 @@ snapshots: '@babel/preset-typescript@7.28.5(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.6) @@ -15816,7 +15839,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.7(supports-color@8.1.1)': + '@babel/traverse@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -16206,7 +16229,7 @@ snapshots: '@cucumber/ci-environment': 13.0.0 '@cucumber/cucumber-expressions': 19.0.0 '@cucumber/gherkin': 38.0.0 - '@cucumber/gherkin-streams': 6.0.0(@cucumber/gherkin@38.0.0)(@cucumber/message-streams@4.1.1(@cucumber/messages@32.3.1))(@cucumber/messages@32.2.0) + '@cucumber/gherkin-streams': 6.0.0(@cucumber/gherkin@38.0.0)(@cucumber/message-streams@4.1.1(@cucumber/messages@32.2.0))(@cucumber/messages@32.2.0) '@cucumber/gherkin-utils': 11.0.0 '@cucumber/html-formatter': 23.0.0(@cucumber/messages@32.2.0) '@cucumber/junit-xml-formatter': 0.13.3(@cucumber/messages@32.2.0) @@ -16243,7 +16266,7 @@ snapshots: yaml: 2.8.3 yup: 1.7.1 - '@cucumber/gherkin-streams@6.0.0(@cucumber/gherkin@38.0.0)(@cucumber/message-streams@4.1.1(@cucumber/messages@32.3.1))(@cucumber/messages@32.2.0)': + '@cucumber/gherkin-streams@6.0.0(@cucumber/gherkin@38.0.0)(@cucumber/message-streams@4.1.1(@cucumber/messages@32.2.0))(@cucumber/messages@32.2.0)': dependencies: '@cucumber/gherkin': 38.0.0 '@cucumber/message-streams': 4.1.1(@cucumber/messages@32.3.1) @@ -16407,7 +16430,7 @@ snapshots: '@docusaurus/babel@3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/generator': 7.29.1 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.6) '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.29.6) @@ -16441,7 +16464,7 @@ snapshots: '@docusaurus/bundler@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@docusaurus/babel': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/cssnano-preset': 3.10.1 '@docusaurus/logger': 3.10.1 @@ -17805,10 +17828,10 @@ snapshots: '@graphql-tools/graphql-tag-pluck@8.3.26(graphql@16.12.0)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/parser': 7.29.7 '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.29.6) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 '@graphql-tools/utils': 10.11.0(graphql@16.12.0) graphql: 16.12.0 @@ -18228,17 +18251,17 @@ snapshots: '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/exporter-logs-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -18307,7 +18330,7 @@ snapshots: '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -18366,7 +18389,7 @@ snapshots: '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.25.1 - semver: 7.7.3 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -18459,13 +18482,13 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/sdk-logs@0.57.2(@opentelemetry/api@1.9.0)': dependencies: @@ -18524,7 +18547,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.43.0 '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: @@ -18534,7 +18557,7 @@ snapshots: '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-jaeger': 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - semver: 7.7.4 + semver: 7.8.5 '@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18546,7 +18569,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.28.0': {} - '@opentelemetry/semantic-conventions@1.38.0': {} + '@opentelemetry/semantic-conventions@1.43.0': {} '@oxc-parser/binding-android-arm-eabi@0.121.0': optional: true @@ -19819,39 +19842,39 @@ snapshots: '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-preset@8.1.0(@babel/core@7.29.6)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.6) '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.6) '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.6) @@ -19863,7 +19886,7 @@ snapshots: '@svgr/core@8.1.0(typescript@6.0.3)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-preset': 8.1.0(@babel/core@7.29.6) camelcase: 6.3.0 cosmiconfig: 8.3.6(typescript@6.0.3) @@ -19879,7 +19902,7 @@ snapshots: '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@6.0.3))': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@svgr/babel-preset': 8.1.0(@babel/core@7.29.6) '@svgr/core': 8.1.0(typescript@6.0.3) '@svgr/hast-util-to-babel-ast': 8.0.0 @@ -19898,7 +19921,7 @@ snapshots: '@svgr/webpack@8.1.0(typescript@6.0.3)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.29.6) '@babel/preset-env': 7.28.5(@babel/core@7.29.6) '@babel/preset-react': 7.28.5(@babel/core@7.29.6) @@ -20353,9 +20376,9 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-istanbul@4.1.10(supports-color@8.1.1)(vitest@4.1.10)': + '@vitest/coverage-istanbul@4.1.10(vitest@4.1.10)': dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@istanbuljs/schema': 0.1.3 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -20972,7 +20995,7 @@ snapshots: babel-loader@9.2.1(@babel/core@7.29.6)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 find-cache-dir: 4.0.0 schema-utils: 4.3.3 webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) @@ -20984,7 +21007,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.29.6): dependencies: '@babel/compat-data': 7.29.7 - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.29.6) semver: 6.3.1 transitivePeerDependencies: @@ -20992,7 +21015,7 @@ snapshots: babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.6): dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.29.6) core-js-compat: 3.47.0 transitivePeerDependencies: @@ -21000,7 +21023,7 @@ snapshots: babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.29.6): dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) + '@babel/core': 7.29.6 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.29.6) transitivePeerDependencies: - supports-color @@ -22581,7 +22604,7 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@2.1.1(supports-color@8.1.1): + finalhandler@2.1.1: dependencies: debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 @@ -23138,6 +23161,11 @@ snapshots: hpagent@1.2.0: {} + html-dom-parser@5.1.8: + dependencies: + domhandler: 5.0.3 + htmlparser2: 10.1.0 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -23164,6 +23192,16 @@ snapshots: relateurl: 0.2.7 terser: 5.44.1 + html-react-parser@5.2.17(@types/react@19.2.7)(react@19.2.8): + dependencies: + domhandler: 5.0.3 + html-dom-parser: 5.1.8 + react: 19.2.8 + react-property: 2.0.2 + style-to-js: 1.1.21 + optionalDependencies: + '@types/react': 19.2.7 + html-tags@3.3.1: {} html-void-elements@3.0.0: {} @@ -23178,6 +23216,13 @@ snapshots: optionalDependencies: webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -24803,13 +24848,13 @@ snapshots: bson: 6.10.4 mongodb-connection-string-url: 3.0.2 - mongoose@8.24.1(supports-color@8.1.1): + mongoose@8.24.1: dependencies: bson: 6.10.4 kareem: 2.6.3 mongodb: 6.20.0 mpath: 0.9.0 - mquery: 5.0.0(supports-color@8.1.1) + mquery: 5.0.0 ms: 2.1.3 sift: 17.1.3 transitivePeerDependencies: @@ -24834,7 +24879,7 @@ snapshots: mpath@0.9.0: {} - mquery@5.0.0(supports-color@8.1.1): + mquery@5.0.0: dependencies: debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: @@ -26113,8 +26158,8 @@ snapshots: react-docgen@8.0.2: dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/core': 7.29.6 + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -26159,6 +26204,8 @@ snapshots: oidc-client-ts: 3.4.1 react: 19.2.8 + react-property@2.0.2: {} + react-router-config@5.1.1(react-router@5.3.4(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.29.7 @@ -26732,8 +26779,6 @@ snapshots: semver@7.7.2: {} - semver@7.7.3: {} - semver@7.7.4: {} semver@7.8.0: {} @@ -27954,7 +27999,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@types/node': 22.19.15 '@vitest/browser-playwright': 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) - '@vitest/coverage-istanbul': 4.1.10(supports-color@8.1.1)(vitest@4.1.10) + '@vitest/coverage-istanbul': 4.1.10(vitest@4.1.10) happy-dom: 20.10.1 jsdom: 26.1.0 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 79e995b64..59bf8bc22 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -151,6 +151,9 @@ overrides: 'tedious>@azure/identity': 4.2.1 packageExtensions: + '@azure/functions@4.11.0': + dependencies: + undici-types: ^6.21.0 '@azure/functions-opentelemetry-instrumentation@0.1.0': dependencies: '@opentelemetry/api-logs': 0.57.2