-
- {!loading && distanceText}
+
+ {isMultiLocation && hasMultipleLocations && !loading && (
+
+ )}
+
{loading ? ' ' : title}
+ {isMultiLocation && hasMultipleLocations && !loading && (
+
+ )}
-
+
+ {isMultiLocation && !loading && (
+
+
+
+
+ {distanceText} • {currentLocation?.title}
+
+ {(() => {
+ const dishCollection = currentDishCollection?.find((dc: DishCollectionProps) => dc.language === language);
+ const lunchInfo = dishCollection?.lunchInfo;
+ return lunchInfo?.servingTimes ? (
+
+
+ {lunchInfo.servingTimes}
+
+ ) : null;
+ })()}
+
+
+ )}
+
+ {!isMultiLocation && (
+
+
+
+ {!loading && distanceText}
+
+ {!loading && (() => {
+ const dishCollection = currentDishCollection?.find((dc: DishCollectionProps) => dc.language === language);
+ const lunchInfo = dishCollection?.lunchInfo;
+ return lunchInfo?.servingTimes ? (
+
+
+ {lunchInfo.servingTimes}
+
+ ) : null;
+ })()}
+
+ )}
+
- {dishCollection && dishCollection.filter((a: DishCollectionProps) => a.dishes?.length).length
- ? dishCollection
- .find((dc: DishCollectionProps) => dc.language === language)
- ?.dishes.map((dish: DishProps, index: number) => (
-
- ))
- : !loading &&
Closed or ¯\_(ツ)_/¯
}
+ {currentDishCollection && currentDishCollection.filter((a: DishCollectionProps) => a.dishes?.length).length
+ ? (() => {
+ const dishCollection = currentDishCollection.find((dc: DishCollectionProps) => dc.language === language);
+ const dishes = dishCollection?.dishes || [];
+ const lunchInfo = dishCollection?.lunchInfo;
+ const visible = expanded ? dishes : dishes.slice(0, APP_CONFIG.VISIBLE_DISHES_COLLAPSED);
+ return (
+ <>
+ {lunchInfo && (
+
+ )}
+ {visible.map((dish: DishProps, index: number) => (
+
+ ))}
+ {dishes.length > 4 && (
+
+
+
+ )}
+ >
+ );
+ })()
+ : !loading && (() => {
+ // Check if we have closure info even without dishes
+ const dishCollection = currentDishCollection?.find((dc: DishCollectionProps) => dc.language === language);
+ const lunchInfo = dishCollection?.lunchInfo;
+
+ return lunchInfo?.closureInfo?.isClosed
+ ?
+ :
Closed or ¯\_(ツ)_/¯
;
+ })()}
-
+
Website
-
+
Directions
diff --git a/apps/client/src/components/RestaurantGrid.tsx b/apps/client/src/components/RestaurantGrid.tsx
index 927125f..f2633d8 100644
--- a/apps/client/src/components/RestaurantGrid.tsx
+++ b/apps/client/src/components/RestaurantGrid.tsx
@@ -1,6 +1,7 @@
import { css } from '@emotion/react';
import Restaurant from '@/components/Restaurant';
+import ComponentErrorBoundary from '@/components/ComponentErrorBoundary';
import { screenSize } from '@/utils/theme';
import { RestaurantGridProps, RestaurantProps } from '@devolunch/shared';
@@ -32,17 +33,18 @@ export default function RestaurantGrid({ restaurants }: RestaurantGridProps) {
return (
{restaurants?.map((restaurant: RestaurantProps, index: number) => (
-
+
+
+
))}
);
diff --git a/apps/client/src/components/ScrollToSection.tsx b/apps/client/src/components/ScrollToSection.tsx
new file mode 100644
index 0000000..91a0210
--- /dev/null
+++ b/apps/client/src/components/ScrollToSection.tsx
@@ -0,0 +1,58 @@
+import { css } from '@emotion/react';
+
+const chevronWrap = css`
+ position: relative;
+ display: flex;
+ justify-content: center;
+ margin-top: -8rem;
+ margin-bottom: 5rem;
+
+ @media (max-width: 768px) {
+ margin-top: -6rem;
+ margin-bottom: 4rem;
+ }
+`;
+
+const chevronLink = css`
+ display: inline-flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.35rem;
+ color: #333;
+ text-decoration: none;
+ opacity: 0.85;
+ transition: opacity 120ms ease;
+ &:hover {
+ opacity: 1;
+ }
+`;
+
+const chevron = css`
+ width: 0.9rem;
+ height: 0.9rem;
+ border-right: 2px solid currentColor;
+ border-bottom: 2px solid currentColor;
+ transform: rotate(45deg);
+ margin-top: -0.15rem;
+`;
+
+interface ScrollToSectionProps {
+ targetSection: string;
+ label: string;
+ ariaLabel: string;
+}
+
+export default function ScrollToSection({
+ targetSection,
+ label,
+ ariaLabel
+}: ScrollToSectionProps) {
+ return (
+
+ );
+}
diff --git a/apps/client/src/components/Search.tsx b/apps/client/src/components/Search.tsx
new file mode 100644
index 0000000..9c905d0
--- /dev/null
+++ b/apps/client/src/components/Search.tsx
@@ -0,0 +1,58 @@
+import { css } from '@emotion/react';
+import { useEffect, useMemo, useState } from 'react';
+
+const containerStyles = css`
+ display: flex;
+ align-items: center;
+ width: 100%;
+ max-width: 28rem;
+`;
+
+const inputStyles = css`
+ width: 100%;
+ height: 2.5rem;
+ border: 1px solid #ccc;
+ border-radius: 6px;
+ padding: 0 0.75rem;
+ font-size: 0.95rem;
+`;
+
+interface SearchProps {
+ value?: string;
+ placeholder?: string;
+ onChange: (value: string) => void;
+ debounceMs?: number;
+}
+
+export default function Search({ value = '', placeholder = 'What do you want to eat?', onChange, debounceMs = 300 }: SearchProps) {
+ const [local, setLocal] = useState
(value);
+
+ useEffect(() => setLocal(value), [value]);
+
+ const debounced = useMemo(() => {
+ const handle = { id: 0 as unknown as number };
+ return (next: string) => {
+ clearTimeout(handle.id);
+ // @ts-expect-error Node vs browser typings
+ handle.id = setTimeout(() => onChange(next), debounceMs);
+ };
+ }, [onChange, debounceMs]);
+
+ return (
+
+ {
+ const v = e.target.value;
+ setLocal(v);
+ debounced(v);
+ }}
+ />
+
+ );
+}
+
diff --git a/apps/client/src/components/SearchInput.tsx b/apps/client/src/components/SearchInput.tsx
new file mode 100644
index 0000000..5318868
--- /dev/null
+++ b/apps/client/src/components/SearchInput.tsx
@@ -0,0 +1,183 @@
+import React, { useCallback } from 'react';
+import { css } from '@emotion/react';
+import { color } from '@/utils/theme';
+
+const inputWrap = css`
+ position: relative;
+ width: 100%;
+ margin-bottom: 5rem; /* Space for chevron */
+
+ @media (max-width: 768px) {
+ margin-bottom: 4rem;
+ }
+`;
+
+const input = css`
+ width: 100%;
+ height: 3.25rem;
+ border: 1px solid #ccc;
+ border-radius: 12px;
+ padding: 0 3.5rem 0 1rem; /* space for send button inside */
+ font-size: 1.1rem;
+ outline: none;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+ box-sizing: border-box;
+
+ &:focus {
+ border-color: #888;
+ box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.06);
+ }
+
+ &:disabled {
+ background-color: #f5f5f5;
+ cursor: not-allowed;
+ }
+
+ @media (max-width: 768px) {
+ height: 3rem;
+ font-size: 1rem;
+ padding: 0 3rem 0 0.875rem;
+ }
+`;
+
+const sendButton = css`
+ position: absolute;
+ right: 1rem;
+ top: 50%;
+ transform: translateY(-50%);
+ height: 2rem;
+ width: 2rem;
+ border-radius: 999px;
+ border: 1px solid ${color.blue};
+ cursor: pointer;
+ background: transparent;
+ color: ${color.blue};
+ display: inline-grid;
+ place-items: center;
+ padding: 0;
+ line-height: 0;
+ box-sizing: border-box;
+ vertical-align: middle;
+ transition: all 120ms ease;
+
+ &:hover:not(:disabled) {
+ background: ${color.blue};
+ color: ${color.white};
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+
+ @media (max-width: 768px) {
+ right: 0.5rem;
+ height: 1.75rem;
+ width: 1.75rem;
+ }
+`;
+
+const sendIcon = css`
+ position: relative;
+ width: 0.7rem;
+ height: 0.7rem;
+ border-right: 2px solid currentColor;
+ border-bottom: 2px solid currentColor;
+ transform: rotate(-45deg);
+ display: block;
+
+ @media (max-width: 768px) {
+ width: 0.6rem;
+ height: 0.6rem;
+ }
+`;
+
+const loadingSpinner = css`
+ width: 0.75rem;
+ height: 0.75rem;
+ border: 2px solid currentColor;
+ border-top: 2px solid transparent;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+
+ @keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+ }
+
+ @media (max-width: 768px) {
+ width: 0.65rem;
+ height: 0.65rem;
+ }
+`;
+
+const errorMessage = css`
+ color: #d9534f;
+ font-size: 0.875rem;
+ margin: 0.5rem 0 0;
+ text-align: center;
+`;
+
+interface SearchInputProps {
+ query: string;
+ isSearching: boolean;
+ error: string | null;
+ placeholder?: string;
+ onQueryChange: (query: string) => void;
+ onSubmit: () => void;
+}
+
+export default function SearchInput({
+ query,
+ isSearching,
+ error,
+ placeholder = 'Skriv vad du är sugen på här...',
+ onQueryChange,
+ onSubmit
+}: SearchInputProps) {
+ const onChange = useCallback((e: React.ChangeEvent) => {
+ onQueryChange(e.target.value);
+ }, [onQueryChange]);
+
+ const onKeyDown = useCallback((e: React.KeyboardEvent) => {
+ if (e.key === 'Enter') {
+ onSubmit();
+ }
+ }, [onSubmit]);
+
+ return (
+ <>
+
+
+
+
+ {error && (
+
+ {error}
+
+ )}
+ >
+ );
+}
\ No newline at end of file
diff --git a/apps/client/src/components/Sort.tsx b/apps/client/src/components/Sort.tsx
index 37a772a..b45fe79 100644
--- a/apps/client/src/components/Sort.tsx
+++ b/apps/client/src/components/Sort.tsx
@@ -1,38 +1,18 @@
-import React from 'react';
-import { css, keyframes } from '@emotion/react';
+import { css } from '@emotion/react';
-import { ReactComponent as SortIcon } from '@/assets/sort.svg';
-import { useRestaurants } from '@/contexts/restaurants';
+import SortIcon from '@/assets/sort.svg?react';
+import { useRestaurants } from '@/hooks/useRestaurants';
import { color } from '@/utils/theme';
import { sortRestaurants } from '@/utils/sort-restaurants';
import Button from './Button';
-const activeKeyFrame = keyframes`
- 0% {
- transform: scale(0.95);
- box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);
- }
-
- 70% {
- transform: scale(1);
- box-shadow: 0 0 0 10px rgba(0, 0, 0, 0);
- }
-
- 100% {
- transform: scale(0.95);
- box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
- }
-`;
-
-const sortStyles = css`
- margin-right: 1rem;
-`;
+const sortStyles = css``;
const sortButtonStyles = css`
- &[data-active='1'] {
+ &[aria-pressed='true'] {
background-color: ${color.orange};
- animation: ${activeKeyFrame} 1s infinite;
+ color: ${color.white};
}
`;
@@ -43,36 +23,51 @@ const sortIconStyles = css`
`;
export default function Sort() {
- const { restaurants, setRestaurants } = useRestaurants();
- const [active, setActive] = React.useState(0);
+ const { restaurants, setRestaurants, setUserPosition, userPosition } = useRestaurants();
+
+ const processLocation = (position: { coords: { latitude: number; longitude: number } }) => {
+ const userCoord = { lat: position.coords.latitude, lon: position.coords.longitude };
+ setUserPosition(userCoord);
+ const sortedRestaurants = sortRestaurants(restaurants, userCoord);
+ setRestaurants(sortedRestaurants);
+ };
const sortOnLocation = () => {
- setActive(1);
+ // Toggle off -> back to office
+ if (userPosition) {
+ setUserPosition(null);
+ const sortedRestaurants = sortRestaurants(restaurants);
+ setRestaurants(sortedRestaurants);
+ return;
+ }
- navigator.geolocation.getCurrentPosition(
- (position) => {
- const latitude = position.coords.latitude;
- const longitude = position.coords.longitude;
+ if (!navigator.geolocation) {
+ const sortedRestaurants = sortRestaurants(restaurants);
+ setRestaurants(sortedRestaurants);
+ return;
+ }
- setRestaurants(
- sortRestaurants(restaurants, {
- lat: latitude,
- lon: longitude,
- }),
- );
- setActive(0);
+ navigator.geolocation.getCurrentPosition(
+ (pos) => {
+ processLocation(pos);
},
() => {
- setActive(0);
+ const sortedRestaurants = sortRestaurants(restaurants);
+ setRestaurants(sortedRestaurants);
+ },
+ {
+ enableHighAccuracy: false,
+ timeout: 8000,
+ maximumAge: 60000,
},
);
};
return (
-
);
diff --git a/apps/client/src/components/SuggestionList.tsx b/apps/client/src/components/SuggestionList.tsx
new file mode 100644
index 0000000..e5a362e
--- /dev/null
+++ b/apps/client/src/components/SuggestionList.tsx
@@ -0,0 +1,273 @@
+import { css } from '@emotion/react';
+import { color } from '@/utils/theme';
+import { formatDistance } from '@/utils/common';
+import type { PromptSuggestion } from '@/types/ai';
+import type { RestaurantProps } from '@devolunch/shared';
+
+const suggestionsBubble = css`
+ margin-bottom: 1rem;
+ padding: 1rem;
+ border-radius: 12px;
+ max-width: 100%;
+ margin-left: 0;
+ background: rgba(245, 245, 245, 0.7);
+ color: #333;
+ border-bottom-left-radius: 4px;
+ word-wrap: break-word;
+`;
+
+const suggestionList = css`
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 1rem;
+
+ @media (max-width: 768px) {
+ flex-direction: column;
+ gap: 0.75rem;
+ }
+`;
+
+const suggestionCard = css`
+ display: flex;
+ flex-direction: column;
+ background: #fff;
+ border-radius: 16px;
+ border: 1px solid #e0e0e0;
+ padding: 1rem;
+ text-align: left;
+ flex: 1;
+ min-width: 280px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
+
+ &:hover {
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
+ transform: translateY(-1px);
+ }
+
+ @media (max-width: 768px) {
+ min-width: auto;
+ flex-direction: row;
+ align-items: stretch;
+ gap: 0.75rem;
+
+ @media (max-width: 520px) {
+ flex-direction: column;
+ }
+ }
+`;
+
+const suggestionImage = css`
+ width: 100%;
+ height: 180px;
+ border-radius: 12px;
+ object-fit: cover;
+ margin-bottom: 1rem;
+
+ @media (max-width: 768px) {
+ width: 64px;
+ height: 64px;
+ margin-bottom: 0;
+ flex-shrink: 0;
+
+ @media (max-width: 520px) {
+ width: 100%;
+ height: 160px;
+ margin-bottom: 1rem;
+ }
+ }
+`;
+
+const suggestionImageFallback = css`
+ width: 100%;
+ height: 180px;
+ border-radius: 12px;
+ background: #f0f0f0;
+ color: #666;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 600;
+ margin-bottom: 1rem;
+ font-size: 2rem;
+
+ @media (max-width: 768px) {
+ width: 64px;
+ height: 64px;
+ margin-bottom: 0;
+ flex-shrink: 0;
+ font-size: 1.5rem;
+
+ @media (max-width: 520px) {
+ width: 100%;
+ height: 160px;
+ margin-bottom: 1rem;
+ font-size: 2rem;
+ }
+ }
+`;
+
+const suggestionBody = css`
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 0.4rem;
+`;
+
+const suggestionTitle = css`
+ margin: 0;
+ font-size: 1rem;
+ font-weight: 600;
+ color: #1f1f1f;
+`;
+
+const suggestionMeta = css`
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ font-size: 0.85rem;
+ color: #666;
+`;
+
+const suggestionHighlight = css`
+ margin: 0;
+ font-size: 0.9rem;
+ color: #333;
+`;
+
+const suggestionLinkRow = css`
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ margin-top: 0.25rem;
+`;
+
+const suggestionLink = css`
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0.4rem 0.75rem;
+ border-radius: 8px;
+ border: 1px solid ${color.blue};
+ color: ${color.blue};
+ text-decoration: none;
+ font-size: 0.85rem;
+ transition: background 120ms ease, color 120ms ease;
+
+ &:hover {
+ background: ${color.blue};
+ color: ${color.white};
+ }
+`;
+
+interface SuggestionListProps {
+ suggestions: PromptSuggestion[];
+ messageId: string;
+ restaurants: RestaurantProps[];
+ language: string;
+ onMenuModalOpen: (restaurant: RestaurantProps) => void;
+}
+
+export default function SuggestionList({
+ suggestions,
+ messageId,
+ restaurants,
+ language,
+ onMenuModalOpen
+}: SuggestionListProps) {
+ return (
+
+
+ {suggestions.map((suggestion, index) => {
+ const metaItems: string[] = [];
+ if (suggestion.location) metaItems.push(suggestion.location);
+ if (typeof suggestion.distanceKm === 'number') {
+ metaItems.push(formatDistance(suggestion.distanceKm));
+ }
+ const fallbackInitial = suggestion.title ? suggestion.title.charAt(0).toUpperCase() : '?';
+
+ return (
+
+ {suggestion.imageUrl ? (
+

+ ) : (
+
+ {fallbackInitial}
+
+ )}
+
+
{suggestion.title}
+ {metaItems.length > 0 && (
+
+ {metaItems.map((item) => (
+ {item}
+ ))}
+
+ )}
+ {suggestion.highlight && (
+
+ {suggestion.highlight}
+
+ )}
+
+ {(() => {
+ const restaurant = restaurants.find(r => r.title === suggestion.title);
+ const hasFullMenu = restaurant?.dishCollection?.some(dc => dc.dishes.length > 0);
+
+ return (
+ <>
+ {hasFullMenu && (
+
{
+ if (restaurant) {
+ onMenuModalOpen(restaurant);
+ }
+ }}
+ >
+ {language === 'sv' ? 'Visa hela menyn' : 'View full menu'}
+
+ )}
+ {suggestion.url && (
+
+ {language === 'sv' ? 'Webbplats' : 'Website'}
+
+ )}
+ {suggestion.googleMapsUrl && (
+
+ {language === 'sv' ? 'Hitta hit' : 'Get directions'}
+
+ )}
+ >
+ );
+ })()}
+
+
+
+ );
+ })}
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/client/src/contexts/RestaurantsContext.ts b/apps/client/src/contexts/RestaurantsContext.ts
new file mode 100644
index 0000000..32a2dcb
--- /dev/null
+++ b/apps/client/src/contexts/RestaurantsContext.ts
@@ -0,0 +1,16 @@
+import React from 'react';
+import { RestaurantProps, Coordinate } from '@devolunch/shared';
+
+export type RestaurantsContextType = {
+ loading: boolean;
+ scrapeDate: Date | null;
+ realPosition: boolean;
+ language: string;
+ setLanguage: (language: string) => void;
+ restaurants: RestaurantProps[];
+ setRestaurants: (restaurants: RestaurantProps[]) => void;
+ userPosition: Coordinate | null;
+ setUserPosition: (position: Coordinate | null) => void;
+};
+
+export const RestaurantsContext = React.createContext(null);
\ No newline at end of file
diff --git a/apps/client/src/contexts/restaurants.tsx b/apps/client/src/contexts/restaurants.tsx
index cf259ac..324fd2b 100644
--- a/apps/client/src/contexts/restaurants.tsx
+++ b/apps/client/src/contexts/restaurants.tsx
@@ -1,79 +1,44 @@
-import React, { useContext, useEffect, useState } from 'react';
+import React, { useEffect, useState } from 'react';
-import { RestaurantProps, Scrape } from '@devolunch/shared';
+import { RestaurantProps, Coordinate } from '@devolunch/shared';
+import { RestaurantsContext } from './RestaurantsContext';
import { sortRestaurants } from '@/utils/sort-restaurants';
-
-type ContextType = {
- loading: boolean;
- scrapeDate: Date | null;
- realPosition: boolean;
- language: string;
- setLanguage: (language: string) => void;
- restaurants: RestaurantProps[];
- setRestaurants: (restaurants: RestaurantProps[]) => void;
-};
-
-enum Endpoints {
- RESTAURANTS = '/restaurants',
-}
-
-const API_ROOT_PROD = '/api/v1';
-const API_ROOT_DEV = 'http://localhost:8080/api/v1';
-
-const RestaurantsContext = React.createContext(null);
-
-const isDev = import.meta.env.DEV;
-
-export const useRestaurants = () => {
- const context = useContext(RestaurantsContext);
- if (!context) {
- throw new Error('context not defined');
- }
- return context;
-};
-
-const rootUrl = isDev ? API_ROOT_DEV : API_ROOT_PROD;
-
-const fetchRestaurants = async () => {
- try {
- const res = await fetch(`${rootUrl}${Endpoints.RESTAURANTS}`);
- const data = await res.json();
- return data as Scrape;
- } catch (err) {
- return null;
- }
-};
+import { fetchRestaurants } from '@/utils/api';
+import { APP_CONFIG } from '@/utils/constants';
+import { getUrlParam } from '@/utils/common';
const RestaurantsProvider = ({ children }: { children: React.ReactNode }) => {
- const [language, setLanguage] = useState('sv');
+ const [language, setLanguage] = useState(APP_CONFIG.DEFAULT_LANGUAGE);
const [restaurants, setRestaurants] = useState([]);
const [scrapeDate, setScrapeDate] = useState(null);
const [loading, setLoading] = useState(true);
const [realPosition] = useState(false);
+ const [userPosition, setUserPosition] = useState(null);
useEffect(() => {
const get = async () => {
- const language = new URLSearchParams(window.location.search).get('lang');
+ const urlLanguage = getUrlParam('lang');
setLoading(true);
- if (language) {
- setLanguage(language);
+ if (urlLanguage) {
+ setLanguage(urlLanguage);
}
- const r = await fetchRestaurants();
+ const data = await fetchRestaurants();
- if (r) {
- setRestaurants(sortRestaurants(r.restaurants));
- setScrapeDate(new Date(r.date));
+ if (data) {
+ setRestaurants(sortRestaurants(data.restaurants));
+ setScrapeDate(new Date(data.date));
}
setLoading(false);
};
get();
- setInterval(async () => {
- await get();
- }, 3600000);
+ const intervalId = setInterval(get, APP_CONFIG.REFRESH_INTERVAL_MS);
+
+ // Cleanup interval on unmount
+ return () => clearInterval(intervalId);
}, []);
return (
@@ -86,6 +51,8 @@ const RestaurantsProvider = ({ children }: { children: React.ReactNode }) => {
restaurants,
setRestaurants,
loading,
+ userPosition,
+ setUserPosition,
}}
>
{children}
diff --git a/apps/client/src/hooks/progressive-image.tsx b/apps/client/src/hooks/progressive-image.tsx
index bf30be1..87ce5ae 100644
--- a/apps/client/src/hooks/progressive-image.tsx
+++ b/apps/client/src/hooks/progressive-image.tsx
@@ -20,6 +20,6 @@ export const useProgressiveImg = (
return {
src: src,
- blur: src === (lowQualitySrc ? lowQualitySrc : highQualitySrc),
+ blur: Boolean(lowQualitySrc && src === lowQualitySrc),
};
};
diff --git a/apps/client/src/hooks/useRestaurants.ts b/apps/client/src/hooks/useRestaurants.ts
new file mode 100644
index 0000000..a918027
--- /dev/null
+++ b/apps/client/src/hooks/useRestaurants.ts
@@ -0,0 +1,10 @@
+import { useContext } from 'react';
+import { RestaurantsContext } from '@/contexts/RestaurantsContext';
+
+export const useRestaurants = () => {
+ const context = useContext(RestaurantsContext);
+ if (!context) {
+ throw new Error('useRestaurants must be used within a RestaurantsProvider');
+ }
+ return context;
+};
\ No newline at end of file
diff --git a/apps/client/src/index.tsx b/apps/client/src/index.tsx
index 06cfd06..bcdd3ef 100644
--- a/apps/client/src/index.tsx
+++ b/apps/client/src/index.tsx
@@ -2,13 +2,15 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
-
+import ErrorBoundary from './components/ErrorBoundary';
import RestaurantsProvider from './contexts/restaurants';
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
-
-
-
+
+
+
+
+
,
);
diff --git a/apps/client/src/test/ErrorBoundary.test.tsx b/apps/client/src/test/ErrorBoundary.test.tsx
new file mode 100644
index 0000000..85ef9a9
--- /dev/null
+++ b/apps/client/src/test/ErrorBoundary.test.tsx
@@ -0,0 +1,91 @@
+import { render, screen } from '@testing-library/react';
+import { describe, it, expect, vi, afterEach } from 'vitest';
+import ErrorBoundary from '../components/ErrorBoundary';
+import ComponentErrorBoundary from '../components/ComponentErrorBoundary';
+
+// Component that throws an error for testing
+const ThrowError = ({ shouldThrow }: { shouldThrow: boolean }) => {
+ if (shouldThrow) {
+ throw new Error('Test error');
+ }
+ return No error
;
+};
+
+// Mock console.error to avoid noise in test output
+const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
+
+describe('ErrorBoundary', () => {
+ afterEach(() => {
+ consoleSpy.mockClear();
+ });
+
+ it('should render children when there is no error', () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText('No error')).toBeInTheDocument();
+ });
+
+ it('should render error UI when child component throws', () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText('Something went wrong')).toBeInTheDocument();
+ expect(screen.getByText(/We encountered an unexpected error/)).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: 'Reload Page' })).toBeInTheDocument();
+ });
+
+ it('should render custom fallback when provided', () => {
+ const customFallback = Custom error message
;
+
+ render(
+
+
+
+ );
+
+ expect(screen.getByText('Custom error message')).toBeInTheDocument();
+ });
+});
+
+describe('ComponentErrorBoundary', () => {
+ afterEach(() => {
+ consoleSpy.mockClear();
+ });
+
+ it('should render children when there is no error', () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText('No error')).toBeInTheDocument();
+ });
+
+ it('should render component error UI when child component throws', () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText(/Unable to load Test Component/)).toBeInTheDocument();
+ });
+
+ it('should use default component name when not provided', () => {
+ render(
+
+
+
+ );
+
+ expect(screen.getByText(/Unable to load component/)).toBeInTheDocument();
+ });
+});
\ No newline at end of file
diff --git a/apps/client/src/test/setup.ts b/apps/client/src/test/setup.ts
new file mode 100644
index 0000000..d8935b0
--- /dev/null
+++ b/apps/client/src/test/setup.ts
@@ -0,0 +1,7 @@
+import '@testing-library/jest-dom';
+import { cleanup } from '@testing-library/react';
+import { afterEach } from 'vitest';
+
+afterEach(() => {
+ cleanup();
+});
\ No newline at end of file
diff --git a/apps/client/src/types/ai.ts b/apps/client/src/types/ai.ts
new file mode 100644
index 0000000..72ced84
--- /dev/null
+++ b/apps/client/src/types/ai.ts
@@ -0,0 +1,16 @@
+export type PromptSuggestion = {
+ title: string;
+ highlight?: string;
+ reason?: string;
+ url?: string;
+ googleMapsUrl?: string;
+ imageUrl?: string;
+ location?: string;
+ distanceKm?: number;
+};
+
+export type PromptAiResult = {
+ id: number;
+ response: string;
+ suggestions: PromptSuggestion[];
+};
diff --git a/apps/client/src/utils/api.ts b/apps/client/src/utils/api.ts
new file mode 100644
index 0000000..b19e176
--- /dev/null
+++ b/apps/client/src/utils/api.ts
@@ -0,0 +1,149 @@
+import { Scrape } from '@devolunch/shared';
+import { API_CONFIG, ENVIRONMENT } from './constants';
+import { retry } from './common';
+import { logger } from '@devolunch/shared/logger/browser';
+
+// =============================================================================
+// API CONFIGURATION
+// =============================================================================
+
+const getApiUrl = (endpoint: string): string => {
+ return `${ENVIRONMENT.apiRoot}${endpoint}`;
+};
+
+// =============================================================================
+// REQUEST DEDUPLICATION
+// =============================================================================
+
+// Cache for preventing duplicate API calls
+const requestCache = new Map>();
+
+const createCachedRequest = (key: string, requestFn: () => Promise): Promise => {
+ const cached = requestCache.get(key);
+ if (cached) {
+ return cached as Promise;
+ }
+
+ const request = requestFn().finally(() => {
+ // Clean up cache after request completes
+ requestCache.delete(key);
+ });
+
+ requestCache.set(key, request);
+ return request;
+};
+
+// =============================================================================
+// API FUNCTIONS
+// =============================================================================
+
+/**
+ * Fetches restaurant data with retry logic and caching
+ */
+export const fetchRestaurants = async (): Promise => {
+ const cacheKey = 'restaurants';
+
+ return createCachedRequest(cacheKey, async () => {
+ try {
+ const response = await retry(async () => {
+ const res = await fetch(getApiUrl(API_CONFIG.ENDPOINTS.RESTAURANTS));
+ if (!res.ok) {
+ throw new Error(`HTTP ${res.status}: ${res.statusText}`);
+ }
+ return res;
+ });
+
+ const data = await response.json();
+ return data as Scrape;
+ } catch (error) {
+ logger.error({ err: error }, 'Failed to fetch restaurants');
+ return null;
+ }
+ });
+};
+
+/**
+ * Generic API fetch utility with error handling
+ */
+export const apiRequest = async (
+ endpoint: string,
+ options: {
+ headers?: Record;
+ method?: string;
+ body?: string;
+ } = {}
+): Promise => {
+ try {
+ const response = await fetch(getApiUrl(endpoint), {
+ headers: {
+ 'Content-Type': 'application/json',
+ ...(options.headers || {}),
+ },
+ ...(options.method && { method: options.method }),
+ ...(options.body && { body: options.body }),
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+ }
+
+ return await response.json();
+ } catch (error) {
+ logger.error({ err: error, endpoint }, 'API request failed');
+ return null;
+ }
+};
+
+// What: AI search API call
+// Why: Client calls the server's REST bridge to the MCP search
+export type AiSearchResult = {
+ query: string;
+ results: { restaurant: { title: string; url: string; googleMapsUrl: string }; reason?: string; dishes: unknown[] }[];
+};
+
+export const fetchAiSearch = async (
+ query: string,
+ language: string,
+ options?: { expand?: boolean },
+): Promise => {
+ const params = new URLSearchParams({ query, language, expand: options?.expand === false ? 'false' : 'true' });
+ return apiRequest(`${API_CONFIG.ENDPOINTS.AI_SEARCH}?${params.toString()}`);
+};
+
+export type AiSuggestionResult = {
+ query: string;
+ results: { restaurant: string; dish?: string; reason?: string }[];
+};
+
+export const fetchAiSuggestions = async (
+ query: string,
+ language: string,
+ options?: { topK?: number; useLLM?: boolean }
+): Promise => {
+ const params = new URLSearchParams({
+ query,
+ language,
+ topK: String(options?.topK ?? 5),
+ useLLM: String(options?.useLLM ?? true)
+ });
+ return apiRequest(`/ai/suggest?${params.toString()}`);
+};
+
+// =============================================================================
+// API STATUS UTILITIES
+// =============================================================================
+
+/**
+ * Checks if the API is available
+ */
+export const checkApiHealth = async (): Promise => {
+ try {
+ const response = await fetch(ENVIRONMENT.apiRoot, {
+ method: 'HEAD',
+ cache: 'no-cache'
+ });
+ return response.ok;
+ } catch {
+ return false;
+ }
+};
diff --git a/apps/client/src/utils/common.ts b/apps/client/src/utils/common.ts
new file mode 100644
index 0000000..e99568c
--- /dev/null
+++ b/apps/client/src/utils/common.ts
@@ -0,0 +1,92 @@
+// =============================================================================
+// COMMON UTILITY FUNCTIONS
+// =============================================================================
+
+/**
+ * Safely gets URL search parameter
+ */
+export const getUrlParam = (param: string): string | null => {
+ try {
+ return new URLSearchParams(window.location.search).get(param);
+ } catch {
+ return null;
+ }
+};
+
+/**
+ * Sets URL parameter without page reload
+ */
+export const setUrlParam = (param: string, value: string): void => {
+ try {
+ const url = new URL(window.location.toString());
+ url.searchParams.set(param, value);
+ window.history.replaceState({}, '', url.toString());
+ } catch {
+ // Silently fail if URL manipulation fails
+ }
+};
+
+/**
+ * Formats distance with appropriate units
+ */
+export const formatDistance = (distance: number): string => {
+ if (distance < 1) {
+ return `${Math.round(distance * 1000)}m`;
+ }
+ return `${distance.toFixed(1)}km`;
+};
+
+/**
+ * Truncates text to a maximum length with ellipsis
+ */
+export const truncateText = (text: string, maxLength: number): string => {
+ if (text.length <= maxLength) return text;
+ return text.slice(0, maxLength - 3) + '...';
+};
+
+/**
+ * Debounce function to limit function calls
+ */
+export const debounce = unknown>(
+ func: T,
+ wait: number
+): ((...args: Parameters) => void) => {
+ let timeout: ReturnType;
+ return (...args: Parameters) => {
+ clearTimeout(timeout);
+ timeout = setTimeout(() => func(...args), wait);
+ };
+};
+
+/**
+ * Simple retry mechanism for async functions
+ */
+export const retry = async (
+ fn: () => Promise,
+ retries: number = 3,
+ delay: number = 1000
+): Promise => {
+ try {
+ return await fn();
+ } catch (error) {
+ if (retries > 0) {
+ await new Promise(resolve => setTimeout(resolve, delay));
+ return retry(fn, retries - 1, delay);
+ }
+ throw error;
+ }
+};
+
+/**
+ * Check if value is defined and not null
+ */
+export const isDefined = (value: T | null | undefined): value is T => {
+ return value !== null && value !== undefined;
+};
+
+/**
+ * Safe array access that returns undefined instead of throwing
+ */
+export const safeArrayAccess = (array: T[], index: number): T | undefined => {
+ return array && array.length > index && index >= 0 ? array[index] : undefined;
+};
\ No newline at end of file
diff --git a/apps/client/src/utils/constants.ts b/apps/client/src/utils/constants.ts
new file mode 100644
index 0000000..fda3e96
--- /dev/null
+++ b/apps/client/src/utils/constants.ts
@@ -0,0 +1,55 @@
+import { Coordinate } from '@devolunch/shared';
+
+// =============================================================================
+// LOCATION CONSTANTS
+// =============================================================================
+
+// Devoteam office location in Malmö - used as fallback when user location is unavailable
+export const DEVOTEAM_LOCATION: Coordinate = {
+ lat: 55.6107258,
+ lon: 12.999409,
+};
+
+// =============================================================================
+// API CONFIGURATION
+// =============================================================================
+
+export const API_CONFIG = {
+ PROD_ROOT: '/api/v1',
+ DEV_ROOT: 'http://localhost:8080/api/v1',
+ ENDPOINTS: {
+ RESTAURANTS: '/restaurants',
+ AI_SEARCH: '/ai/search',
+ },
+} as const;
+
+// =============================================================================
+// APPLICATION CONSTANTS
+// =============================================================================
+
+export const APP_CONFIG = {
+ DEFAULT_LANGUAGE: 'sv',
+ REFRESH_INTERVAL_MS: 3600000, // 1 hour
+ VISIBLE_DISHES_COLLAPSED: 4,
+} as const;
+
+// =============================================================================
+// UI CONSTANTS
+// =============================================================================
+
+export const UI_CONSTANTS = {
+ LOADING_SKELETON_COUNT: 8,
+ MAX_RESTAURANT_TITLE_LENGTH: 50,
+} as const;
+
+// =============================================================================
+// ENVIRONMENT HELPERS
+// =============================================================================
+
+export const ENVIRONMENT = {
+ isDev: import.meta.env.DEV,
+ isProd: import.meta.env.PROD,
+ get apiRoot() {
+ return this.isDev ? API_CONFIG.DEV_ROOT : API_CONFIG.PROD_ROOT;
+ },
+} as const;
diff --git a/apps/client/src/utils/filter-restaurants.ts b/apps/client/src/utils/filter-restaurants.ts
new file mode 100644
index 0000000..2ddf951
--- /dev/null
+++ b/apps/client/src/utils/filter-restaurants.ts
@@ -0,0 +1,26 @@
+import { RestaurantProps } from '@devolunch/shared';
+
+const norm = (s: string) => s.toLowerCase().normalize('NFKD');
+
+export function filterRestaurants(restaurants: RestaurantProps[], query: string, language?: string): RestaurantProps[] {
+ const q = norm(query.trim());
+ if (!q) return restaurants;
+
+ return restaurants.filter((r) => {
+ // Search in dish collections, preferring selected language when present
+ const collections = r.dishCollection || [];
+ const relevant = language ? collections.filter((c) => c.language === language) : collections;
+ const scan = relevant.length ? relevant : collections;
+
+ for (const col of scan) {
+ for (const dish of col.dishes) {
+ if (norm(dish.title).includes(q)) return true;
+ if (dish.description && norm(dish.description).includes(q)) return true;
+ }
+ }
+
+ // Fallback: also search restaurant title
+ return norm(r.title).includes(q);
+ });
+}
+
diff --git a/apps/client/src/utils/index.ts b/apps/client/src/utils/index.ts
new file mode 100644
index 0000000..60f507b
--- /dev/null
+++ b/apps/client/src/utils/index.ts
@@ -0,0 +1,17 @@
+// =============================================================================
+// CENTRALIZED UTILITY EXPORTS
+// =============================================================================
+
+// Re-export all constants for easy access
+export * from './constants';
+
+// Re-export all common utilities
+export * from './common';
+
+// Re-export API utilities
+export * from './api';
+
+// Re-export specialized utilities
+export * from './distance';
+export * from './sort-restaurants';
+export * from './theme';
\ No newline at end of file
diff --git a/apps/client/src/utils/mcp.ts b/apps/client/src/utils/mcp.ts
new file mode 100644
index 0000000..99fa6bd
--- /dev/null
+++ b/apps/client/src/utils/mcp.ts
@@ -0,0 +1,115 @@
+// What: Browser MCP client over WebSocket with lazy singleton connect
+// Why: Call MCP tools directly from the client; REST remains as fallback
+
+import { Client } from '@modelcontextprotocol/sdk/client/index.js';
+import { WebSocketClientTransport } from '@modelcontextprotocol/sdk/client/websocket.js';
+import { ENVIRONMENT } from './constants';
+import type { AiSearchResult } from './api';
+
+let clientPromise: Promise | null = null;
+type McpStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
+let status: McpStatus = 'disconnected';
+const listeners = new Set<(s: McpStatus) => void>();
+function setStatus(s: McpStatus) {
+ status = s;
+ listeners.forEach((cb) => cb(s));
+}
+
+let backoffMs = 500; // start at 0.5s
+const MAX_BACKOFF = 15000; // 15s
+
+function wsUrl(): string {
+ if (ENVIRONMENT.isDev) {
+ return 'ws://localhost:8080/mcp';
+ }
+ const loc = window.location;
+ const proto = loc.protocol === 'https:' ? 'wss:' : 'ws:';
+ return `${proto}//${loc.host}/mcp`;
+}
+
+async function getClient(): Promise {
+ if (clientPromise) return clientPromise;
+ clientPromise = (async () => {
+ setStatus('connecting');
+ try {
+ const client = new Client({ name: 'devolunch-web', version: '0.1.0' }, { capabilities: {} });
+ const transport = new WebSocketClientTransport(new URL(wsUrl()));
+ await client.connect(transport);
+ await client.listTools();
+ backoffMs = 500; // reset on success
+ setStatus('connected');
+ client.onclose = () => {
+ clientPromise = null;
+ setStatus('disconnected');
+ scheduleReconnect();
+ };
+ client.onerror = () => {
+ setStatus('error');
+ };
+ return client;
+ } catch (e) {
+ clientPromise = null;
+ setStatus('error');
+ scheduleReconnect();
+ throw e;
+ }
+ })();
+ return clientPromise;
+}
+
+export async function mcpSearch(query: string, language: string, expand = true): Promise {
+ const client = await getClient();
+ const result = await client.callTool({ name: 'search_dishes', arguments: { query, language, expand } });
+ const first = (result as { content?: Array<{ type: string; text: string }> }).content?.[0];
+ if (!first || first.type !== 'text') throw new Error('invalid_tool_result');
+ return JSON.parse(first.text);
+}
+
+export type AiSuggestionResult = {
+ query: string;
+ results: { restaurant: string; dish?: string; reason?: string }[];
+};
+
+export async function mcpSuggestMeal(
+ query: string,
+ language: string,
+ topK = 5,
+ useLLM = true
+): Promise {
+ const client = await getClient();
+ const result = await client.callTool({
+ name: 'suggest_meal',
+ arguments: { query, language, topK, useLLM }
+ });
+ const first = (result as { content?: Array<{ type: string; text: string }> }).content?.[0];
+ if (!first || first.type !== 'text') throw new Error('invalid_tool_result');
+ return JSON.parse(first.text);
+}
+
+// Background reconnection
+function scheduleReconnect() {
+ // Avoid parallel schedules
+ if (clientPromise) return;
+ const delay = backoffMs;
+ backoffMs = Math.min(MAX_BACKOFF, Math.floor(backoffMs * 1.8));
+ setTimeout(() => {
+ // Trigger a connection attempt; ignore errors
+ getClient().catch(() => undefined);
+ }, delay);
+}
+
+export function onMcpStatus(listener: (s: McpStatus) => void): () => void {
+ listeners.add(listener);
+ // emit current immediately
+ listener(status);
+ return () => listeners.delete(listener);
+}
+
+export function getMcpStatus(): McpStatus {
+ return status;
+}
+
+// Kick off initial connection attempt in background
+if (typeof window !== 'undefined') {
+ scheduleReconnect();
+}
diff --git a/apps/client/src/utils/sort-restaurants.ts b/apps/client/src/utils/sort-restaurants.ts
index f2056c4..4b505ac 100644
--- a/apps/client/src/utils/sort-restaurants.ts
+++ b/apps/client/src/utils/sort-restaurants.ts
@@ -1,23 +1,27 @@
import { Coordinate, RestaurantProps } from '@devolunch/shared';
import { calculateDistance } from '@/utils/distance';
-
-const DEVOTEAM_LOCATION: Coordinate = {
- lat: 55.61282608776878,
- lon: 13.003325575170862,
-};
+import { DEVOTEAM_LOCATION } from '@/utils/constants';
export const sortRestaurants = (
restaurants: RestaurantProps[],
coordinate: Coordinate = DEVOTEAM_LOCATION,
): RestaurantProps[] =>
restaurants
- .map((r: RestaurantProps) => ({
- ...r,
- distance: calculateDistance(coordinate, r.coordinate),
- }))
+ .map((r: RestaurantProps) => {
+ // For multi-location restaurants, find the closest location
+ let closestDistance = calculateDistance(coordinate, r.coordinate);
+
+ if (r.locations && r.locations.length > 0) {
+ const distances = r.locations.map((loc) => calculateDistance(coordinate, loc.coordinate));
+ closestDistance = Math.min(...distances);
+ }
+
+ return {
+ ...r,
+ distance: closestDistance,
+ };
+ })
.sort(
(a: RestaurantProps, b: RestaurantProps) =>
- (b.dishCollection?.filter((d) => d.dishes?.length).length || 0) -
- (a.dishCollection?.filter((d) => d.dishes?.length).length || 0) ||
- (a.distance && b.distance ? a.distance - b.distance : 0),
+ (a.distance && b.distance ? a.distance - b.distance : 0) || a.title.localeCompare(b.title),
);
diff --git a/apps/client/src/vite-env.d.ts b/apps/client/src/vite-env.d.ts
index 11f02fe..102802e 100644
--- a/apps/client/src/vite-env.d.ts
+++ b/apps/client/src/vite-env.d.ts
@@ -1 +1,8 @@
///
+///
+
+declare module '*.svg?react' {
+ import React from 'react';
+ const ReactComponent: React.FunctionComponent>;
+ export default ReactComponent;
+}
diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json
index e6d8749..704cb32 100644
--- a/apps/client/tsconfig.json
+++ b/apps/client/tsconfig.json
@@ -1,17 +1,8 @@
{
+ "extends": "../../tsconfig.base.json",
"compilerOptions": {
- "target": "ESNext",
- "useDefineForClassFields": true,
+ "baseUrl": ".",
"lib": ["DOM", "DOM.Iterable", "ESNext"],
- "allowJs": false,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "module": "ESNext",
- "moduleResolution": "Node",
- "resolveJsonModule": true,
- "isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"jsxImportSource": "@emotion/react",
diff --git a/apps/client/tsconfig.node.json b/apps/client/tsconfig.node.json
index 9d31e2a..a535f7d 100644
--- a/apps/client/tsconfig.node.json
+++ b/apps/client/tsconfig.node.json
@@ -2,7 +2,7 @@
"compilerOptions": {
"composite": true,
"module": "ESNext",
- "moduleResolution": "Node",
+ "moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
diff --git a/apps/client/vite.config.ts b/apps/client/vite.config.ts
index eafd4e6..aa5b341 100644
--- a/apps/client/vite.config.ts
+++ b/apps/client/vite.config.ts
@@ -5,6 +5,7 @@ import react from '@vitejs/plugin-react';
import { VitePWA } from 'vite-plugin-pwa';
import svgr from 'vite-plugin-svgr';
import viteCompression from 'vite-plugin-compression';
+import { visualizer } from 'rollup-plugin-visualizer';
import path from 'path';
// https://vitejs.dev/config/
@@ -23,27 +24,82 @@ export default defineConfig({
VitePWA({
registerType: 'autoUpdate',
includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'mask-icon.svg'],
+ workbox: {
+ globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'],
+ runtimeCaching: [
+ {
+ urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
+ handler: 'CacheFirst',
+ options: {
+ cacheName: 'google-fonts-cache',
+ expiration: {
+ maxEntries: 10,
+ maxAgeSeconds: 60 * 60 * 24 * 365, // 1 year
+ },
+ },
+ },
+ {
+ urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i,
+ handler: 'CacheFirst',
+ options: {
+ cacheName: 'gstatic-fonts-cache',
+ expiration: {
+ maxEntries: 10,
+ maxAgeSeconds: 60 * 60 * 24 * 365, // 1 year
+ },
+ },
+ },
+ ],
+ },
manifest: {
short_name: 'DL',
name: 'Devolunch',
+ description: 'Daily lunch menus from restaurants in Malmö',
+ categories: ['food', 'lifestyle'],
+ lang: 'en',
+ dir: 'ltr',
icons: [
{
src: 'pwa-192x192.png',
sizes: '192x192',
type: 'image/png',
+ purpose: 'any',
+ },
+ {
+ src: 'pwa-192x192.png',
+ sizes: '192x192',
+ type: 'image/png',
+ purpose: 'maskable',
+ },
+ {
+ src: 'pwa-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ purpose: 'any',
},
{
src: 'pwa-512x512.png',
sizes: '512x512',
type: 'image/png',
+ purpose: 'maskable',
},
],
- start_url: '.',
+ start_url: '/',
display: 'standalone',
+ display_override: ['window-controls-overlay', 'standalone'],
+ orientation: 'portrait-primary',
theme_color: '#ffffff',
background_color: '#ffffff',
+ scope: '/',
},
}),
+ visualizer({
+ filename: 'dist/bundle-analysis.html',
+ open: false, // Set to true if you want it to auto-open
+ gzipSize: true,
+ brotliSize: true,
+ template: 'treemap', // 'treemap' | 'sunburst' | 'network'
+ }),
],
resolve: {
alias: [{ find: '@', replacement: path.resolve(__dirname, 'src') }],
diff --git a/apps/client/vitest.config.ts b/apps/client/vitest.config.ts
index d232a1f..5bd33a2 100644
--- a/apps/client/vitest.config.ts
+++ b/apps/client/vitest.config.ts
@@ -1,7 +1,38 @@
///
import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+import path from 'path';
export default defineConfig({
- test: {},
+ plugins: [react()],
+ test: {
+ environment: 'jsdom',
+ globals: true,
+ setupFiles: ['./src/test/setup.ts'],
+ coverage: {
+ provider: 'v8',
+ reporter: ['text', 'json', 'html'],
+ exclude: [
+ 'node_modules/',
+ 'src/test/',
+ '**/*.d.ts',
+ '**/*.config.*',
+ 'dist/'
+ ],
+ thresholds: {
+ global: {
+ branches: 70,
+ functions: 70,
+ lines: 70,
+ statements: 70
+ }
+ }
+ }
+ },
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ },
+ },
});
diff --git a/apps/functions/notify-slack/.eslintrc.json b/apps/functions/notify-slack/.eslintrc.json
deleted file mode 100644
index b30c859..0000000
--- a/apps/functions/notify-slack/.eslintrc.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/eslintrc.json",
- "root": true,
- "env": {
- "node": true
- },
- "extends": ["custom"]
-}
diff --git a/apps/functions/notify-slack/README.md b/apps/functions/notify-slack/README.md
new file mode 100644
index 0000000..3c71cd3
--- /dev/null
+++ b/apps/functions/notify-slack/README.md
@@ -0,0 +1,48 @@
+# Notify Slack Cloud Function
+
+Overview
+- Google Cloud Function (v2) that posts the daily lunch menu to a Slack channel.
+- Reads the aggregated `scrape.json` produced by the scraper from a Google Cloud Storage bucket.
+- Uses structured logging via `@devolunch/shared/logger/node` (Pino for GCP).
+
+Quick Start (local)
+- Install deps: `pnpm -F notify-slack-cloud-function install`
+- Configure env: copy `.env.example` → `.env` and fill:
+ - `SLACK_OAUTH_TOKEN`
+ - `SLACK_CHANNEL_ID`
+ - `NODE_ENV=development` (optional for local)
+- Start locally (Functions Framework):
+ - `pnpm -F notify-slack-cloud-function start`
+ - Exposes the HTTP function at `http://localhost:8080` by default. Target name: `notify-slack`.
+
+What it does
+- Downloads `scrape.json` from the `devolunchv2` bucket.
+- Sorts restaurants by number of available dishes (desc), then by distance when present.
+- Renders a concise Markdown summary in both Swedish and English.
+- Posts the Markdown as a Slack file (type `post`) to the configured channel.
+
+Configuration
+- Source bucket: hard-coded to `devolunchv2` (see `src/index.ts`).
+- Env vars (validated in `src/config.ts`):
+ - `SLACK_OAUTH_TOKEN` (required)
+ - `SLACK_CHANNEL_ID` (required)
+ - `NODE_ENV` (optional; `development` enables dev behaviors if any)
+
+Scripts
+- `pnpm -F notify-slack-cloud-function build` — compile TypeScript to `dist`
+- `pnpm -F notify-slack-cloud-function typecheck` — run TypeScript type-checks
+- `pnpm -F notify-slack-cloud-function lint` — lint sources
+- `pnpm -F notify-slack-cloud-function format` — format with Prettier
+- `pnpm -F notify-slack-cloud-function start` — build + run via Functions Framework
+
+Deployment
+- Terraform: see `terraform/notify-slack` for infra and variables.
+- GitHub Actions: `.github/workflows/deploy-notify-slack.yaml` provisions the function via Terraform and uses Secrets for Slack credentials.
+
+Logging
+- Import `logger` from `@devolunch/shared/logger/node`.
+- Avoid `console.*` in server code. Use the logger for `info`, `warn`, `error`, and `debug`.
+
+Notes
+- This function expects the scraper to have already published a fresh `scrape.json` to the bucket.
+- You can test end-to-end locally by running the scraper locally in development mode (which writes a local `scrape.json`) and temporarily adjusting the function to read from a local file, or by uploading a test file to the bucket.
diff --git a/apps/functions/notify-slack/build.sh b/apps/functions/notify-slack/build.sh
index 6d7a611..563ab49 100755
--- a/apps/functions/notify-slack/build.sh
+++ b/apps/functions/notify-slack/build.sh
@@ -6,26 +6,21 @@
# Create output folder
mkdir -p build
-# Create tarball for both shared and eslint packages
+# Create tarball for shared package
cd ../../../packages/shared/ || exit
pnpm install --no-frozen-lockfile
pnpm build
pnpm pack
cp devolunch-shared-1.0.0.tgz ../../apps/functions/notify-slack/devolunch-shared-1.0.0.tgz
-cd ../eslint || exit
-pnpm install --no-frozen-lockfile
-pnpm pack
-cp eslint-config-custom-1.0.0.tgz ../../apps/functions/notify-slack/eslint-config-custom-1.0.0.tgz
# Change devDependencies to point to the new tarball and include everything that's built into the zip
cd ../../apps/functions/notify-slack || exit
-npm pkg set 'devDependencies.@devolunch/shared=file:devolunch-shared-1.0.0.tgz' 'devDependencies.eslint-config-custom=file:eslint-config-custom-1.0.0.tgz'
+npm pkg set 'devDependencies.@devolunch/shared=file:devolunch-shared-1.0.0.tgz'
pnpm install --no-frozen-lockfile
npx make-dedicated-lockfile
-pnpm compile
-cp -R package.json pnpm-lock.yaml dist eslint-config-custom-1.0.0.tgz devolunch-shared-1.0.0.tgz build
-npm pkg set 'devDependencies.@devolunch/shared=workspace:' 'devDependencies.eslint-config-custom=workspace:'
+pnpm build
+cp -R package.json pnpm-lock.yaml dist devolunch-shared-1.0.0.tgz build
+npm pkg set 'devDependencies.@devolunch/shared=workspace:'
# Clean up
rm -f devolunch-shared-1.0.0.tgz
-rm -f eslint-config-custom-1.0.0.tgz
diff --git a/apps/functions/notify-slack/build/.gitkeep b/apps/functions/notify-slack/build/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/apps/functions/notify-slack/eslint.config.js b/apps/functions/notify-slack/eslint.config.js
new file mode 100644
index 0000000..00aeb6b
--- /dev/null
+++ b/apps/functions/notify-slack/eslint.config.js
@@ -0,0 +1,36 @@
+import js from '@eslint/js';
+import tseslint from '@typescript-eslint/eslint-plugin';
+import tsparser from '@typescript-eslint/parser';
+
+export default [
+ js.configs.recommended,
+ {
+ files: ['**/*.{js,ts}'],
+ languageOptions: {
+ parser: tsparser,
+ globals: {
+ console: 'readonly',
+ process: 'readonly',
+ Buffer: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ global: 'readonly',
+ },
+ },
+ plugins: {
+ '@typescript-eslint': tseslint,
+ },
+ rules: {
+ ...tseslint.configs.recommended.rules,
+ 'no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars': [
+ 'error',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ caughtErrorsIgnorePattern: '^_',
+ },
+ ],
+ },
+ },
+];
diff --git a/apps/functions/notify-slack/package.json b/apps/functions/notify-slack/package.json
index ab2cfbc..47d6e6b 100644
--- a/apps/functions/notify-slack/package.json
+++ b/apps/functions/notify-slack/package.json
@@ -3,30 +3,25 @@
"version": "1.0.0",
"description": "Google Cloud Function slack notifier",
"main": "dist/index.js",
+ "type": "module",
"scripts": {
- "start": "tsc && functions-framework --target=notify-slack",
- "compile": "tsc",
+ "start": "pnpm build && functions-framework --target=notify-slack",
+ "build": "tsc",
"typecheck": "tsc --noEmit",
- "lint": "prettier --check --ignore-path=../../../.prettierignore . && eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0"
+ "lint": "eslint src --ext ts --max-warnings 0",
+ "format": "prettier --write ."
},
"author": "Jonas Stenberg",
"license": "MIT",
"dependencies": {
"@google-cloud/functions-framework": "3.2.0",
"@google-cloud/storage": "^5.20.5",
- "@types/express": "^4.17.20",
+ "pino": "^9.10.0",
"dotenv": "16.0.3",
- "form-data": "^4.0.0",
- "node-fetch": "^2.7.0",
"zod": "^3.22.4"
},
"devDependencies": {
"@devolunch/shared": "workspace:^",
- "@pnpm/make-dedicated-lockfile": "^0.5.10",
- "@types/node": "20.1.7",
- "@types/node-fetch": "^2.6.7",
- "eslint-config-custom": "workspace:^",
- "prettier": "2.8.8",
- "typescript": "^5.2.2"
+ "@pnpm/make-dedicated-lockfile": "^0.5.10"
}
}
diff --git a/apps/functions/notify-slack/src/config.ts b/apps/functions/notify-slack/src/config.ts
index 517c0be..9847785 100644
--- a/apps/functions/notify-slack/src/config.ts
+++ b/apps/functions/notify-slack/src/config.ts
@@ -1,7 +1,12 @@
import { z } from 'zod';
import dotenv from 'dotenv';
+import { fileURLToPath } from 'url';
+import { dirname, join } from 'path';
-const Config = z
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const ConfigSchema = z
.object({
development: z.boolean(),
slackChannelId: z.string().min(1),
@@ -9,16 +14,18 @@ const Config = z
})
.strict();
-export type Config = z.infer;
+export type Config = z.infer;
export const createConfig = () => {
- dotenv.config();
+ // Load .env file from the correct location (one level up from dist)
+ const envPath = join(__dirname, '..', '.env');
+ dotenv.config({ path: envPath });
- const config = Config.parse({
+ const config = ConfigSchema.parse({
development: process.env.NODE_ENV === 'development',
slackChannelId: process.env.SLACK_CHANNEL_ID || '',
slackOauthToken: process.env.SLACK_OAUTH_TOKEN || '',
});
- return Config.parse(config);
+ return config;
};
diff --git a/apps/functions/notify-slack/src/index.ts b/apps/functions/notify-slack/src/index.ts
index 31ece13..86cd234 100644
--- a/apps/functions/notify-slack/src/index.ts
+++ b/apps/functions/notify-slack/src/index.ts
@@ -1,92 +1,241 @@
import * as ff from '@google-cloud/functions-framework';
-import fetch from 'node-fetch';
-import FormData from 'form-data';
-import { Storage } from '@google-cloud/storage';
-import { DishCollectionProps, RestaurantProps } from '@devolunch/shared';
-import { createConfig } from './config';
-
-const BUCKET_NAME = 'devolunchv2';
+import { createConfig } from './config.js';
+
+interface DishProps {
+ type?: string;
+ title: string;
+}
+
+interface DishCollectionProps {
+ language: string;
+ dishes: DishProps[];
+}
+
+interface RestaurantProps {
+ title: string;
+ distance?: number;
+ dishCollection?: DishCollectionProps[];
+ locations?: LocationProps[];
+}
+
+interface LocationProps {
+ title: string;
+ dishCollection?: DishCollectionProps[];
+}
const config = createConfig();
-const storage = new Storage({
- projectId: 'devolunch',
-});
-const renderMarkdown = (restaurants: RestaurantProps[]) => {
- let result = '_English version below_\n\n';
+const hasMenuData = (restaurant: RestaurantProps): boolean => {
+ // Check main restaurant dishCollection
+ const hasMainMenu = restaurant.dishCollection?.some((dc: DishCollectionProps) => dc.dishes?.length > 0);
- // Swedish
- restaurants.forEach((restaurant) => {
- result += renderItemForMarkdown('sv', restaurant);
- });
+ // Check locations dishCollection
+ const hasLocationMenus = restaurant.locations?.some((location: LocationProps) =>
+ location.dishCollection?.some((dc: DishCollectionProps) => dc.dishes?.length > 0)
+ );
+
+ return hasMainMenu || hasLocationMenus || false;
+};
- // English
- result += '\n\n_English_\n---------------------\n\n';
- restaurants.forEach((restaurant) => {
- result += renderItemForMarkdown('en', restaurant);
+const renderSummaryMessage = (restaurants: RestaurantProps[]) => {
+ const today = new Date().toLocaleDateString('sv-SE', {
+ weekday: 'long',
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric'
});
- result += '\n\n';
+ const restaurantsWithMenus = restaurants.filter(hasMenuData);
+
+ let result = `🍽️ *Lunch Menu ${today}*\n`;
+ result += `📍 _${restaurantsWithMenus.length} restaurants in Malmö_\n\n`;
+ result += `🔗 _Full details: _`;
return result;
};
-const renderItemForMarkdown = (language: string, { title, dishCollection }: RestaurantProps): string => {
- const dishCollectionForLanguage = dishCollection?.find((dc: { language: string }) => dc.language === language);
+const renderRestaurantChunk = (restaurants: RestaurantProps[], startIndex: number, chunkSize: number) => {
+ const chunk = restaurants.slice(startIndex, startIndex + chunkSize);
+ let result = '';
+
+ chunk.forEach((restaurant, index) => {
+ result += renderItemForMarkdown(restaurant, startIndex + index + 1);
+ });
+
+ return result.trim();
+};
+
+const getDishCollection = (dishCollection?: DishCollectionProps[]) => {
+ // Try Swedish first, fallback to English, then any available language
+ return dishCollection?.find((dc: { language: string }) => dc.language === 'sv') ||
+ dishCollection?.find((dc: { language: string }) => dc.language === 'en') ||
+ dishCollection?.[0];
+};
- if (!dishCollectionForLanguage?.dishes.length) {
+const renderDishes = (dishCollection?: DishCollectionProps[]): string => {
+ const availableDishes = getDishCollection(dishCollection);
+
+ if (!availableDishes?.dishes?.length) {
return '';
}
- let result = `*${title}*\n\n`;
+ const dishTypeEmojis: Record = {
+ 'meat': '🥩',
+ 'fish': '🐟',
+ 'vegetarian': '🥗',
+ 'vegan': '🌱'
+ };
+
+ let result = '';
+ for (const dish of availableDishes.dishes) {
+ const type = dish?.type?.toLowerCase() || '';
+ const emoji = dishTypeEmojis[type] || '🍽️';
+ const dishType = dish?.type?.replace(/\b\w/g, (l: string) => l.toUpperCase()) || '';
- for (const dish of dishCollectionForLanguage.dishes) {
- result += `• ${dish?.type?.replace(/\b\w/g, (l) => l.toUpperCase())}: ${dish.title}\n`;
+ result += ` ${emoji} ${dishType}: ${dish.title}\n`;
}
return result;
};
-const getTodayNiceFormat = (): string => {
- const d = new Date();
- d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
- return d.toISOString().split('T')[0];
+const renderItemForMarkdown = ({ title, dishCollection, locations }: RestaurantProps, index: number): string => {
+ let result = `${index}. *${title}*\n`;
+
+ // Check if restaurant has direct dishes
+ const mainDishes = renderDishes(dishCollection);
+ if (mainDishes) {
+ result += mainDishes;
+ }
+
+ // Check if restaurant has location-based dishes
+ if (locations?.length) {
+ locations.forEach((location) => {
+ const locationDishes = renderDishes(location.dishCollection);
+ if (locationDishes) {
+ // Only show location name if there are multiple locations or no main dishes
+ if (locations.length > 1 || !mainDishes) {
+ result += ` 📍 _${location.title}_\n`;
+ }
+ result += locationDishes;
+ }
+ });
+ }
+
+ // If no dishes found at all, return empty
+ if (result === `${index}. *${title}*\n`) {
+ return '';
+ }
+
+ result += '\n';
+ return result;
};
-ff.http('notify-slack', async (_: ff.Request, res: ff.Response) => {
- // send to slack
- const bucket = storage.bucket(BUCKET_NAME);
- const file = await bucket.file('scrape.json').download();
- const scrape = JSON.parse(file[0].toString('utf8'));
- const sortedRestaurants = scrape.restaurants.sort(
+ff.http('notify-slack', async (_req: ff.Request, res: ff.Response) => {
+ console.log('🚀 notify-slack function called');
+ void _req;
+
+ try {
+ // send to slack - use local file for testing
+ const fs = await import('fs');
+ const { fileURLToPath } = await import('url');
+ const { dirname, join } = await import('path');
+
+ const __filename = fileURLToPath(import.meta.url);
+ const __dirname = dirname(__filename);
+ const scrapePath = join(__dirname, '..', '..', '..', 'functions', 'scraper', 'scrape.json');
+
+ console.log(`📁 Reading local scrape.json from: ${scrapePath}`);
+ const file = fs.readFileSync(scrapePath, 'utf8');
+ const scrape = JSON.parse(file);
+ console.log(`📊 Found ${scrape.restaurants?.length || 0} restaurants`);
+
+ const sortedRestaurants = scrape.restaurants.sort(
(a: RestaurantProps, b: RestaurantProps) =>
(b.dishCollection?.filter((d: DishCollectionProps) => d.dishes?.length).length || 0) -
(a.dishCollection?.filter((d: DishCollectionProps) => d.dishes?.length).length || 0) ||
(a.distance && b.distance ? a.distance - b.distance : 0),
);
- const mdText = renderMarkdown(sortedRestaurants);
+ // Filter restaurants with actual menus
+ const restaurantsWithMenus = sortedRestaurants.filter(hasMenuData);
- const form = new FormData();
- form.append('initial_comment', 'https://www.malmolunch.se');
- form.append('content', mdText);
- form.append('channels', config.slackChannelId);
- form.append('title', `Lunch ${getTodayNiceFormat()}`);
- form.append('filetype', 'post');
+ const summaryText = renderSummaryMessage(restaurantsWithMenus);
- try {
- const response = await fetch('https://slack.com/api/files.upload', {
+ console.log(`📝 Generated summary for ${restaurantsWithMenus.length} restaurants`);
+
+ // Send main summary message
+ console.log('📤 Sending Slack summary message...');
+ const summaryResponse = await fetch('https://slack.com/api/chat.postMessage', {
method: 'POST',
- body: form,
headers: {
- Authorization: `Bearer ${config.slackOauthToken}`,
+ 'Authorization': `Bearer ${config.slackOauthToken}`,
+ 'Content-Type': 'application/json',
},
+ body: JSON.stringify({
+ channel: config.slackChannelId,
+ text: summaryText,
+ mrkdwn: true,
+ }),
});
- if (!response.ok) {
- throw new Error(`Server error ${response.status}`);
+
+ const summaryData = await summaryResponse.json();
+ if (!summaryData.ok) {
+ throw new Error(`Summary message post error: ${summaryData.error}`);
+ }
+
+ console.log('✅ Summary message sent! Now sending restaurant details in thread...');
+
+ // Send restaurant details in threaded chunks
+ const chunkSize = 8; // Restaurants per thread message
+ let totalSent = 0;
+
+ for (let i = 0; i < restaurantsWithMenus.length; i += chunkSize) {
+ const chunkText = renderRestaurantChunk(restaurantsWithMenus, i, chunkSize);
+
+ if (!chunkText) continue;
+
+ const threadResponse = await fetch('https://slack.com/api/chat.postMessage', {
+ method: 'POST',
+ headers: {
+ 'Authorization': `Bearer ${config.slackOauthToken}`,
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ channel: config.slackChannelId,
+ text: chunkText,
+ thread_ts: summaryData.ts,
+ mrkdwn: true,
+ }),
+ });
+
+ const threadData = await threadResponse.json();
+ if (!threadData.ok) {
+ console.warn(`⚠️ Failed to send thread chunk ${i / chunkSize + 1}: ${threadData.error}`);
+ } else {
+ totalSent += Math.min(chunkSize, restaurantsWithMenus.length - i);
+ console.log(`📤 Sent restaurants ${i + 1}-${Math.min(i + chunkSize, restaurantsWithMenus.length)} to thread`);
+ }
+
+ // Small delay to avoid rate limiting
+ await new Promise(resolve => globalThis.setTimeout(resolve, 100));
}
+
+ console.log(`✅ All messages sent successfully! Total restaurants: ${totalSent}`);
+ res.status(200).json({
+ success: true,
+ message: 'Slack notification sent successfully',
+ messageTs: summaryData.ts,
+ restaurants: totalSent,
+ threaded: true,
+ chunkSize: chunkSize
+ });
+
} catch (err) {
- console.error(err);
+ console.error('❌ Error in notify-slack function:', err);
+ res.status(500).json({
+ success: false,
+ error: err instanceof Error ? err.message : String(err),
+ stack: err instanceof Error ? err.stack : undefined
+ });
+ return;
}
-
- res.sendStatus(200);
});
diff --git a/apps/functions/notify-slack/tsconfig.json b/apps/functions/notify-slack/tsconfig.json
index 6486826..91b3a12 100644
--- a/apps/functions/notify-slack/tsconfig.json
+++ b/apps/functions/notify-slack/tsconfig.json
@@ -1,13 +1,18 @@
{
"compilerOptions": {
- "target": "ESNext",
- "module": "NodeNext",
- "moduleResolution": "NodeNext",
- "lib": ["ESNext", "dom", "dom.iterable"],
+ "target": "ES2020",
+ "module": "ESNext",
+ "moduleResolution": "node",
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "noEmit": false,
"esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
"strict": true,
- "outDir": "dist"
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["ESNext", "dom", "dom.iterable"]
},
- "include": ["./src/**/*"],
- "exclude": ["node_modules"]
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
}
diff --git a/apps/functions/scraper/.env.example b/apps/functions/scraper/.env.example
index 293aec7..f6a1db3 100644
--- a/apps/functions/scraper/.env.example
+++ b/apps/functions/scraper/.env.example
@@ -1,4 +1,4 @@
NODE_ENV=development
DEFAULT_LANGUAGE=sv
TRANSLATE_LANGUAGES=en
-FILES_OVERRIDE=hylliebistro.js
\ No newline at end of file
+OPENAI_API_KEY=openai-key
diff --git a/apps/functions/scraper/.eslintrc.json b/apps/functions/scraper/.eslintrc.json
deleted file mode 100644
index b30c859..0000000
--- a/apps/functions/scraper/.eslintrc.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/eslintrc.json",
- "root": true,
- "env": {
- "node": true
- },
- "extends": ["custom"]
-}
diff --git a/apps/functions/scraper/README.md b/apps/functions/scraper/README.md
index bac3c87..1212aef 100644
--- a/apps/functions/scraper/README.md
+++ b/apps/functions/scraper/README.md
@@ -1,130 +1,83 @@
-# Scraper
-
-The scraper picks up all restaurants that are located in `/src/restaurants`.
-
-You can decide either to scrape a website or a PDF on a website.
-
-Here are two different examples on how to parse the DOM of the website, to either extract an array of dishes or extract the link to the PDF:
-
-### Get array of dishes from DOM:
-
-```ts
-import { Page } from 'puppeteer';
-
-export const meta = {
- title: 'Stora Varvsgatan',
- url: 'https://storavarvsgatan6.se/meny.html',
- imageUrl:
- 'https://storavarvsgatan6.se/____impro/1/onewebmedia/foodiesfeed.com_close-up-on-healthy-green-broccoli%20%28kopia%29.jpg?etag=%226548df-5f256567%22&sourceContentType=image%2Fjpeg&ignoreAspectRatio&resize=1900%2B1267&extract=81%2B0%2B939%2B1190&quality=85',
- googleMapsUrl: 'https://goo.gl/maps/5YUuxPzsMSg5kmK98',
- latitude: 55.612390477729015,
- longitude: 12.991505487495564,
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const today = [...document.querySelectorAll('p')]?.find((e) =>
- e?.textContent?.toLowerCase()?.includes(new Date()?.toLocaleString('sv-SE', { weekday: 'long' })),
- );
- const meat = today?.nextElementSibling?.textContent;
- const veg = today?.nextElementSibling?.nextElementSibling?.textContent;
-
- return [
- {
- type: 'meat' as const,
- description: meat,
- },
- {
- type: 'veg' as const,
- description: veg,
- },
- ];
- });
-```
-
-### Get URL to PDF from DOM and parse array of dishes from PDF:
-
-```ts
-import { Page } from 'puppeteer';
-import pdf from 'pdf-parse';
-
-export const meta = {
- title: 'BISe',
- url: 'https://bise.se/lunch',
- imageUrl:
- 'https://bise.se/_next/image?url=https%3A%2F%2Fcms.bise.se%2Fwp-content%2Fuploads%2F2022%2F10%2FLunch_Bise.jpeg&w=1080&q=75',
- googleMapsUrl: 'https://goo.gl/maps/9hmQUctdgeNvVSuF8',
- latitude: 55.60675917303053,
- longitude: 12.996173056055413,
-};
-
-export const pdfScrapeFunction = async (url: string) => {
- if (!url) {
- return [];
+Scraper
+
+Overview
+- Google Cloud Function (v2) that scrapes restaurant lunch menus and writes a daily JSON to Cloud Storage.
+- Headless navigation via Puppeteer with multiple extraction strategies:
+ - Text extraction from HTML (content cleaner reduces noise)
+ - PDF extraction: pdf-parse first; fallback to pdfjs-dist for image-based PDFs
+ - Image extraction via OpenAI Vision when needed
+- Structured logging via @devolunch/shared/logger (Pino), designed for GCP logs.
+
+Local Development
+- Start HTTP function locally: `pnpm -F scraper-cloud-function start` (functions-framework on port 8081)
+- Run one-off scrape: `pnpm -F scraper-cloud-function scrape`
+- Build only: `pnpm -F scraper-cloud-function build`
+- During development, the result is also written to `apps/functions/scraper/scrape.json` (ignored by git).
+
+Configuration
+- Env vars (see `src/config.ts`):
+ - `NODE_ENV`: set to `development` for local runs (enables local file output)
+ - `DEFAULT_LANGUAGE` (default: `sv`)
+ - `TRANSLATE_LANGUAGES` (comma-separated, default: `en`)
+ - `USE_CONTENT_CLEANER` (default: true; set `false` to disable)
+ - `TEST_OVERRIDE`: override restaurant title for testing AI extraction on a specific restaurant (e.g., `TEST_OVERRIDE="Marie Antoinette" NODE_ENV=development pnpm scrape`)
+- Secrets/credentials: use your local environment or GCP runtime config for Google APIs and OpenAI.
+- Logging level via `LOG_LEVEL` (info by default).
+
+How Extraction Works
+1) Try extracting dishes from cleaned page text (fastest path)
+2) Detect and parse PDFs when helpful (pdf-parse; fallback to PDF.js)
+3) If images likely contain the menu, use OpenAI Vision to extract text
+4) If dynamic content loads slowly, wait and retry text extraction
+5) Translate dishes to additional languages if configured
+6) Upload `scrape.json` to the configured bucket in non-development mode
+
+Restaurant Metadata
+- Restaurants are defined in `src/restaurants.ts` as `RestaurantMetaProps[]`.
+- Minimal example:
+ ```ts
+ {
+ title: 'Example Restaurant',
+ url: 'https://example.com/lunch',
+ imageUrl: 'https://example.com/cover.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/...',
+ coordinate: { lat: 55.6, lon: 13.0 },
}
-
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const f = await fetch(url);
- const buffer = await f.arrayBuffer();
- const pdfData = await pdf(Buffer.from(buffer));
-
- const raw = pdfData.text
- .split('\n')
- .map((a: string) =>
- a
- .replace(/ {2}|\r\n|\n|\r/gm, '')
- .replace('’', '')
- .trim(),
- )
- .filter((a: string) => a && !a.startsWith('Warning'));
-
- const capitalizeFirstLetter = (string: string) => {
- return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
- };
-
- const todayMeatIndex = raw.findIndex((a: string) => a.toLowerCase().includes(todaySwedishFormat));
- const vegIndex = raw.findIndex((a: string) => a.toLowerCase().includes('veckans vegetariska'));
-
- const todayMeat = {
- type: 'meat' as const,
- description: capitalizeFirstLetter(raw[todayMeatIndex + 1]),
+ ```
+- Helpful optional fields:
+ - `useContentCleaner?: boolean` — override global content cleaner per restaurant
+ - `unknownMealDefault?: 'veg' | 'meat' | 'fish' | 'vegan' | 'misc'` — fallback type when classification is unclear
+ - `multiLocation?`: handle chains with multiple branches
+ - `type: 'shared'` — scrape once, reuse dishes across all provided locations
+ - `type: 'filtered'` — scrape once; use regex filters to narrow content per location
+ - Each location can specify a `locationFilter` (regex or alternation string)
+ - `type: 'separate'` — each location has its own `url` and is scraped separately
+
+Closure Detection
+- Automatic closure detection based on known restaurant schedules
+- Configured in `src/utils/closureDetection.ts` via `KNOWN_CLOSURES` object:
+ ```ts
+ const KNOWN_CLOSURES: Record = {
+ 'marie antoinette': ['monday', 'tuesday'],
+ 'marvin': ['monday', 'tuesday'],
+ // Add more restaurants as needed
};
-
- const veg = {
- type: 'veg' as const,
- description: capitalizeFirstLetter(raw[vegIndex + 1]),
- };
-
- return [todayMeat, veg];
-};
-
-export const browserScrapeFunction = async (page: Page) => {
- const url = await page.evaluate(async () => {
- const lunchNode = [...document.querySelectorAll('a')].find((a) =>
- a?.innerText?.toLowerCase()?.includes('veckans lunchmeny'),
- );
- const url = lunchNode?.getAttribute('href');
-
- if (!url) {
- return '';
- }
-
- return url;
- });
-
- return pdfScrapeFunction(url);
-};
-```
-
-### Debug
-
-If you want to debug your specific scraper you can add the name(s) (comma-separated) of the restaurant .js file as an environment variable in `.env` like so:
-
-```sh
-FILES_OVERRIDE=bise.js
-```
+ ```
+- When a restaurant is detected as closed:
+ - Dishes array is emptied (`dishes: []`)
+ - Closure info is added to `lunchInfo.closureInfo` with reason and reopening details
+ - AI extraction still runs but results are discarded to respect closure status
+- Restaurant names are normalized to lowercase for matching
+
+Output
+- Development: writes `scrape.json` next to the source for quick inspection
+- Production: uploads `scrape.json` to the `devolunchv2` bucket (see `storage` integration in `src/scraper.ts`)
+
+Logging
+- Uses shared Pino logger with GCP severity mapping:
+ - Server-side: `import { logger } from '@devolunch/shared/logger/node'`
+ - Avoid `console.*` in server code; browser `console.*` may appear inside `page.evaluate()` only
+
+Notes
+- PDF parsing is opportunistic; the scraper picks the best available source (text/PDF/images).
+- When running locally, ensure Puppeteer can install a Chrome binary (handled by `gcp-build` and `postinstall`).
diff --git a/apps/functions/scraper/build.sh b/apps/functions/scraper/build.sh
index c80bdf0..c8710d3 100755
--- a/apps/functions/scraper/build.sh
+++ b/apps/functions/scraper/build.sh
@@ -6,26 +6,21 @@
# Create output folder
mkdir -p build
-# Create tarball for both shared and eslint packages
+# Create tarball for shared package
cd ../../../packages/shared/ || exit
pnpm install --no-frozen-lockfile
pnpm build
pnpm pack
cp devolunch-shared-1.0.0.tgz ../../apps/functions/scraper/devolunch-shared-1.0.0.tgz
-cd ../eslint || exit
-pnpm install --no-frozen-lockfile
-pnpm pack
-cp eslint-config-custom-1.0.0.tgz ../../apps/functions/scraper/eslint-config-custom-1.0.0.tgz
# Change devDependencies to point to the new tarball and include everything that's built into the zip
cd ../../apps/functions/scraper || exit
-npm pkg set 'devDependencies.@devolunch/shared=file:devolunch-shared-1.0.0.tgz' 'devDependencies.eslint-config-custom=file:eslint-config-custom-1.0.0.tgz'
+npm pkg set 'devDependencies.@devolunch/shared=file:devolunch-shared-1.0.0.tgz'
pnpm install --no-frozen-lockfile
npx make-dedicated-lockfile
-pnpm compile
-cp -R package.json pnpm-lock.yaml .puppeteerrc.cjs test dist devolunch-shared-1.0.0.tgz eslint-config-custom-1.0.0.tgz build
-npm pkg set 'devDependencies.@devolunch/shared=workspace:' 'devDependencies.eslint-config-custom=workspace:'
+pnpm build
+cp -R package.json pnpm-lock.yaml .puppeteerrc.cjs dist devolunch-shared-1.0.0.tgz build
+npm pkg set 'devDependencies.@devolunch/shared=workspace:'
# Clean up
rm -f devolunch-shared-1.0.0.tgz
-rm -f eslint-config-custom-1.0.0.tgz
diff --git a/apps/functions/scraper/build/.gitkeep b/apps/functions/scraper/build/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/apps/functions/scraper/eslint.config.js b/apps/functions/scraper/eslint.config.js
new file mode 100644
index 0000000..e695248
--- /dev/null
+++ b/apps/functions/scraper/eslint.config.js
@@ -0,0 +1,48 @@
+import js from '@eslint/js';
+import tseslint from '@typescript-eslint/eslint-plugin';
+import tsparser from '@typescript-eslint/parser';
+
+export default [
+ js.configs.recommended,
+ {
+ files: ['**/*.{js,ts}'],
+ languageOptions: {
+ parser: tsparser,
+ globals: {
+ console: 'readonly',
+ process: 'readonly',
+ Buffer: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ global: 'readonly',
+ fetch: 'readonly',
+ // Browser globals for AI scraping code
+ window: 'readonly',
+ document: 'readonly',
+ URL: 'readonly',
+ HTMLAnchorElement: 'readonly',
+ Element: 'readonly',
+ Document: 'readonly',
+ setInterval: 'readonly',
+ clearInterval: 'readonly',
+ },
+ },
+ plugins: {
+ '@typescript-eslint': tseslint,
+ },
+ rules: {
+ ...tseslint.configs.recommended.rules,
+ 'no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars': [
+ 'error',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ caughtErrorsIgnorePattern: '^_',
+ },
+ ],
+ // Relax some rules for AI/scraping code
+ '@typescript-eslint/no-explicit-any': 'warn',
+ },
+ },
+];
diff --git a/apps/functions/scraper/jest.config.cjs b/apps/functions/scraper/jest.config.cjs
deleted file mode 100644
index 98e8681..0000000
--- a/apps/functions/scraper/jest.config.cjs
+++ /dev/null
@@ -1,17 +0,0 @@
-module.exports = {
- preset: 'ts-jest',
- testEnvironment: 'node',
- moduleDirectories: ['node_modules', 'src'],
- moduleNameMapper: {
- '^@/(.*)$': '/src/$1',
- },
- testMatch: ['**/src/**/*.test.(ts|tsx)'],
- transform: {
- '^.+\\.(ts|tsx|js|jsx)$': [
- 'ts-jest',
- {
- tsconfig: 'tsconfig.jest.json',
- },
- ],
- },
-};
diff --git a/apps/functions/scraper/package.json b/apps/functions/scraper/package.json
index e064891..d280b94 100644
--- a/apps/functions/scraper/package.json
+++ b/apps/functions/scraper/package.json
@@ -5,37 +5,31 @@
"main": "dist/index.js",
"type": "module",
"scripts": {
- "start": "pnpm compile && functions-framework --target=scrape",
- "test": "jest --config jest.config.cjs",
- "test:watch": "jest --watch",
- "compile": "tsc",
+ "start": "pnpm build && functions-framework --target=scrape --port=8081",
+ "scrape": "pnpm build && node dist/apps/functions/scraper/src/scraper.js",
+ "build": "tsc",
"typecheck": "tsc --noEmit",
- "lint": "prettier --check --ignore-path=../../../.prettierignore . && eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
- "gcp-build": "node node_modules/puppeteer/install.js"
+ "lint": "eslint src --ext ts --max-warnings 0",
+ "format": "prettier --write .",
+ "gcp-build": "npx puppeteer browsers install chrome",
+ "postinstall": "npx puppeteer browsers install chrome"
},
"author": "Jonas Stenberg",
"license": "MIT",
"dependencies": {
- "@google-cloud/functions-framework": "3.2.0",
- "@google-cloud/storage": "^5.20.5",
- "@google-cloud/translate": "^6.3.1",
- "dotenv": "16.0.3",
- "pdf-parse": "1.1.1",
- "puppeteer": "^20.9.0",
- "sharp": "0.33.2",
- "zod": "^3.22.4"
+ "@google-cloud/functions-framework": "^3.4.4",
+ "@google-cloud/storage": "^7.15.0",
+ "@google-cloud/translate": "^8.4.0",
+ "pino": "^9.10.0",
+ "dotenv": "^16.4.7",
+ "openai": "^5.21.0",
+ "pdf-parse": "^1.1.1",
+ "pdfjs-dist": "^5.4.149",
+ "puppeteer": "^24.0.0",
+ "zod": "^3.24.1"
},
"devDependencies": {
"@devolunch/shared": "workspace:^",
- "@pnpm/make-dedicated-lockfile": "^0.5.10",
- "@types/express": "^4.17.20",
- "@types/jest": "^29.5.6",
- "@types/node": "20.1.7",
- "@types/pdf-parse": "1.1.1",
- "eslint-config-custom": "workspace:^",
- "jest": "^29.7.0",
- "prettier": "2.8.8",
- "ts-jest": "^29.1.1",
- "typescript": "^5.2.2"
+ "@pnpm/make-dedicated-lockfile": "^0.5.10"
}
}
diff --git a/apps/functions/scraper/src/clients/openai.ts b/apps/functions/scraper/src/clients/openai.ts
new file mode 100644
index 0000000..12e4ee5
--- /dev/null
+++ b/apps/functions/scraper/src/clients/openai.ts
@@ -0,0 +1,13 @@
+import OpenAI from 'openai';
+
+// Lazy initialize OpenAI client
+let openai: OpenAI | null = null;
+
+export const getOpenAI = () => {
+ if (!openai) {
+ openai = new OpenAI({
+ apiKey: process.env.OPENAI_API_KEY,
+ });
+ }
+ return openai;
+};
diff --git a/apps/functions/scraper/src/config.ts b/apps/functions/scraper/src/config.ts
index d76b75e..ea5cc42 100644
--- a/apps/functions/scraper/src/config.ts
+++ b/apps/functions/scraper/src/config.ts
@@ -1,26 +1,14 @@
-import { z } from 'zod';
import dotenv from 'dotenv';
-const Config = z
- .object({
- development: z.boolean(),
- defaultLanguage: z.string().min(1),
- translateLanguages: z.string().min(1),
- filesOverride: z.string().optional(),
- })
- .strict();
+// Load env only for truly dynamic/sensitive values (e.g., NODE_ENV)
+dotenv.config();
-export type Config = z.infer;
+// Keep configuration simple and mostly constant. Only NODE_ENV affects behavior.
+export const config = {
+ development: process.env.NODE_ENV === 'development',
+ defaultLanguage: process.env.DEFAULT_LANGUAGE || 'sv',
+ translateLanguages: process.env.TRANSLATE_LANGUAGES || 'en',
+ useContentCleaner: process.env.USE_CONTENT_CLEANER !== 'false', // Default to true, can be disabled
+} as const;
-export const createConfig = () => {
- dotenv.config();
-
- const config = Config.parse({
- development: process.env.NODE_ENV === 'development',
- defaultLanguage: process.env.DEFAULT_LANGUAGE || '',
- translateLanguages: process.env.TRANSLATE_LANGUAGES || '',
- filesOverride: process.env.FILES_OVERRIDE || undefined,
- });
-
- return Config.parse(config);
-};
+export type Config = typeof config;
diff --git a/apps/functions/scraper/src/config/restaurantLoader.ts b/apps/functions/scraper/src/config/restaurantLoader.ts
new file mode 100644
index 0000000..8ec28f1
--- /dev/null
+++ b/apps/functions/scraper/src/config/restaurantLoader.ts
@@ -0,0 +1,50 @@
+import type { RestaurantMetaProps } from '@devolunch/shared';
+import { restaurants } from '../restaurants.js';
+import { logger } from '@devolunch/shared/logger/node';
+
+/**
+ * Parses restaurant sources from environment variables
+ */
+const parseSources = (): RestaurantMetaProps[] => {
+ try {
+ const raw = process.env.AI_GENERIC_SOURCES;
+ if (!raw) return [];
+ const arr = JSON.parse(raw);
+ if (!Array.isArray(arr)) return [];
+ return arr as RestaurantMetaProps[];
+ } catch {
+ return [];
+ }
+};
+
+/**
+ * Parses test override restaurants from environment for debugging
+ */
+const parseTestOverrideRestaurants = (): string[] => {
+ const testOverride = process.env.TEST_OVERRIDE;
+ if (!testOverride) return [];
+ return testOverride.split(',').map(name => name.trim().toLowerCase());
+};
+
+/**
+ * Gets restaurant metadata - prefers env sources, falls back to hardcoded list
+ * Supports TEST_OVERRIDE filtering for debugging specific restaurants
+ */
+export const getRestaurantMetas = (): RestaurantMetaProps[] => {
+ const envSources = parseSources();
+ let metas = envSources.length ? envSources : restaurants;
+
+ // Filter to only include test override restaurants for debugging
+ const testOverrideNames = parseTestOverrideRestaurants();
+ if (testOverrideNames.length > 0) {
+ const originalCount = metas.length;
+ metas = metas.filter(meta => testOverrideNames.includes(meta.title.toLowerCase()));
+ logger.info({
+ testOverrideRestaurants: testOverrideNames,
+ originalCount,
+ filteredCount: metas.length
+ }, 'Using TEST_OVERRIDE to limit restaurants for debugging');
+ }
+
+ return metas;
+};
\ No newline at end of file
diff --git a/apps/functions/scraper/src/data/keywords.ts b/apps/functions/scraper/src/data/keywords.ts
deleted file mode 100644
index c32193f..0000000
--- a/apps/functions/scraper/src/data/keywords.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { DishType } from '@devolunch/shared';
-
-import fishes from './keywords/fishes.js';
-import meats from './keywords/meats.js';
-import vegan from './keywords/vegan.js';
-import vegetarian from './keywords/vegetarian.js';
-
-interface Keyword {
- type: DishType;
- keywords: string[];
-}
-
-export const keywordGroups: Keyword[] = [
- {
- type: 'fish',
- keywords: fishes,
- },
- {
- type: 'meat',
- keywords: meats,
- },
- {
- type: 'vegan',
- keywords: vegan,
- },
- {
- type: 'veg',
- keywords: vegetarian,
- },
-];
diff --git a/apps/functions/scraper/src/data/keywords/fishes.ts b/apps/functions/scraper/src/data/keywords/fishes.ts
deleted file mode 100644
index 46dd0ec..0000000
--- a/apps/functions/scraper/src/data/keywords/fishes.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-export default [
- 'fish',
- 'abborre',
- 'alaska pollock',
- 'ansjovis',
- 'ariopsis felis',
- 'bergtunga',
- 'blå gurami',
- 'bonito',
- 'braxen',
- 'böckling',
- 'drakfisk',
- 'fisk',
- 'fjärsing',
- 'flundra',
- 'fugu',
- 'gräskarp',
- 'guldsparid',
- 'gädda',
- 'gös',
- 'hajmal',
- 'harr',
- 'havskatt',
- 'hoki',
- 'hundhaj',
- 'hälleflundra',
- 'karp',
- 'kedjepickerell',
- 'kolja',
- 'kummel',
- 'lax',
- 'litopenaeus vannamei',
- 'lutfisk',
- 'långa',
- 'makrill',
- 'mangrovesnapper',
- 'marulk',
- 'mulle',
- 'musslor',
- 'mört',
- 'nors',
- 'ostron',
- 'pangasiusmal',
- 'pigghaj',
- 'piggvar',
- 'regnbåge',
- 'ruda',
- 'räka',
- 'räkor',
- 'röd snapper',
- 'röding',
- 'rödspätta',
- 'rödtunga',
- 'sandskädda',
- 'sardin',
- 'sej',
- 'sik',
- 'sill',
- 'sjurygg',
- 'sjötunga',
- 'skrubbskädda',
- 'slätvar',
- 'spätta',
- 'strömming',
- 'sutare',
- 'svärdfisk',
- 'tilapia',
- 'tjockläppad multe',
- 'tonfisk',
- 'torsk',
- 'vitling',
- 'öring',
-];
diff --git a/apps/functions/scraper/src/data/keywords/meats.ts b/apps/functions/scraper/src/data/keywords/meats.ts
deleted file mode 100644
index 7aa8694..0000000
--- a/apps/functions/scraper/src/data/keywords/meats.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-export default [
- 'bacon',
- 'biff',
- 'blod',
- 'bog',
- 'bogblad',
- 'bogbladsplatta',
- 'bogrulle',
- 'bogstek',
- 'bringa',
- 'bringfäste',
- 'bringspets',
- 'broskkam',
- 'bräss',
- 'charkuterier',
- 'entrecote',
- 'entrecôte',
- 'fjälster',
- 'flankstek',
- 'flappstek',
- 'flintastek',
- 'fläsk',
- 'fläsklägg',
- 'fransyska',
- 'gris',
- 'grisfötter',
- 'grytbitar',
- 'halsbit',
- 'huvud',
- 'högrev',
- 'innanlår',
- 'innerfilé',
- 'karré',
- 'kind',
- 'klubba',
- 'kotlett',
- 'kyckling',
- 'lamm',
- 'lammsadel',
- 'lever',
- 'luffarbiff',
- 'lår',
- 'lövbiff',
- 'märgben',
- 'njure',
- 'njurtapp',
- 'oxe',
- 'oxtartar',
- 'pluma',
- 'racks',
- 'revben',
- 'rostbiff',
- 'rostlock',
- 'ryggbiff',
- 'sadel',
- 'sekreto',
- 'skinka',
- 'skomakarbit',
- 'spindelstek',
- 'späck och ister',
- 'svans',
- 'talg',
- 'tomahawk',
- 'trippelstek',
- 'tunga',
- 'tunnbringa',
- 'tupp',
- 'vinge',
- 'ytterfile',
- 'ytterfile',
- 'ytterfilé',
- 'ytterfilé',
- 'ytterlår',
-];
diff --git a/apps/functions/scraper/src/data/keywords/vegan.ts b/apps/functions/scraper/src/data/keywords/vegan.ts
deleted file mode 100644
index d7d7651..0000000
--- a/apps/functions/scraper/src/data/keywords/vegan.ts
+++ /dev/null
@@ -1 +0,0 @@
-export default ['vegan'];
diff --git a/apps/functions/scraper/src/data/keywords/vegetarian.ts b/apps/functions/scraper/src/data/keywords/vegetarian.ts
deleted file mode 100644
index cf680a9..0000000
--- a/apps/functions/scraper/src/data/keywords/vegetarian.ts
+++ /dev/null
@@ -1 +0,0 @@
-export default ['vegetarisk', 'vegetarian'];
diff --git a/apps/functions/scraper/src/index.ts b/apps/functions/scraper/src/index.ts
index 88e751f..073031e 100644
--- a/apps/functions/scraper/src/index.ts
+++ b/apps/functions/scraper/src/index.ts
@@ -1,61 +1,2 @@
-import puppeteer from 'puppeteer';
-import { Storage } from '@google-cloud/storage';
-import * as ff from '@google-cloud/functions-framework';
-import path from 'path';
-import { fileURLToPath } from 'url';
-
-import { createConfig } from './config.js';
-import { translateRestaurants } from './utils/translator.js';
-import { getRestaurantFilePaths, scrapeRestaurant } from './scraper.js';
-import { Scrape } from '@devolunch/shared';
-
-const RESTAURANTS_PATH = './restaurants';
-
-export const BUCKET_NAME = 'devolunchv2';
-export const config = createConfig();
-export const storage = new Storage({
- projectId: 'devolunch',
-});
-
-ff.http('scrape', async (_: ff.Request, res: ff.Response) => {
- const browser = await puppeteer.launch({
- args: !config.development ? ['--disable-gpu'] : [],
- headless: 'new',
- });
-
- const __filename = fileURLToPath(import.meta.url);
- const __dirname = path.dirname(__filename);
- const dir = path.join(__dirname, RESTAURANTS_PATH);
-
- const files = await getRestaurantFilePaths(dir);
-
- const restaurants = [];
- for (const file of files) {
- restaurants.push(await scrapeRestaurant(browser, dir, file));
- }
-
- await browser.close();
-
- // used to debug scraper
- const filesOverride = config.filesOverride?.split(',');
- if (filesOverride?.length) {
- res.sendStatus(200);
- return;
- }
-
- // if any of the dishes contains the word 'stängt', we assume the restaurant is closed
- const scrape: Scrape = {
- date: new Date(),
- restaurants: await translateRestaurants(restaurants),
- };
-
- if (!scrape?.restaurants?.length) {
- res.sendStatus(500);
- return;
- }
-
- const bucket = storage.bucket(BUCKET_NAME);
- await bucket.file('scrape.json').save(JSON.stringify(scrape));
-
- res.sendStatus(200);
-});
+// Main entry point - all functionality consolidated in scraper.ts
+export * from './scraper.js';
\ No newline at end of file
diff --git a/apps/functions/scraper/src/parsers/aiResponse.ts b/apps/functions/scraper/src/parsers/aiResponse.ts
new file mode 100644
index 0000000..d11a722
--- /dev/null
+++ b/apps/functions/scraper/src/parsers/aiResponse.ts
@@ -0,0 +1,105 @@
+import { logger } from '@devolunch/shared/logger/node';
+import type { MenuExtractionResult } from '../types/index.js';
+
+/**
+ * Parses AI response text to extract menu data
+ */
+export const parseAIResponse = (responseText: string): MenuExtractionResult => {
+ try {
+ // Try to extract JSON from the response
+ const jsonMatch = responseText.match(/\{[\s\S]*\}/);
+ if (!jsonMatch) {
+ throw new Error('No JSON found in response');
+ }
+
+ const parsed = JSON.parse(jsonMatch[0]);
+
+ // Validate the response structure
+ if (!parsed.dishes || !Array.isArray(parsed.dishes)) {
+ throw new Error('Invalid dishes array in response');
+ }
+
+ // Validate each dish
+ const validDishes = parsed.dishes.filter((dish: { title?: string; type?: string }) =>
+ dish.title && typeof dish.title === 'string' && dish.type
+ );
+
+ return {
+ dishes: validDishes,
+ confidence: Math.max(0, Math.min(1, parsed.confidence || 0.5)),
+ reasoning: parsed.reasoning || 'No reasoning provided',
+ lunchInfo: parsed.lunchInfo || undefined,
+ };
+ } catch (error) {
+ logger.error({ err: error }, 'Failed to parse AI response');
+ return {
+ dishes: [],
+ confidence: 0,
+ reasoning: `Parse error: ${error}`,
+ };
+ }
+};
+
+/**
+ * Normalizes AI output to repository schema and adds safety guards
+ */
+export const normalizeResult = (result: MenuExtractionResult): MenuExtractionResult => {
+ const dinnerCues =
+ /(kväll|kvällsmeny|afton|middag|à\s*la\s*carte|after\s*work|\bAW\b|helgmeny|från\s*(1[7-9]|2[0-3])|\b1[7-9][:.,]|\b2[0-3][:.,])/i;
+ const nonMainCues = /(förrätt|efterrätt|dessert|tillval|smårätter|snacks|dryck)/i;
+ const headingCues = /(^lunchmeny$|^veck[aå]ns?\s*(lunch|meny)$)/i;
+ // Filter out incomplete dish labels and informational text
+ const incompleteLabelCues = /(^veckans\s+(vegetarisk|fisk|kött|vego)$|^dagens\s+(vegetarisk|fisk|kött|vego)$|går\s+(utmärkt|bra)\s+att\s+få\s+vegetarisk|alla\s+dagens|vi\s+serverar|ingår\s+i\s+priset)/i;
+
+ const mapType = (t: string, title: string): 'meat' | 'fish' | 'veg' | 'misc' | 'vegan' => {
+ const lt = String(t).toLowerCase();
+ // Trust AI's classification first - it's better at understanding context
+ if (lt === 'vegan') return 'vegan';
+ if (lt === 'veg' || lt === 'vegetarian') return 'veg';
+ if (lt === 'fish' || lt === 'seafood') return 'fish';
+ if (lt === 'meat') return 'meat';
+
+ // As a fallback, attempt heuristic detection
+ const titleLower = title.toLowerCase();
+ const fishWords = ['fisk', 'lax', 'tonfisk', 'torsk', 'räkor', 'kräftor', 'skaldjur', 'fish', 'salmon', 'tuna'];
+ const vegWords = ['vegetarisk', 'vegansk', 'vegan', 'tofu', 'quinoa', 'falafel', 'svamp', 'böna', 'bean'];
+
+ if (fishWords.some(word => titleLower.includes(word))) return 'fish';
+ if (vegWords.some(word => titleLower.includes(word))) return 'veg';
+
+ return 'meat'; // Default to meat if unclear
+ };
+
+ const validDishes = result.dishes
+ .filter((dish) => {
+ const title = (dish.title || '').trim();
+
+ // Skip empty or very short titles
+ if (!title || title.length < 3) return false;
+
+ // Skip dinner/evening items based on title
+ if (dinnerCues.test(title)) return false;
+
+ // Skip non-main dishes
+ if (nonMainCues.test(title)) return false;
+
+ // Skip menu headings that were extracted as dishes
+ if (headingCues.test(title)) return false;
+
+ // Skip incomplete dish labels and informational text
+ if (incompleteLabelCues.test(title)) return false;
+
+ return true;
+ })
+ .map((dish) => ({
+ ...dish,
+ title: (dish.title || '').trim(),
+ type: mapType(dish.type || '', dish.title || ''),
+ }));
+
+ return {
+ ...result,
+ dishes: validDishes,
+ confidence: Math.max(0, Math.min(1, result.confidence)),
+ };
+};
\ No newline at end of file
diff --git a/apps/functions/scraper/src/processors/contentFilter.ts b/apps/functions/scraper/src/processors/contentFilter.ts
new file mode 100644
index 0000000..4edff68
--- /dev/null
+++ b/apps/functions/scraper/src/processors/contentFilter.ts
@@ -0,0 +1,43 @@
+
+/**
+ * Filters out evening/dinner content from restaurant pages to focus on lunch items
+ */
+export const filterLunchContent = (text: string): string => {
+ const lines = text.split('\n');
+ const filteredLines: string[] = [];
+ let inEveningSection = false;
+
+ for (const line of lines) {
+ const lowerLine = line.toLowerCase().trim();
+
+ // Detect start of evening sections
+ if (
+ lowerLine.includes('kvällsmeny') ||
+ lowerLine.includes('evening menu') ||
+ lowerLine.includes('dinner menu') ||
+ lowerLine.includes('à la carte')
+ ) {
+ inEveningSection = true;
+ continue;
+ }
+
+ // Detect start of lunch sections
+ if (
+ (lowerLine.includes('lunch') || lowerLine.includes('veckans')) &&
+ !lowerLine.includes('kväll') &&
+ !lowerLine.includes('dinner')
+ ) {
+ inEveningSection = false;
+ }
+
+ // Skip evening content
+ if (inEveningSection) {
+ continue;
+ }
+
+ // Include lunch content and general content (when not in evening section)
+ filteredLines.push(line);
+ }
+
+ return filteredLines.join('\n');
+};
diff --git a/apps/functions/scraper/src/processors/pdf.ts b/apps/functions/scraper/src/processors/pdf.ts
new file mode 100644
index 0000000..6f729b6
--- /dev/null
+++ b/apps/functions/scraper/src/processors/pdf.ts
@@ -0,0 +1,96 @@
+// Import the core pdf-parse function directly to avoid debug code that reads test fixtures
+import pdf from 'pdf-parse/lib/pdf-parse.js';
+import { logger } from '@devolunch/shared/logger/node';
+
+/**
+ * Cleans PDF text extraction to fix common OCR errors
+ */
+const cleanPdfText = (text: string): string => {
+ return text
+ // Fix common PDF ligature/encoding issues
+ .replace(/([a-zåäö])0([a-zåäö])/g, '$1fi$2') // Generic "0" -> "fi" in middle of words
+ .replace(/\b0([a-zåäö])/g, 'fi$1') // "0" at word start -> "fi"
+ // Clean up extra spaces
+ .replace(/\s+/g, ' ')
+ .trim();
+};
+
+/**
+ * Extracts PDF content with robust error handling and fallback methods
+ */
+export const extractPdfContent = async (pdfUrl: string): Promise => {
+ try {
+ logger.info({ pdfUrl }, 'Fetching PDF content');
+ const response = await fetch(pdfUrl);
+ if (!response.ok) {
+ throw new Error(`Failed to fetch PDF: ${response.status}`);
+ }
+ logger.info(
+ { status: response.status, contentType: response.headers.get('content-type') || undefined },
+ 'PDF response metadata',
+ );
+
+ const buffer = await response.arrayBuffer();
+ const pdfBuffer = Buffer.from(buffer);
+ logger.debug({ size: pdfBuffer.byteLength }, 'PDF buffer size');
+
+ // Try standard PDF text extraction first
+ try {
+ const pdfData = await pdf(pdfBuffer);
+ logger.debug({ length: pdfData.text.length }, 'PDF text extraction length');
+
+ // Check if we got meaningful text (more than just whitespace/minimal chars)
+ const meaningfulText = pdfData.text.trim().replace(/\s+/g, ' ');
+ if (meaningfulText.length > 50) {
+ logger.info('Using standard PDF text extraction');
+ return cleanPdfText(pdfData.text);
+ } else {
+ logger.info({ length: meaningfulText.length }, 'PDF text insufficient; trying pdfjs-dist');
+ }
+ } catch (pdfParseError) {
+ logger.warn({ err: pdfParseError }, 'Standard PDF parsing failed; trying pdfjs-dist');
+ }
+
+ // Fallback to pdfjs-dist for image-based PDFs
+ try {
+ logger.info('Using PDF.js text content extraction for image-based PDF');
+
+ const pdfjsLib = await import('pdfjs-dist/legacy/build/pdf.mjs');
+ const loadingTask = pdfjsLib.getDocument({ data: new Uint8Array(pdfBuffer) });
+ const pdfDocument = await loadingTask.promise;
+
+ logger.info({ pages: pdfDocument.numPages }, 'PDF page count');
+
+ let extractedText = '';
+ const pagesToProcess = Math.min(pdfDocument.numPages, 3);
+
+ for (let pageNum = 1; pageNum <= pagesToProcess; pageNum++) {
+ logger.debug({ pageNum, pagesToProcess }, 'Processing PDF page with PDF.js');
+
+ const page = await pdfDocument.getPage(pageNum);
+ const textContent = await page.getTextContent();
+
+ // Combine all text items
+ const pageText = textContent.items
+ .map((item) => ('str' in item ? item.str : ''))
+ .join(' ');
+ extractedText += pageText + '\n';
+ }
+
+ logger.debug({ length: extractedText.length }, 'PDF.js extracted characters');
+ logger.debug({ preview: extractedText.substring(0, 200) }, 'PDF.js content preview');
+
+ if (extractedText.trim().length > 50) {
+ return cleanPdfText(extractedText);
+ }
+ } catch (pdfjsError) {
+ logger.error({ err: pdfjsError }, 'PDF.js extraction failed');
+ }
+
+ logger.info('Text extraction failed; Vision API may be needed');
+ return '';
+ } catch (error) {
+ logger.error({ err: error }, 'Failed to extract PDF content');
+ return '';
+ }
+};
diff --git a/apps/functions/scraper/src/prompts/menuExtraction.ts b/apps/functions/scraper/src/prompts/menuExtraction.ts
new file mode 100644
index 0000000..f552a86
--- /dev/null
+++ b/apps/functions/scraper/src/prompts/menuExtraction.ts
@@ -0,0 +1,157 @@
+import type { RestaurantMetaProps } from '@devolunch/shared';
+import type { PageContent } from '../types/index.js';
+import { filterLunchContent } from '../processors/contentFilter.js';
+
+/**
+ * Creates comprehensive menu extraction instructions for AI models
+ */
+export const createMenuExtractionInstructions = (weekdaySv: string, locationFilter?: string): string => {
+ // Calculate current Swedish week number (ISO week) to handle odd/even week menus
+ const currentDate = new Date();
+ // ISO week calculation - Sweden uses ISO 8601 week numbering
+ const thursday = new Date(currentDate.getTime() + (3 - ((currentDate.getDay() + 6) % 7)) * 86400000);
+ const yearOfThursday = thursday.getFullYear();
+ const firstThursday = new Date(yearOfThursday, 0, 4);
+ const weekNumber = Math.floor(((thursday.getTime() - firstThursday.getTime()) / 86400000 + 1) / 7) + 1;
+ const isOddWeek = weekNumber % 2 === 1;
+ const locationInstruction = locationFilter
+ ? `LOCATION_FILTER: ${locationFilter}
+- CRITICAL: This restaurant has multiple locations. Extract ONLY menu items for the location "${locationFilter}". Look for section headers, location names, or geographical references that match this location.
+- If menu items are organized by location sections (e.g., "Gängtappen", "Dockan", "Kvartetten", "Hyllie"), include only items from the "${locationFilter}" section.
+- Ignore menu items from other locations or branches.
+`
+ : '';
+
+ return `${locationInstruction}Extract ALL lunch dishes from LUNCH SECTIONS ONLY.
+CRITICAL: Do not stop after finding a few dishes - extract EVERY dish that meets the criteria below.
+
+WHAT TO INCLUDE - MANDATORY EXTRACTION:
+• PRIORITY 1: ANY "Veckans" items - ALWAYS extract these weekly specials (remove "Veckans" prefix from title)
+• PRIORITY 2: Daily dishes for TODAY (${weekdaySv}) ONLY - NEVER extract dishes from other weekdays
+• PRIORITY 3: Vegetarian/vegan options that are available today (labeled "Vegetarisk", "Vegan", etc.)
+• PRIORITY 4: "Always available" items (labeled "Alltid", "Always", "Permanent menu", etc.) with lunch pricing
+• PRIORITY 5: Items with lunch pricing (100-200kr) that are not weekday-specific
+• PRIORITY 6: For restaurants with permanent menus (like bowl restaurants, pizza places, etc.): ALL main dishes/bowls/entrees that appear to be full meals, even without explicit pricing or lunch labeling
+• CRITICAL: ONLY extract dishes that ACTUALLY APPEAR on the menu - DO NOT add common lunch items if they are not explicitly listed
+
+CRITICAL WEEKDAY FILTERING RULES:
+• TODAY IS ${weekdaySv.toUpperCase()} - extract dishes labeled for ${weekdaySv}
+• MULTI-DAY RANGES: If dishes are labeled for date ranges that include today (e.g., "Måndag-Onsdag", "Monday-Wednesday"), EXTRACT THEM
+• SINGLE DAY EXCLUSION: NEVER extract dishes from other single weekdays: ${['måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag'].filter(day => day !== weekdaySv.toLowerCase()).join(', ')}
+• If you see "Måndag: [dish]" and today is tisdag, DO NOT extract that dish
+• EXCEPTION FOR PERMANENT MENUS: If the restaurant appears to have a permanent menu (like bowl restaurants, pizza places, sushi places) with no weekday labeling, extract ALL menu items regardless of weekday rules
+• If you see weekday schedules, extract from the ${weekdaySv} section AND any range that includes ${weekdaySv}
+• EXCEPTION: Always extract "Vegetarisk/Vegetarian", "Vegan", "Alltid/Always" items even if not weekday-specific
+• Weekly specials ("Veckans") are available every day - always extract these
+
+CRITICAL VECKANS RULE:
+• If you see "Veckans" followed by a COMPLETE dish name and description, EXTRACT IT
+• "Veckans Moo Tod [with full description]" = extract as "Moo Tod - [full description]"
+• "Veckans fisk: Lax med dillsås" = extract as "Lax med dillsås"
+• DO NOT extract labels like "Veckans vegetariska" or "Veckans fisk" if they appear WITHOUT the actual dish name and description
+• Only extract "Veckans X" items when X is followed by the complete dish details (ingredients, preparation, etc.)
+
+EXTRACTION BOUNDARIES - HARD STOP RULES:
+• IMMEDIATELY STOP reading when you see "Bärstronomi" - extract NOTHING after this word
+• IMMEDIATELY STOP reading when you see "Bar" as a section header
+• STOP at any pricing over 200kr (these are bar/dinner items)
+• STOP when you see evening section markers: "kväll", "evening", "À la carte"
+
+LUNCH SECTION IDENTIFICATION:
+• ONLY extract from content that appears BEFORE "Bärstronomi"
+• Look for clear lunch markers: "Lunchmeny", "Dagens", "Veckans"
+• Extract from weekday schedules (Måndag-Fredag)
+• Extract lunch-priced items (100-200kr range)
+
+CRITICAL RULE: Once you encounter "Bärstronomi" or similar, STOP completely - do not extract anything that appears after it, even if it looks like lunch food
+
+WEEK HANDLING:
+Current week: ${weekNumber} (${isOddWeek ? 'ODD' : 'EVEN'} week)
+• If restaurant has odd/even week menus, extract ONLY from the ${isOddWeek ? 'ODD' : 'EVEN'} week menu
+• Do NOT mix dishes from both week types
+
+WHAT TO EXCLUDE - ZERO TOLERANCE:
+• EVERYTHING after "Bärstronomi" header - STOP reading completely
+• EVERYTHING after "Bar" section headers
+• ANY items over 200kr (bar/dinner pricing) UNLESS they are "Always available" items under 200kr
+• Appetizers, desserts, drinks sections
+• Evening menus: "Kvällsmeny", "À la carte"
+• Duplicates of items already found in lunch sections
+• Weekend dishes (lördag, söndag) - these are never extracted
+• Dishes specifically labeled for other weekdays (e.g., "Tisdag:", "Onsdag:") - BUT ALWAYS INCLUDE vegetarian/vegan dishes regardless of their weekday labels
+• CRITICAL EXCEPTION: ALWAYS extract "Vegetarisk/Vegetarian", "Vegan", "Alltid/Always" items even if they span multiple weekdays (e.g., "Mån-Ons", "Måndag-Onsdag")
+• Informational text/notes that are NOT actual dishes (e.g., "Alla dagens går utmärkt att få vegetariskt", "Vi serverar", "Ingår i priset", general information about the restaurant or menu policies)
+• Incomplete dish labels without actual dish names (e.g., "Veckans vegetariska", "Veckans fisk", "Dagens kött" when appearing alone without the complete dish description)
+
+REMEMBER: "Bärstronomi" = FULL STOP. Extract ALL lunch items that appear BEFORE this section.
+
+ANTI-HALLUCINATION RULES - CRITICAL:
+• NEVER add Caesar sallad, Moo Tod, or other common dishes if they are not explicitly on this restaurant's menu
+• NEVER use your training data to "fill in" typical lunch items
+• ONLY extract dishes that are actually written in the provided content
+• Extract ALL available lunch dishes - there is no minimum or maximum number required
+• When in doubt, extract nothing rather than hallucinate dishes
+
+LUNCH METADATA EXTRACTION:
+• ALSO extract general lunch information that applies to all dishes:
+• Serving times: Look for lunch hours in BOTH images and text context:
+ - "Lunch serveras", "Lunch 11:30-14:00", "Öppet", opening hours
+ - Daily schedules like "Onsdag: 11:30-21:00", "Wednesday: 11:30-21:00"
+ - IMPORTANT: Use EXACT times found - if restaurant opens "11:30-21:00", use "11:30-21:00", NOT "11:30-14:00"
+ - Only modify times if explicitly labeled as lunch-only hours
+• Included items: Look for "ingår", "inkluderat", "sallad och bröd ingår", "kaffe ingår", etc.
+• Special notes: Look for "buffé", "hämtlunch", "takeaway", "vegetariska alternativ", etc.
+
+OUTPUT FORMAT:
+• Include full dish descriptions with ingredients
+• Type: "meat" (includes poultry), "fish" (includes seafood), "veg" (includes vegan)
+• Use Swedish text only - ignore English translations
+• Extract complete information, not just dish names
+• Include lunch metadata when available
+
+FINAL INSTRUCTION: Extract EVERY single dish that meets the criteria above. Do not stop after finding a few dishes - restaurants may have 10+ different options available.
+SPECIAL NOTE: Pay extra attention to:
+1. Fish dishes (salmon, tuna, etc.) - these are legitimate lunch options and should be included
+2. Vegetarian dishes (marked as "Vegetarisk", "Vego", "Veg", or containing only plant-based ingredients) - NEVER skip these
+3. Bowl restaurants often have 8-12 different bowl options
+4. Multi-course restaurants often have both meat and vegetarian options for the same day
+
+{
+ "dishes": [{"title":"...","type":"veg|fish|meat"}],
+ "confidence": 0.0,
+ "reasoning": "...",
+ "lunchInfo": {
+ "servingTimes": "11:30-14:00" or null,
+ "includedItems": ["sallad", "bröd", "smör"] or null,
+ "specialNotes": "Buffé med vegetariska alternativ" or null
+ }
+}`;
+};
+
+/**
+ * Creates the full prompt for menu extraction
+ */
+export const createMenuExtractionPrompt = (
+ pageContent: PageContent,
+ restaurantMeta: RestaurantMetaProps,
+ locationFilter?: string,
+): string => {
+ const weekdaySv = new Date().toLocaleDateString('sv-SE', { weekday: 'long' });
+ const isoDate = new Date().toISOString().slice(0, 10);
+
+ const instructions = createMenuExtractionInstructions(weekdaySv, locationFilter);
+
+ // Filter out evening menu content before sending to AI (only if content cleaning is enabled)
+ const useContentCleaner = restaurantMeta.useContentCleaner ?? true; // Default to true if not specified
+ const filteredText = useContentCleaner ? filterLunchContent(pageContent.text) : pageContent.text;
+
+ return `TODAY_LOCAL: ${isoDate} (${weekdaySv})
+RESTAURANT: ${restaurantMeta.title}
+SOURCE_URL: ${pageContent.url}
+PAGE_TEXT:
+"""
+${filteredText.slice(0, 30000)}
+"""
+
+${instructions}`;
+};
\ No newline at end of file
diff --git a/apps/functions/scraper/src/restaurants.ts b/apps/functions/scraper/src/restaurants.ts
new file mode 100644
index 0000000..0470117
--- /dev/null
+++ b/apps/functions/scraper/src/restaurants.ts
@@ -0,0 +1,533 @@
+import { RestaurantMetaProps } from '@devolunch/shared';
+
+export const restaurants: RestaurantMetaProps[] = [
+ {
+ title: 'Hyllie Bistro',
+ url: 'https://www.hylliebryggeri.se/meny',
+ imageUrl:
+ 'https://static.wixstatic.com/media/97d700_51961be0108c43cdb423ec5947b3096b~mv2.jpg/v1/crop/x_0,y_0,w_7165,h_4912/fill/w_882,h_604,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/Bistro.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/dFEmStJASNgim5er5',
+ coordinate: {
+ lat: 55.6122995,
+ lon: 12.9990657,
+ },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Benne Pastabar',
+ url: 'https://bennepastabar.se/',
+ imageUrl: 'https://bennepastabar.se/wp-content/themes/benne/images/benne-pastabar-order.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/CE6fKHpjB2wcEUcq7', // Using first location as default
+ coordinate: { lat: 55.60313716015807, lon: 13.003559388316905 }, // Using first location as default
+ useContentCleaner: false,
+ multiLocation: {
+ type: 'shared',
+ locations: [
+ {
+ title: 'Hansa',
+ googleMapsUrl: 'https://maps.app.goo.gl/CE6fKHpjB2wcEUcq7',
+ coordinate: { lat: 55.6031381, lon: 13.0035595 },
+ },
+ {
+ title: 'Västra hamnen',
+ googleMapsUrl: 'https://maps.app.goo.gl/xPS7Y1yLKt3HGKH4A',
+ coordinate: { lat: 55.6107112, lon: 12.9488093 },
+ },
+ ],
+ },
+ },
+ {
+ title: 'Bistro Royal',
+ url: 'https://bistroroyal.se/dagens-ratt/',
+ imageUrl: 'https://cdn42.gastrogate.com/files/29072/bistroroyal-bistro-1-1.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/hSqYWPKgWVbSRj2s7',
+ coordinate: { lat: 55.6088212, lon: 13.0009603 },
+ },
+ {
+ title: 'Kontrast Västra Hamnen',
+ url: 'https://www.kontrastrestaurang.se/menu/vastra-hamnen?tab=lunch',
+ imageUrl: 'https://cdn.kontrast.swindila.com/kontrastimages/vastrahamnenmenu.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/sAfGLCky4RcSUZKw5',
+ coordinate: { lat: 55.6100655, lon: 12.9737029 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Lokal 17',
+ url: 'https://lokal17.se/',
+ imageUrl: 'https://lokal17.se/app/uploads/sites/2/2018/01/bg-22.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/eMsNxGK743oQVj8D9',
+ coordinate: { lat: 55.6121117, lon: 12.9953007 },
+ },
+ {
+ title: 'MiaMarias',
+ url: 'https://miamarias.nu/lunch/',
+ imageUrl:
+ 'https://i0.wp.com/www.takemetosweden.be/wp-content/uploads/2019/07/MiaMarias-Malm%C3%B6-1.png?w=500&ssl=1',
+ googleMapsUrl: 'https://goo.gl/maps/RrRffZzgebREQpwB7',
+ coordinate: { lat: 55.6134471, lon: 12.9921145 },
+ },
+ // // {
+ // // title: 'Namu',
+ // // url: 'https://namu.nu/meny/',
+ // // imageUrl: 'https://namu.nu/wp-content/uploads/2017/05/Namul-darker2-3k-min.jpg',
+ // // googleMapsUrl: 'https://goo.gl/maps/XtFUKSvmDQTUpR146',
+ // // coordinate: { lat: 55.6052051, lon: 12.9975172 },
+ // // },
+ {
+ title: 'Niagara',
+ url: 'https://restaurangniagara.se/lunch/',
+ imageUrl: 'https://restaurangniagara.se/wp-content/uploads/2024/10/NIAGARA-27.webp',
+ googleMapsUrl: 'https://goo.gl/maps/5SAyzPUHhb2xrNXRA',
+ coordinate: { lat: 55.6087223, lon: 12.9941398 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Quanbyquan',
+ url: 'https://quanbyquan.se/',
+ imageUrl: 'https://quanbyquan.se/wp-content/uploads/2019/09/Quan_Recept_08-1.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/5xyoBjWuU9vUcD6V8',
+ coordinate: { lat: 55.605522, lon: 12.9980674 },
+ },
+ {
+ title: 'Saltimporten',
+ url: 'https://www.saltimporten.com/',
+ imageUrl: 'https://www.saltimporten.com/media/IMG_6253-512x512.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/9rn3svDPeGUDaeXUA',
+ coordinate: { lat: 55.616089, lon: 12.9971181 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Slagthuset',
+ url: 'https://slagthuset.se/restaurangen/',
+ imageUrl:
+ 'https://www.slagthuset.se/_next/image?url=https%3A%2F%2Fwp.slagthuset.se%2Fwp-content%2Fuploads%2F2023%2F02%2FSodra-Hallen01-1-1500x1000.jpg&w=3840&q=80',
+ googleMapsUrl: 'https://goo.gl/maps/ZMLMAHi8XhVss2At5',
+ coordinate: { lat: 55.6110323, lon: 13.0033717 },
+ },
+ {
+ title: 'Smak',
+ url: 'https://gastrogate.com/lunch/print/6005',
+ imageUrl: 'https://smak.info/wp-content/uploads/2022/05/IMG_2946-kall-1024x768.png',
+ googleMapsUrl: 'https://goo.gl/maps/5NrVf9rA3gocZLvd7',
+ coordinate: { lat: 55.5950556, lon: 12.9992295 },
+ },
+ {
+ title: 'Spill',
+ url: 'https://restaurangspill.se/',
+ imageUrl: 'https://www.restaurangspill.se/_next/image?url=%2Fimages%2Fv2%2FSPILL_14.jpg&w=1920&q=75',
+ googleMapsUrl: 'https://goo.gl/maps/bZ8yDN3PD3fjvNGw5', // Using first location as default
+ coordinate: { lat: 55.6127354, lon: 12.9884119 }, // Using first location as default
+ multiLocation: {
+ type: 'filtered',
+ locations: [
+ {
+ title: 'Gängtappen',
+ locationFilter: 'Gängtappen|Dockan',
+ googleMapsUrl: 'https://goo.gl/maps/bZ8yDN3PD3fjvNGw5',
+ coordinate: { lat: 55.6127354, lon: 12.9884119 },
+ },
+ {
+ title: 'Kvartetten',
+ locationFilter: 'Kvartetten|Hyllie',
+ googleMapsUrl: 'https://maps.app.goo.gl/TNctkWiKh6FpzHAP7',
+ coordinate: { lat: 55.6117385, lon: 12.9301944 },
+ },
+ ],
+ },
+ },
+ {
+ title: 'Köket lu',
+ url: 'https://www.koket.lu/malmo/lunch',
+ imageUrl:
+ 'https://static.thatsup.co/content/img/place/malmo/ko/3946013a-f19b-11e9-814c-f23c919fea3e/user-photo/7c8aa451.jpg?1706718174',
+ googleMapsUrl: 'https://maps.app.goo.gl/r89Vog772eqdu3mt7',
+ coordinate: { lat: 55.5993441, lon: 12.9977983 },
+ },
+ {
+ title: 'Marvin',
+ url: 'https://www.marvinofmalmo.com/',
+ imageUrl: 'https://highfiveskane.se/wp-content/uploads/2022/05/marvin-4-scaled.jpeg',
+ googleMapsUrl: 'https://maps.app.goo.gl/rjKhvkHbwfdoC62g9',
+ coordinate: { lat: 55.5998692, lon: 12.9991679 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Two Forks',
+ url: 'https://www.twoforks.se/lunch',
+ imageUrl:
+ 'https://images.squarespace-cdn.com/content/v1/5c6fc5858155121249a4c49f/d9867018-aaa7-4d7c-8a5b-b5f666277406/%C2%A9jensnordstromtwoforks0027.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/GKATv8jSGjbAKfYt5',
+ coordinate: { lat: 55.6073278, lon: 12.9920499 },
+ },
+ {
+ title: 'Välfärden',
+ url: 'https://valfarden.nu/dagens-lunch/',
+ imageUrl: 'https://valfarden.nu/wp-content/uploads/2015/01/hylla.jpg',
+ googleMapsUrl: 'https://goo.gl/maps/cLAKuD2B95N8bqr19',
+ coordinate: { lat: 55.6112257, lon: 12.9943631 },
+ },
+ {
+ title: 'Restaurang Bullen',
+ url: 'https://www.bullen.nu/sv/lunch/',
+ imageUrl: 'https://www.bullen.nu/media/mz1djpbh/lunch_mag_3379.jpg?height=810px',
+ googleMapsUrl: 'https://maps.app.goo.gl/3VCjtsGxBm9VHDc97',
+ coordinate: { lat: 55.5999602, lon: 12.9988244 },
+ },
+ {
+ title: 'Spoonery',
+ url: 'https://www.spoonery.se/restaurang/gamla-vaster', // Using working location URL
+ imageUrl: 'https://www.spoonery.se/wp-content/uploads/2024/11/241015_Spoonery__Slotts_01_NY.webp',
+ googleMapsUrl: 'https://maps.app.goo.gl/1dxLU2ZUpH3ggFQg8', // Using first location as default
+ coordinate: { lat: 55.59717, lon: 12.97902 }, // Using first location as default
+ useContentCleaner: true, // Enable content cleaner for all locations
+ multiLocation: {
+ type: 'separate',
+ locations: [
+ {
+ title: 'Sankt Knut',
+ url: 'https://www.spoonery.se/restaurang/st-knut/',
+ googleMapsUrl: 'https://maps.app.goo.gl/2z6FT53UdTHH8A4J7',
+ coordinate: { lat: 55.5968355, lon: 13.011534 },
+ },
+ {
+ title: 'Hyllie',
+ url: 'https://www.spoonery.se/restaurang/hyllie',
+ googleMapsUrl: 'https://maps.app.goo.gl/7XZkE58A1PPujvrr7',
+ coordinate: { lat: 55.5613039, lon: 12.9737268 },
+ },
+ ],
+ },
+ },
+ {
+ title: 'La Fonderie',
+ url: 'https://www.lafonderie.se/lelunch',
+ imageUrl: 'https://tse1.mm.bing.net/th/id/OIP.5Df6Sz7sxETn462Iq1yXiAHaEy?pid=Api',
+ googleMapsUrl: 'https://maps.app.goo.gl/8PYHkDJe8bv2NafBA',
+ coordinate: { lat: 55.6110563, lon: 12.9889958 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Varv Malmö',
+ url: 'https://www.varvmalmo.com/menu',
+ imageUrl:
+ 'https://images.squarespace-cdn.com/content/v1/67a758574768d80eed1d0b9f/072c583d-3cfd-4756-a07d-2e506957a2ec/DSC08171-Enhanced-NR.png?format=750w',
+ googleMapsUrl: 'https://maps.app.goo.gl/UyPUzaFyW6cX8bwC9',
+ coordinate: { lat: 55.6122023, lon: 12.9908859 },
+ },
+ {
+ title: 'Sauvage',
+ url: 'https://restaurangsauvage.se/lunchmeny',
+ imageUrl: 'https://highfiveskane.se/wp-content/uploads/2024/04/sauvage-18-scaled.jpeg',
+ googleMapsUrl: 'https://maps.app.goo.gl/BgoSgesjSSxsen7s5',
+ coordinate: { lat: 55.5961483, lon: 13.0097815 },
+ },
+ {
+ title: 'Restaurang Nils',
+ url: 'https://restaurangnils.se/lunch-restaurang-malmo/',
+ imageUrl: 'https://restaurangnils.se/wp-content/uploads/sites/21/2022/10/Nils-13.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/fAxMDQardQqSSmtU8',
+ coordinate: { lat: 55.5985416, lon: 12.979711 },
+ },
+ {
+ title: 'Folk mat och möten',
+ url: 'https://folkmatmoten.se/restaurang/',
+ imageUrl: 'https://folkmatmoten.se/wp-content/uploads/2023/11/Mat4.jpeg',
+ googleMapsUrl: 'https://maps.app.goo.gl/FWwJJQrKjeEmFdtXA',
+ coordinate: {
+ lat: 55.5918325,
+ lon: 13.0194972,
+ },
+ },
+ {
+ title: 'La Bonne Vie',
+ url: 'https://labonnevie.se/',
+ imageUrl: 'https://highfiveskane.se/wp-content/uploads/2023/02/la-bonne-vie-18-1024x640.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/eGorxVpGBAobFSKC9',
+ coordinate: {
+ lat: 55.5991391,
+ lon: 12.9979327,
+ },
+ },
+ {
+ title: 'Osteria di la',
+ url: 'https://osteriadila.se/',
+ imageUrl: 'https://media.osteriadila.se/2023/03/dila1.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/eGorxVpGBAobFSKC9',
+ coordinate: {
+ lat: 55.5991391,
+ lon: 12.9979327,
+ },
+ },
+ {
+ title: 'Osteria Qui',
+ url: 'https://osteriaqui.se/meny/',
+ imageUrl: 'https://osteriaqui.se/wp-content/uploads/2022/11/osteria-mat.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/Z88vt4no56UZXS9f9',
+ coordinate: {
+ lat: 55.5966996,
+ lon: 12.969856,
+ },
+ },
+ {
+ title: 'Enoclub Osteria',
+ url: 'https://www.enoclub.se/meny',
+ imageUrl:
+ 'https://images.squarespace-cdn.com/content/v1/65e04f8287d2472b18e24357/9c0e45ea-5ca4-4e78-a7a5-ef5a84d600e8/iStock-1136638905.jpg?format=2500w',
+ googleMapsUrl: 'https://maps.app.goo.gl/WCvg7uwahvkpF6yK8',
+ coordinate: {
+ lat: 55.604698,
+ lon: 12.9972076,
+ },
+ },
+ {
+ title: 'Thap Thim',
+ url: 'https://thapthim.se/lunch',
+ imageUrl: 'https://api.thapthim.se/?imgtype=slider&store=vg&imgid=20230105163927437216001672933167.jpeg',
+ googleMapsUrl: 'https://maps.app.goo.gl/GLgqwTmwaqhCMWMdA', // Using first location as default
+ coordinate: { lat: 55.6066801, lon: 12.9928927 }, // Using first location as default
+ useContentCleaner: false,
+ multiLocation: {
+ type: 'shared',
+ locations: [
+ {
+ title: 'Västergatan',
+ googleMapsUrl: 'https://maps.app.goo.gl/GLgqwTmwaqhCMWMdA',
+ coordinate: { lat: 55.6066801, lon: 12.9928927 },
+ },
+ {
+ title: 'Västra hamnen',
+ googleMapsUrl: 'https://maps.app.goo.gl/dmiqDGpPaywiDW5V9',
+ coordinate: { lat: 55.6119766, lon: 12.9763255 },
+ },
+ ],
+ },
+ },
+ {
+ title: 'The Torso',
+ url: 'https://thetorso.se/#page-4',
+ imageUrl: 'https://thetorso.se/_assets/media/9035c7b5a7eaf4387b74a0652230937e.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/8vh13whnFucSrML26',
+ coordinate: { lat: 55.6135861, lon: 12.975145 },
+ },
+ {
+ title: 'Babusia',
+ url: 'https://babusia.se/menus/',
+ imageUrl: 'https://babusia.se/wp-content/uploads/2024/09/menus_babusia_se.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/znba1zVV3qMvC4UG6',
+ coordinate: { lat: 55.6075804, lon: 12.9865752 },
+ },
+ {
+ title: 'Elsa',
+ url: 'https://www.elsamalmo.com/menu',
+ imageUrl:
+ 'https://ftstorageprod.blob.core.windows.net/images/restaurant/ad719f49/images/7aa434b7-48bc-45f0-87a3-f0640d2f127d_m.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/LnKL7KkKfmMML4y76',
+ coordinate: { lat: 55.6068487, lon: 12.9876917 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Ruths',
+ url: 'https://ruthsmalmo.se/en/#menu',
+ imageUrl: 'https://highfiveskane.se/wp-content/uploads/2024/01/ruths-31-scaled.jpeg',
+ googleMapsUrl: 'https://maps.app.goo.gl/FhKo1ctUa9Aa67h49',
+ coordinate: { lat: 55.606242, lon: 12.9966079 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Brasserie Sture',
+ url: 'https://sture1912.com/sv/',
+ imageUrl: 'https://interni.se/wp-content/uploads/2023/09/L8A5740-1.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/UtAQQ3sGfCyCSF5S7',
+ coordinate: { lat: 55.606242, lon: 12.9966079 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Årstiderna',
+ url: 'https://arstiderna.pieplowsrestauranger.se/lunch/',
+ imageUrl:
+ 'https://mediabeta.pieplowsrestauranger.se/2024/07/WhatsApp-Bild-2024-05-17-kl.-21.50.45_da5e237c-1000x1000.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/x2Bi7kxVJa4huAud6',
+ coordinate: { lat: 55.6067435, lon: 12.9940981 },
+ },
+ {
+ title: 'Nam do',
+ url: 'https://namdo.se/meny/#lunchmeny',
+ imageUrl: 'https://namdo.se/wp-content/uploads/2018/06/180615-namdo-prev-156.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/ph1WMXqsnXuzA8Kb6',
+ coordinate: { lat: 55.6044133, lon: 12.9978916 },
+ },
+ {
+ title: 'Marie Antoinette',
+ url: 'https://marieantoinette.se/lunch/',
+ imageUrl: 'https://marieantoinette.se/wp-content/uploads/2025/08/image00002.jpeg',
+ googleMapsUrl: 'https://maps.app.goo.gl/1jK3QEwkvH1VSC5G7',
+ coordinate: { lat: 55.6080352, lon: 13.0082392 },
+ },
+ // {
+ // title: 'KOL & Cocktails',
+ // url: 'https://kolmalmo.se/#bokabord',
+ // imageUrl: 'https://kolmalmo.se/wp-content/uploads/2017/09/Kvallen.jpg',
+ // googleMapsUrl: 'https://maps.app.goo.gl/dBT4SqrxpWkWEfm1A',
+ // coordinate: { lat: 55.6049907, lon: 13.000674 },
+ // },
+ {
+ title: 'Mrs Saigon',
+ url: 'https://www.mrs-saigon.se/meny/',
+ imageUrl: 'https://www.mrs-saigon.se/wp-content/uploads/2021/08/DSC05357.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/tbr8W9zgifFNMF1R6',
+ coordinate: { lat: 55.6033363, lon: 12.9957584 },
+ },
+ {
+ title: 'Epicuré',
+ url: 'https://epicure.nu/lunch/',
+ imageUrl: 'https://epicure.nu/wp-content/uploads/2021/06/epicure-restaurang.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/V8JZiGPaZXwAg4w57',
+ coordinate: { lat: 55.6032725, lon: 12.9973569 },
+ },
+ {
+ title: 'Green Mango',
+ url: 'https://www.greenmango.se/lunch',
+ imageUrl:
+ 'https://static.wixstatic.com/media/4ef303_bf12a28909dc4040b74d79fb22ebef0a~mv2.jpg/v1/fit/w_513,h_685,q_90,enc_avif,quality_auto/4ef303_bf12a28909dc4040b74d79fb22ebef0a~mv2.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/kZ4DrgTLP9Rpk3iG8',
+ coordinate: { lat: 55.5984894, lon: 12.9932109 },
+ },
+ {
+ title: 'Art of Spices',
+ url: 'https://www.artofspices.se/lunch/',
+ imageUrl: 'https://www.artofspices.se/wp-content/uploads/2023/06/Art-of-Spices-2.png',
+ googleMapsUrl: 'https://maps.app.goo.gl/5nYkfBojuaofG9TL9',
+ coordinate: { lat: 55.5960318, lon: 13.006827 },
+ },
+ {
+ title: 'Green Chili',
+ url: 'https://greenchili.gastrogate.com/lunch/',
+ imageUrl: 'https://gastrogate.com/thumbs/1870/files/29598/18-chicken-tikka-sizlar-richard-jonsson.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/u6P3kCf4K5cC1mC29',
+ coordinate: { lat: 55.6050553, lon: 12.9958384 },
+ },
+ {
+ title: 'Hamn och Peppar',
+ url: 'https://www.restauranghamnpeppar.se/veckans-meny.html',
+ imageUrl: 'https://www.restauranghamnpeppar.se/uploads/5/2/9/6/5296471/istockphoto-104704117-612x612_orig.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/jwwDrdAwVPBXAvVE9',
+ coordinate: { lat: 55.6137105, lon: 13.012575 },
+ },
+ {
+ title: 'Kolga',
+ url: 'https://www.restaurangkolga.se/lunch/',
+ imageUrl: 'https://gastrogate.com/thumbs/825x330/files/2716/kolgapic2.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/9RUmmTDbAmS2aNjS8',
+ coordinate: { lat: 55.6122883, lon: 12.9959043 },
+ },
+ {
+ title: 'Vibliotek',
+ url: 'https://mandarin-pelican-ymx5.squarespace.com/lunch-menu',
+ imageUrl:
+ 'https://images.squarespace-cdn.com/content/v1/6645cfd836b7d276a870d2cf/360f2f6c-f76b-4b1e-b23d-329b0a66b133/Tapas.jpg?format=1500w',
+ googleMapsUrl: 'https://maps.app.goo.gl/MnLGGZwi9SNkPoqr8',
+ coordinate: { lat: 55.6014483, lon: 13.0012605 },
+ },
+ {
+ title: 'MJs',
+ url: 'https://mjs.life/lunch/',
+ imageUrl: 'https://highfiveskane.se/wp-content/uploads/2021/08/mjs-6-scaled.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/38VrxH2hWtyCBbNq8',
+ coordinate: { lat: 55.6058052, lon: 12.9954576 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Operagrillen',
+ url: 'https://www.malmoopera.se/mat-och-dryck/lunch-i-operagrillen',
+ imageUrl:
+ 'https://www.malmoopera.se/sites/default/files/styles/hero_performance_sm_2x/public/2025-05/Lunch_1920x1080.jpg.webp?itok=HXawlwZi',
+ googleMapsUrl: 'https://maps.app.goo.gl/s1inU9BDZbz9SSMW9',
+ coordinate: { lat: 55.5966206, lon: 12.9959032 },
+ },
+ {
+ title: 'Atmosfär',
+ url: 'https://www.atmosfar.com/meny',
+ imageUrl:
+ 'https://images.squarespace-cdn.com/content/v1/5dea6af0942ce02c9fb094ba/1696237224654-59OR1E4WSBBZ3287X49N/Atmo_Uteservering_2023.jpg?format=1500w',
+ googleMapsUrl: 'https://maps.app.goo.gl/e87Gi8vowFuaeimq5',
+ coordinate: { lat: 55.5998057, lon: 12.9936969 },
+ },
+ {
+ title: 'Chef mama',
+ url: 'https://chefmama.se/cafe-menu/',
+ imageUrl:
+ 'https://chefmama.se/wp-content/uploads/2024/05/chef-mama-x-blique-by-nobis-stockholm-2024-1600w-min-2-uai-914x914.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/3eoBTKRv4tdsyaYm6',
+ coordinate: { lat: 55.6049421, lon: 13.0193656 },
+ },
+ {
+ title: 'Ngon',
+ url: 'https://ngonrestaurang.se/dagen-lunch/',
+ imageUrl: 'https://ngonrestaurang.se/wp-content/uploads/2024/04/3-psvabahmoldyzibzpzaqrd9skivj1c7wjgqjej387g-1.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/qLCt6TzfeP4qNztx7',
+ coordinate: { lat: 55.5988425, lon: 12.9971835 },
+ },
+ {
+ title: 'Hörnet',
+ url: 'https://www.xn--hr-fka.net/',
+ imageUrl: 'https://www.xn--hr-fka.net/wp-content/uploads/2024/11/hornetbild2.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/7RKde9ADSLQC1yUW7',
+ coordinate: { lat: 55.5981987, lon: 12.9790761 },
+ },
+ {
+ title: 'Sushibaren',
+ url: 'https://sushi-baren.se/menu-1',
+ imageUrl:
+ 'https://impro.usercontent.one/appid/oneComWsb/domain/sushi-baren.se/media/sushi-baren.se/onewebmedia/PXL_20240617_140825996~2(1).jpg?etag=%2227a308-679ff19b%22&sourceContentType=image%2Fjpeg&ignoreAspectRatio&resize=486%2B524&extract=40%2B0%2B436%2B524&quality=85',
+ googleMapsUrl: 'https://maps.app.goo.gl/6hVvqpGJrBYccAr18',
+ coordinate: { lat: 55.5982208, lon: 12.9776597 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Pink Head Noodle Bar',
+ url: 'https://weiq.app/pinkhead1/meny',
+ imageUrl: 'https://pinkhead.se/wp-content/uploads/2025/01/DSC07736-5-scaled.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/L7GnCU9xwSTiyfSZ7',
+ coordinate: { lat: 55.606587, lon: 12.9781294 },
+ },
+ {
+ title: 'Kajuteriet',
+ url: 'https://www.kajuteriet.se/lunchmeny-limhamn',
+ imageUrl:
+ 'https://static.wixstatic.com/media/75cd00_f18863e929b54c5a9bfde6edf67de3fd~mv2.jpg/v1/crop/x_0,y_169,w_1284,h_670/fill/w_909,h_474,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/Visa%20senaste%20bilder_edited.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/kDJWCHgwhnr89EDk8',
+ coordinate: { lat: 55.5820819, lon: 12.9015044 },
+ },
+ {
+ title: 'Boru bowl',
+ url: 'https://www.borubowlbar.com/menu/',
+ imageUrl: 'https://usercontent.one/wp/www.borubowlbar.com/wp-content/uploads/2019/03/IMG_5494.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/YVzTnsZikrSNHSLt6',
+ coordinate: { lat: 55.5982571, lon: 12.9913518 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Ur vår jord',
+ url: 'https://www.urvarjord.se/menus',
+ imageUrl:
+ 'https://static.wixstatic.com/media/ee5a3f_4da7f93ddc24481cab5d3b361db75b46~mv2.jpg/v1/fill/w_980,h_320,fp_0.50_0.50,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/ee5a3f_4da7f93ddc24481cab5d3b361db75b46~mv2.jpg',
+ googleMapsUrl: 'https://maps.app.goo.gl/fN2ZLGe2fpH1i1Sr5',
+ coordinate: { lat: 55.5966722, lon: 13.0000889 },
+ },
+ {
+ title: 'Byn matbar',
+ url: 'https://bynmatbar.se/meny/',
+ imageUrl: 'https://lh3.googleusercontent.com/p/AF1QipOW3E33RI7D150klP22EI-VTur0HIfPG7cJI_Ek=w600-h988-p-k-no',
+ googleMapsUrl: 'https://maps.app.goo.gl/aEu4ZgrVqdsYdxzJ6',
+ coordinate: { lat: 55.6076746, lon: 13.0211793 },
+ useContentCleaner: false,
+ },
+ {
+ title: 'Restaurang P2',
+ url: 'https://restaurangp2.se/#lunch',
+ imageUrl: 'https://restaurangp2.se/wp-content/uploads/2024/10/RESTAURANG_P2-6.webp',
+ googleMapsUrl: 'https://maps.app.goo.gl/ZSF3vZKajQBtBWSS8',
+ coordinate: { lat: 55.6143387, lon: 12.9857794 },
+ useContentCleaner: false,
+ },
+];
diff --git a/apps/functions/scraper/src/restaurants/bennepastabar.ts b/apps/functions/scraper/src/restaurants/bennepastabar.ts
deleted file mode 100644
index b2e5c74..0000000
--- a/apps/functions/scraper/src/restaurants/bennepastabar.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Benne Pastabar',
- url: 'https://bennepastabar.se/',
- imageUrl: 'https://bennepastabar.se/wp-content/themes/benne/images/benne-pastabar-order.jpg',
- googleMapsUrl: 'https://goo.gl/maps/pZUg6zuXyy6xXxfn7',
- coordinate: {
- lat: 55.60313716015807,
- lon: 13.003559388316905,
- },
- unknownMealDefault: 'veg',
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const dishes = [...document.querySelectorAll('div.menu-wrapper h4')]
- .filter((topic) => topic?.textContent?.trim().length)
- .slice(0, -1)
- .map((topic) => ({
- title:
- topic.textContent && topic.textContent.charAt(0).toUpperCase() + topic.textContent.slice(1).toLowerCase(),
- description: topic.nextElementSibling?.textContent,
- }));
-
- return dishes;
- });
diff --git a/apps/functions/scraper/src/restaurants/bistroroyal.ts b/apps/functions/scraper/src/restaurants/bistroroyal.ts
deleted file mode 100644
index 976cf8f..0000000
--- a/apps/functions/scraper/src/restaurants/bistroroyal.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Bistro Royal',
- url: 'https://bistroroyal.se/dagens-ratt/',
- imageUrl: 'https://cdn42.gastrogate.com/files/29072/bistroroyal-bistro-1-1.jpg',
- googleMapsUrl: 'https://goo.gl/maps/hSqYWPKgWVbSRj2s7',
- coordinate: {
- lat: 55.608996491841665,
- lon: 12.999521057744403,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const lunchNode = [...document.querySelectorAll('.menu_header')]?.find((e) =>
- e.textContent?.toLowerCase()?.includes(todaySwedishFormat),
- );
- const lunchMenuDiv = lunchNode?.parentNode?.parentNode as HTMLElement;
- const htmlElement = lunchMenuDiv?.nextElementSibling as HTMLElement;
- const raw = htmlElement ? [...htmlElement.querySelectorAll('.td_title')]?.map((e) => e.textContent?.trim()) : [];
-
- const typeArray = ['meat' as const, 'meat' as const, 'fish' as const, 'veg' as const];
-
- return raw.map((e, i) => ({
- type: typeArray[i],
- title: e,
- }));
- });
diff --git a/apps/functions/scraper/src/restaurants/hylliebistro.ts b/apps/functions/scraper/src/restaurants/hylliebistro.ts
deleted file mode 100644
index 6ac6f04..0000000
--- a/apps/functions/scraper/src/restaurants/hylliebistro.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { Page } from 'puppeteer';
-import { DishProps, RestaurantMetaProps } from '@devolunch/shared';
-
-export const meta: RestaurantMetaProps = {
- title: 'Hyllie Bistro',
- url: 'https://www.hylliebryggeri.se/stormgatan',
- imageUrl:
- 'https://static.wixstatic.com/media/97d700_51961be0108c43cdb423ec5947b3096b~mv2.jpg/v1/crop/x_0,y_0,w_7165,h_4912/fill/w_882,h_604,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/Bistro.jpg',
- googleMapsUrl: 'https://goo.gl/maps/dFEmStJASNgim5er5',
- coordinate: {
- lat: 55.61231765164153,
- lon: 12.999087156055637,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
- const todayEnglishFormat = new Date()
- .toLocaleString('en-GB', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const lunchNode = [...document.querySelectorAll("div[data-testid='richTextElement']")].find((a) => {
- const t = (a as HTMLElement)?.innerText?.toLocaleLowerCase('sv-SE').normalize('NFC');
- return t.includes(todaySwedishFormat) || t.includes(todayEnglishFormat);
- });
-
- const raw = (lunchNode as HTMLElement)?.innerText.split('\n').filter((a) => a.trim());
- const todayIndex = raw?.findIndex((a) => {
- const t = a.toLocaleLowerCase('sv-SE').normalize('NFC');
- return t.includes(todaySwedishFormat) || t.includes(todayEnglishFormat);
- });
-
- const dishes: DishProps[] = [];
-
- if (!raw) {
- return dishes;
- }
-
- if (raw[todayIndex + 2].length > 25) {
- dishes.push({
- type: 'veg' as const,
- title: raw[todayIndex + 2],
- });
- }
- dishes.push({
- type: dishes.length ? ('meat' as const) : ('veg' as const),
- title: raw[todayIndex + 1],
- });
-
- return dishes;
- });
diff --git a/apps/functions/scraper/src/restaurants/kontrastvastrahamnen.ts b/apps/functions/scraper/src/restaurants/kontrastvastrahamnen.ts
deleted file mode 100644
index a25fa11..0000000
--- a/apps/functions/scraper/src/restaurants/kontrastvastrahamnen.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Kontrast Västra Hamnen',
- url: 'https://www.kontrastrestaurang.se/vastra-hamnen/',
- imageUrl:
- 'https://usercontent.one/wp/www.kontrastrestaurang.se/wp-content/uploads/2022/08/Indian-food-hero.jpg?media=1666955164',
- googleMapsUrl: 'https://goo.gl/maps/sAfGLCky4RcSUZKw5',
- coordinate: {
- lat: 55.610228873034714,
- lon: 12.973623667388564,
- },
- unknownMealDefault: 'veg',
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const getDishes = (type: string, knownType: string | null = null) => {
- const topic = [...document.querySelectorAll('h2')].find((a) =>
- a.textContent?.toLowerCase().includes(type.toLowerCase()),
- );
- const dishes =
- ((topic?.parentNode?.parentNode as HTMLElement)?.nextElementSibling as HTMLElement)?.innerText
- ?.split('\n')
- .filter((a) => a) || [];
-
- return dishes.map((dish: string) => ({
- title: type + ' - ' + dish.replace(/[0-9]+\.\s/, ''),
- ...(knownType && { type: knownType }),
- }));
- };
-
- const chickenDishes = getDishes('Kyckling', 'meat');
- const beefDishes = getDishes('Biff', 'meat');
- const vegDishes = getDishes('Vegetarisk');
-
- const dishes = [...chickenDishes, ...beefDishes, ...vegDishes];
-
- return dishes;
- });
diff --git a/apps/functions/scraper/src/restaurants/kp.ts b/apps/functions/scraper/src/restaurants/kp.ts
deleted file mode 100644
index 1917493..0000000
--- a/apps/functions/scraper/src/restaurants/kp.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Restaurang KP',
- url: 'https://restaurangkp.se/lunchbuffe/',
- imageUrl: 'https://gastrogate.com/thumbs/1494/files/28932/kpstart2019.jpg',
- googleMapsUrl: 'https://goo.gl/maps/gC7veNFosQkEm6Xm8',
- coordinate: {
- lat: 55.60899502071826,
- lon: 12.9995314560394,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const lunchNode = [...document.querySelectorAll('.menu_header')]?.find((e) =>
- e.textContent?.toLowerCase()?.includes(todaySwedishFormat),
- );
- const lunchMenuDiv = lunchNode?.parentNode?.parentNode as HTMLElement;
- const htmlElement = lunchMenuDiv?.nextElementSibling as HTMLElement;
- const raw = htmlElement ? [...htmlElement.querySelectorAll('.td_title')]?.map((e) => e.textContent?.trim()) : [];
-
- const typeArray = ['meat' as const, 'fish' as const, 'veg' as const];
-
- return raw.map((e, i) => ({
- type: typeArray[i],
- title: e,
- }));
- });
diff --git a/apps/functions/scraper/src/restaurants/lokal17.ts b/apps/functions/scraper/src/restaurants/lokal17.ts
deleted file mode 100644
index 75b9adc..0000000
--- a/apps/functions/scraper/src/restaurants/lokal17.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Page } from 'puppeteer';
-import pdf from 'pdf-parse';
-import { RestaurantMetaProps } from '@devolunch/shared';
-
-export const meta: RestaurantMetaProps = {
- title: 'Lokal 17',
- url: 'https://lokal17.se/',
- imageUrl: 'https://lokal17.se/app/uploads/sites/2/2018/01/bg-22.jpg',
- googleMapsUrl: 'https://goo.gl/maps/eMsNxGK743oQVj8D9',
- coordinate: {
- lat: 55.612111673032366,
- lon: 12.995311427220344,
- },
-};
-
-export const pdfScrapeFunction = async (url: string) => {
- if (!url) {
- return [];
- }
-
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const f = await fetch(url);
- const buffer = await f.arrayBuffer();
- const pdfData = await pdf(Buffer.from(buffer));
-
- const raw = pdfData.text
- .split('\n')
- .map((a: string) =>
- a
- .replace(/ {2}|\r\n|\n|\r/gm, '')
- .replace('│', '')
- .replace(',', '')
- .trim(),
- )
- .filter((a: string) => a && !a.startsWith('Warning'));
-
- const todayMeatIndex = raw.findIndex((a: string) => a.toLowerCase().includes(todaySwedishFormat));
- const vegIndex = raw.findIndex((a: string) => a.toLowerCase().includes('vegetarisk'));
- const alwaysIndex = raw.findIndex((a: string) => a.toLowerCase().includes('alltid hos lokal'));
-
- const todayMeat = {
- type: 'meat' as const,
- title: raw[todayMeatIndex + 1],
- };
-
- const veg = {
- type: 'veg' as const,
- title: raw[vegIndex + 1],
- };
-
- const alwaysMeat = {
- type: 'meat' as const,
- title: raw[alwaysIndex + 1],
- };
-
- const alwaysVeg = {
- type: 'veg' as const,
- title: raw[alwaysIndex + 4],
- };
-
- const alwaysFish = {
- type: 'fish' as const,
- title: raw[alwaysIndex + 7],
- };
-
- return [todayMeat, veg, alwaysMeat, alwaysVeg, alwaysFish];
-};
-
-export const browserScrapeFunction = async (page: Page) => {
- const url = await page.evaluate(async () => {
- const lunchNode = [...document.querySelectorAll('a')].find((a) =>
- a?.innerText?.toLowerCase()?.includes('lunchmeny'),
- );
- const url = lunchNode?.getAttribute('href');
-
- if (!url) {
- return '';
- }
-
- return url;
- });
-
- return pdfScrapeFunction(url);
-};
diff --git a/apps/functions/scraper/src/restaurants/miamarias.ts b/apps/functions/scraper/src/restaurants/miamarias.ts
deleted file mode 100644
index ff6c59e..0000000
--- a/apps/functions/scraper/src/restaurants/miamarias.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Page } from 'puppeteer';
-import { DishType, RestaurantMetaProps } from '@devolunch/shared';
-
-export const meta: RestaurantMetaProps = {
- title: 'MiaMarias',
- url: 'http://www.miamarias.nu/',
- imageUrl: 'https://i0.wp.com/www.takemetosweden.be/wp-content/uploads/2019/07/MiaMarias-Malm%C3%B6-1.png?w=500&ssl=1',
- googleMapsUrl: 'https://goo.gl/maps/RrRffZzgebREQpwB7',
- coordinate: {
- lat: 55.613464681883094,
- lon: 12.992134201401216,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const dayOfWeek = new Date().getDay();
- const tables = Array.from(document.querySelectorAll('table'));
- const raw =
- tables
- .slice(dayOfWeek - 1, dayOfWeek)
- .pop()
- ?.querySelector('tbody')
- ?.textContent?.split('\n')
- .filter((e: string) => e.trim()) || [];
-
- const dishes = [];
-
- for (let i = 0; i < raw.length; i += 2) {
- const swedishType = raw[i]
- .match(/^[^0-9]+/)
- ?.shift()
- ?.trim();
- const type: DishType = swedishType === 'Fisk' ? 'fish' : swedishType === 'Kött' ? 'meat' : 'veg';
-
- const price = Number(raw[i].match(/([0-9]+)\s?kr/)?.slice(1, 2));
- const title = raw[i + 1];
- dishes.push({ type, price, title });
- }
- return dishes;
- });
diff --git a/apps/functions/scraper/src/restaurants/namu.ts b/apps/functions/scraper/src/restaurants/namu.ts
deleted file mode 100644
index dfd547a..0000000
--- a/apps/functions/scraper/src/restaurants/namu.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Namu',
- url: 'https://namu.nu/',
- imageUrl: 'https://namu.nu/wp-content/uploads/2017/05/Namul-darker2-3k-min.jpg',
- googleMapsUrl: 'https://goo.gl/maps/XtFUKSvmDQTUpR146',
- coordinate: {
- lat: 55.605198570165165,
- lon: 12.997516926554482,
- },
- unknownMealDefault: 'veg',
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() =>
- [...document.querySelectorAll('ul.fdm-section-lunch-pa-namu li')]
- .map((meal) =>
- (meal as HTMLElement).innerText
- .split('\n')
- .map((b) => {
- return b.replace(/\r\n|\n|\r|\t/gm, '');
- })
- .filter((b) => b.length),
- )
- .slice(1)
- .slice(0, -1)
- .map((meal) => {
- const title = meal[0];
- meal.shift();
- const description = meal.join(' ');
- return {
- title: title.charAt(0).toUpperCase() + title.slice(1).toLowerCase(),
- description,
- };
- }),
- );
diff --git a/apps/functions/scraper/src/restaurants/niagara.ts b/apps/functions/scraper/src/restaurants/niagara.ts
deleted file mode 100644
index e5e387d..0000000
--- a/apps/functions/scraper/src/restaurants/niagara.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Niagara',
- url: 'https://restaurangniagara.se/lunch/',
- imageUrl: 'https://restaurangniagara.se/wp-content/uploads/sites/4/2015/08/Lunch-meny-Niagara1.jpg',
- googleMapsUrl: 'https://goo.gl/maps/5SAyzPUHhb2xrNXRA',
- coordinate: {
- lat: 55.60874652087178,
- lon: 12.994182713710865,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const lunchNode = [...document.querySelectorAll('div.lunch h3')].find(
- (a) => a.textContent?.toLowerCase() === todaySwedishFormat,
- )?.nextElementSibling;
-
- if (lunchNode) {
- const foods = [...lunchNode.querySelectorAll('tr')].map((a) => ({
- type: 'misc' as const,
- title: `${a.querySelector('td:nth-child(1)')?.textContent} - ${
- a.querySelector('td:nth-child(2)')?.textContent?.split('\n')[0]
- }`,
- price: a.querySelector('td:nth-child(3)')?.textContent,
- }));
-
- return foods;
- }
- return [];
- });
diff --git a/apps/functions/scraper/src/restaurants/quanbyquan.ts b/apps/functions/scraper/src/restaurants/quanbyquan.ts
deleted file mode 100644
index 0ee2263..0000000
--- a/apps/functions/scraper/src/restaurants/quanbyquan.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Quanbyquan',
- url: 'https://quanbyquan.se/',
- imageUrl: 'https://quanbyquan.se/wp-content/uploads/2019/09/Quan_Recept_08-1.jpg',
- googleMapsUrl: 'https://goo.gl/maps/5xyoBjWuU9vUcD6V8',
- coordinate: {
- lat: 55.605634485935816,
- lon: 12.997834503074296,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const lunchNodes = [...document.querySelectorAll('div.food_category')];
-
- if (!lunchNodes) {
- return [];
- }
-
- const lunchNode = lunchNodes
- .find((m) => m.querySelector('h2')?.innerText.includes('Lunch menu'))
- ?.querySelectorAll('div.row');
-
- if (!lunchNode) {
- return [];
- }
-
- return [...lunchNode]
- .map((a) => (a as HTMLElement).innerText.split('\n').filter((a: string) => a.length && !/^\d{3}:-$/.test(a)))
- .map((row, index) => {
- const [title, desc] = row;
- const lunch = title.charAt(0).toUpperCase() + title.slice(1).toLowerCase() + ' - ' + desc;
-
- const types = ['misc', 'meat', 'fish', 'meat', 'veg', 'fish'];
-
- return {
- type: types[index],
- title: lunch,
- };
- });
- });
diff --git a/apps/functions/scraper/src/restaurants/saltimporten.ts b/apps/functions/scraper/src/restaurants/saltimporten.ts
deleted file mode 100644
index 12c8e0a..0000000
--- a/apps/functions/scraper/src/restaurants/saltimporten.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Saltimporten',
- url: 'https://www.saltimporten.com/',
- imageUrl: 'https://www.saltimporten.com/media/IMG_6253-512x512.jpg',
- googleMapsUrl: 'https://goo.gl/maps/9rn3svDPeGUDaeXUA',
- coordinate: {
- lat: 55.61608870967554,
- lon: 12.99710506088239,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const menu = document.querySelector('div[title="Page 1"]');
- const menuArray = (menu as HTMLElement)?.innerText?.split('\n').filter((a) => a.trim());
-
- const todayIndex = menuArray.findIndex((a) => a.normalize('NFC').toLowerCase() === todaySwedishFormat);
- const vegIndex = menuArray.findIndex((a) => a.normalize('NFC').toLowerCase().includes('veckans vegetariska'));
-
- return [
- {
- type: 'meat' as const,
- title: menuArray[todayIndex + 1],
- },
- {
- type: 'veg' as const,
- title: menuArray[vegIndex + 1],
- },
- ];
- });
diff --git a/apps/functions/scraper/src/restaurants/slagthuset.test.ts b/apps/functions/scraper/src/restaurants/slagthuset.test.ts
deleted file mode 100644
index d3138e5..0000000
--- a/apps/functions/scraper/src/restaurants/slagthuset.test.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { getFullWeekdayName, daysBetween, getDaysRangeFromMenuString, getDishType } from './slagthuset';
-
-describe('getFullWeekdayName', () => {
- it('should return the full weekday name', () => {
- expect(getFullWeekdayName('mån')).toBe('måndag');
- expect(getFullWeekdayName('ons')).toBe('onsdag');
- });
-});
-
-describe('daysBetween', () => {
- it('should return days between given days', () => {
- expect(daysBetween('måndag', 'onsdag')).toEqual(['måndag', 'tisdag', 'onsdag']);
- });
-
- it('should return all days for a full week range', () => {
- expect(daysBetween('måndag', 'fredag')).toEqual(['måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag']);
- });
-
- it('should throw error for invalid days', () => {
- expect(() => daysBetween('fredag', 'onsdag')).toThrow('Invalid days range');
- });
-});
-
-describe('getDaysRangeFromMenuString', () => {
- it('should extract the days range from menu string', () => {
- expect(getDaysRangeFromMenuString('Måndag-Onsdag: Some dish')).toEqual(['måndag', 'tisdag', 'onsdag']);
- });
-});
-
-describe('getDishType', () => {
- const days = ['måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag'];
-
- days.forEach((day) => {
- it(`should return the correct dish type for ${day}`, async () => {
- // Meat dishes
- const meatRow = `${day}: Some dish`;
- expect(await getDishType(meatRow, day, null)).toBe('meat');
-
- // Fish dishes
- const fishRow = `${day}: Some fish dish`;
- expect(await getDishType(fishRow, day, 'Fisk')).toBe('fish');
-
- // Vegetarian dishes
- const vegRow = `${day}: Some veg dish`;
- expect(await getDishType(vegRow, day, 'Vegetariskt')).toBe('veg');
- });
- });
-
- it('should return the correct dish type for a range of days', async () => {
- expect(await getDishType('Måndag-Onsdag: Some fish dish', 'tisdag', 'Fisk')).toBe('fish');
- expect(await getDishType('Torsdag-Fredag: Some veg dish', 'torsdag', 'Vegetariskt')).toBe('veg');
- });
-});
diff --git a/apps/functions/scraper/src/restaurants/slagthuset.ts b/apps/functions/scraper/src/restaurants/slagthuset.ts
deleted file mode 100644
index c5a1748..0000000
--- a/apps/functions/scraper/src/restaurants/slagthuset.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Slagthuset',
- url: 'https://slagthuset.se/restaurangen/',
- imageUrl: 'https://slagthuset.se/static/d18f8e233d657ea77a2e7aeb3aa65eec/cc3b1/Sodra-Hallen01-1.jpg',
- googleMapsUrl: 'https://goo.gl/maps/ZMLMAHi8XhVss2At5',
- coordinate: {
- lat: 55.61134419989048,
- lon: 13.002761498368026,
- },
-};
-
-const weekdays = ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'];
-const weekdayShortNames = [/sön/i, /mån/i, /tis/i, /ons/i, /tor(s)?/i, /fre/i, /lör/i];
-
-export const getFullWeekdayName = (shortName: string): string => {
- const index = weekdayShortNames.findIndex((re) => re.test(shortName));
- return index >= 0 ? weekdays[index] : shortName;
-};
-
-export const daysBetween = (first: string, last: string): string[] => {
- const firstIndex = weekdays.indexOf(first);
- const lastIndex = weekdays.indexOf(last);
- if (firstIndex < 0 || lastIndex < 0 || lastIndex < firstIndex) {
- throw new Error(`Invalid days range: ${first}-${last}`);
- }
-
- const range = [];
- for (let i = firstIndex; i <= lastIndex; i++) {
- range.push(weekdays[i]);
- }
-
- return range;
-};
-
-export const getDaysRangeFromMenuString = (row: string): string[] => {
- const daysMatch = row.match(/([MmTtOoFfSsLl][a-zåäö]+dag)-([MmTtOoFfSsLl][a-zåäö]+dag)/);
- if (!daysMatch) return [];
- const [_, startDayRaw, endDayRaw] = daysMatch;
- const startDay = getFullWeekdayName(startDayRaw.toLowerCase());
- const endDay = getFullWeekdayName(endDayRaw.toLowerCase());
- return daysBetween(startDay, endDay);
-};
-
-export const getDishType = async (row: string, today: string, section: string | null): Promise => {
- const days = getDaysRangeFromMenuString(row);
- const isTodayWithinRange = days.includes(today);
-
- if (isTodayWithinRange || row.includes(today)) {
- if (section === 'Fisk') return 'fish';
- if (section === 'Vegetariskt') return 'veg';
- return 'meat';
- }
- return null;
-};
-
-export const browserScrapeFunction = async (page: Page) => {
- await page.exposeFunction('getDishType', getDishType);
-
- return page.evaluate(async () => {
- const todaySwedishFormat = new Date().toLocaleString('sv-SE', { weekday: 'long' }).toLowerCase();
-
- const dishes = [];
- let section: string | null = null;
-
- const lunchNode = [...document.querySelectorAll('h3')].find((e) => e.innerText.toLowerCase().match(/v (\d{1,2})/));
- const lunchMenuDiv = lunchNode?.parentNode?.parentNode as HTMLDivElement;
- const raw = lunchMenuDiv?.innerText.split('\n').filter((a) => a.trim());
-
- for (let i = 0; i < raw?.length; i++) {
- const row = raw[i].toLowerCase();
- const description = raw[i + 1];
-
- if (row.includes('fisk')) {
- section = 'Fisk';
- continue;
- }
- if (row.includes('vegetariskt')) {
- section = 'Vegetariskt';
- continue;
- }
-
- const dishType = await getDishType(row, todaySwedishFormat, section);
-
- if (dishType) {
- const dish = {
- title: description,
- type: dishType,
- };
- dishes.push(dish);
- }
- }
-
- console.log(JSON.stringify(dishes));
-
- return dishes;
- });
-};
diff --git a/apps/functions/scraper/src/restaurants/smak.ts b/apps/functions/scraper/src/restaurants/smak.ts
deleted file mode 100644
index 0834687..0000000
--- a/apps/functions/scraper/src/restaurants/smak.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Smak',
- url: 'https://gastrogate.com/lunch/print/6005',
- imageUrl: 'https://smak.info/wp-content/uploads/2022/05/IMG_2946-kall-1024x768.png',
- googleMapsUrl: 'https://goo.gl/maps/5NrVf9rA3gocZLvd7',
- coordinate: {
- lat: 55.59505322449918,
- lon: 12.999231400154716,
- },
- unknownMealDefault: 'veg',
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const lunchNode = document.querySelector('div.lunch-container') as HTMLElement;
- const lunchArray = lunchNode?.innerText?.split('\n')?.filter((a) => !/^\d{3} kr$/.test(a));
- const todayIndex = lunchArray?.findIndex((a) => a.toLowerCase().normalize('NFC').includes(todaySwedishFormat));
-
- if (!lunchArray?.length) {
- return [];
- }
-
- const meals = [lunchArray[todayIndex + 1], lunchArray[todayIndex + 2], lunchArray[todayIndex + 3]];
-
- return meals.map((meal) => ({
- title: meal,
- }));
- });
diff --git a/apps/functions/scraper/src/restaurants/spill.ts b/apps/functions/scraper/src/restaurants/spill.ts
deleted file mode 100644
index 5d61a7a..0000000
--- a/apps/functions/scraper/src/restaurants/spill.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Spill',
- url: 'https://restaurangspill.se/',
- imageUrl: 'https://restaurangspill.se/static/0de07c5b4f98bc003befad5e872686b4/9bbaf/SPILL_09.jpg',
- googleMapsUrl: 'https://goo.gl/maps/bZ8yDN3PD3fjvNGw5',
- coordinate: {
- lat: 55.612746399457436,
- lon: 12.988458042546734,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const dishesNodes = [...document.querySelectorAll('div h2')].find(
- (a) => a.textContent?.toLowerCase() === 'dagens lunch',
- )?.nextElementSibling?.childNodes[0].childNodes[1].childNodes[1].textContent;
-
- const a = dishesNodes?.split(/Vegetariskt?:/gm);
- const meat = a?.[0]?.replace(/(\r\n|\n|\r)/gm, ' ').trim();
- const veg = a?.[1]?.replace(/(\r\n|\n|\r)/gm, ' ').trim();
-
- return [
- {
- type: 'meat' as const,
- title: meat,
- },
- {
- type: 'veg' as const,
- title: veg,
- },
- ];
- });
diff --git a/apps/functions/scraper/src/restaurants/storavarvsgatan.ts b/apps/functions/scraper/src/restaurants/storavarvsgatan.ts
deleted file mode 100644
index 26a5705..0000000
--- a/apps/functions/scraper/src/restaurants/storavarvsgatan.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Stora Varvsgatan',
- url: 'https://storavarvsgatan6.se/meny.html',
- imageUrl:
- 'https://storavarvsgatan6.se/____impro/1/onewebmedia/foodiesfeed.com_close-up-on-healthy-green-broccoli%20%28kopia%29.jpg?etag=%226548df-5f256567%22&sourceContentType=image%2Fjpeg&ignoreAspectRatio&resize=1900%2B1267&extract=81%2B0%2B939%2B1190&quality=85',
- googleMapsUrl: 'https://goo.gl/maps/5YUuxPzsMSg5kmK98',
- coordinate: {
- lat: 55.612390477729015,
- lon: 12.991505487495564,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const today = [...document.querySelectorAll('p')]?.find((e) =>
- e?.textContent?.toLowerCase()?.includes(new Date()?.toLocaleString('sv-SE', { weekday: 'long' })),
- );
- const meat = today?.nextElementSibling?.textContent;
- const veg = today?.nextElementSibling?.nextElementSibling?.textContent;
-
- return [
- {
- type: 'meat' as const,
- title: meat,
- },
- {
- type: 'veg' as const,
- title: veg,
- },
- ];
- });
diff --git a/apps/functions/scraper/src/restaurants/twoforks.ts b/apps/functions/scraper/src/restaurants/twoforks.ts
deleted file mode 100644
index 515e84d..0000000
--- a/apps/functions/scraper/src/restaurants/twoforks.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Two Forks',
- url: 'https://www.twoforks.se/lunch',
- imageUrl:
- 'https://images.squarespace-cdn.com/content/v1/5c6fc5858155121249a4c49f/d9867018-aaa7-4d7c-8a5b-b5f666277406/%C2%A9jensnordstromtwoforks0027.jpg',
- googleMapsUrl: 'https://maps.app.goo.gl/GKATv8jSGjbAKfYt5',
- coordinate: {
- lat: 55.6073278,
- lon: 12.9920499,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const nbrs = [1, 2, 3] as const;
- const types = { 1: 'vegan', 2: 'vegan', 3: 'meat' } as const;
-
- return nbrs.map((nbr) => {
- const header = [...document.querySelectorAll('h2')].find((h) => h.innerText === `NO. ${nbr}`);
- const title = (header?.nextElementSibling as HTMLParagraphElement)?.innerText.trim();
-
- return { type: types[nbr], title };
- });
- });
diff --git a/apps/functions/scraper/src/restaurants/valfarden.ts b/apps/functions/scraper/src/restaurants/valfarden.ts
deleted file mode 100644
index 59d464e..0000000
--- a/apps/functions/scraper/src/restaurants/valfarden.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { RestaurantMetaProps } from '@devolunch/shared';
-import { Page } from 'puppeteer';
-
-export const meta: RestaurantMetaProps = {
- title: 'Välfärden',
- url: 'https://valfarden.nu/dagens-lunch/',
- imageUrl: 'https://valfarden.nu/wp-content/uploads/2015/01/hylla.jpg',
- googleMapsUrl: 'https://goo.gl/maps/cLAKuD2B95N8bqr19',
- coordinate: {
- lat: 55.61123819992324,
- lon: 12.994400413711007,
- },
-};
-
-export const browserScrapeFunction = (page: Page) =>
- page.evaluate(() => {
- const todaySwedishFormat = new Date()
- .toLocaleString('sv-SE', {
- weekday: 'long',
- })
- .toLowerCase();
-
- const lunchNode = [...document.querySelectorAll('p, h2, h3')].find((a) =>
- new RegExp(/vecka\s([1-9][0-9]?(\.[0-9]{1,2})?)/).test((a as HTMLElement)?.innerText.toLowerCase()),
- );
-
- const weekdays = ['måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag'];
- let closestParentElement = lunchNode as HTMLElement;
-
- while (true as const) {
- // If we find 3 or more weekdays in the parentElement we're gucci
- if (weekdays.filter((w) => closestParentElement?.textContent?.toLowerCase().includes(w))?.length >= 3) {
- break;
- }
-
- closestParentElement = closestParentElement?.parentElement as HTMLElement;
-
- if (!closestParentElement) {
- return [];
- }
- }
-
- const lunchMenuDiv = lunchNode?.parentNode?.parentNode as HTMLDivElement;
- const raw = lunchMenuDiv?.innerText?.split('\n')?.filter((a) => a.trim() && a !== '—');
- const todayIndex = raw?.findIndex((a) => a.toLowerCase().includes(todaySwedishFormat));
-
- return [
- {
- type: 'meat' as const,
- title: raw[todayIndex + 1],
- },
- {
- type: 'veg' as const,
- title: raw[todayIndex + 2],
- },
- ];
- });
diff --git a/apps/functions/scraper/src/scraper.ts b/apps/functions/scraper/src/scraper.ts
index b1c06e3..bb1337a 100644
--- a/apps/functions/scraper/src/scraper.ts
+++ b/apps/functions/scraper/src/scraper.ts
@@ -1,94 +1,331 @@
-import fs from 'fs/promises';
-import path from 'path';
-import { Browser } from 'puppeteer';
-
-import { config } from './index.js';
-import { DishProps, RestaurantProps } from '@devolunch/shared';
-import resizeImage from './utils/image-resizer.js';
-import { updateDishType } from './utils/dish-type-lookup.js';
-import { compareDish } from './utils/sort.js';
+import puppeteer, { Browser, Page } from 'puppeteer';
+import * as ff from '@google-cloud/functions-framework';
-const TIMEOUT = 120000;
+import { config } from './config.js';
+import { translateRestaurants } from './utils/translator.js';
+import { compareDish } from './utils/sort.js';
+import { addClosureInfoToLunchMetadata } from './utils/closureDetection.js';
+import type { RestaurantMetaProps, RestaurantProps, Scrape } from '@devolunch/shared';
+import { logger } from '@devolunch/shared/logger/node';
-export const getRestaurantFilePaths = async (dir: string) => {
- const files = await fs.readdir(dir);
- let targetFiles = files.filter((file) => {
- const extname = path.extname(file).toLowerCase();
- const isTestFile = file.toLowerCase().endsWith('.test.js');
- return extname === '.js' && !isTestFile;
- });
+// Import refactored modules
+import { BUCKET_NAME, storage } from './utils/storage.js';
+import { getRestaurantMetas } from './config/restaurantLoader.js';
+import { buildPageContent } from './scrapers/content.js';
+import { extractDishesWithFallback } from './services/dishExtractor.js';
+import type { MenuExtractionResult } from './types/index.js';
- const filesOverride = config.filesOverride?.split(',');
- if (filesOverride?.length) {
- targetFiles = filesOverride;
+/**
+ * Scrapes a single page URL with optional location filter
+ */
+const scrapeFromUrl = async (
+ page: Page,
+ meta: RestaurantMetaProps,
+ url: string,
+ locationFilter?: string,
+ otherLocationFilters?: string[],
+): Promise => {
+ try {
+ const content = await buildPageContent(page, meta, url);
+ const result = await extractDishesWithFallback(page, content, meta, locationFilter, otherLocationFilters);
+ return { ...result, pageText: content.text };
+ } catch (error) {
+ logger.error({ title: meta.title, locationFilter, err: error }, 'Error scraping');
+ return { dishes: [], confidence: 0, reasoning: 'Error during scraping', lunchInfo: undefined };
}
- return targetFiles;
};
-export const scrapeRestaurant = async (browser: Browser, dir: string, file: string) => {
- const { meta: restaurantMeta, browserScrapeFunction } = await import(path.join(dir, file));
+/**
+ * Processes multiple restaurants and builds restaurant data with concurrent batch processing
+ */
+const processRestaurants = async (browser: Browser, metas: RestaurantMetaProps[]): Promise => {
+ const restaurants: RestaurantProps[] = [];
+ const MAX_CONCURRENT = 5;
- const page = await browser.newPage();
- page.on('console', (msg) => console.log(msg.text()));
+ // Process restaurants in batches
+ for (let i = 0; i < metas.length; i += MAX_CONCURRENT) {
+ const batch = metas.slice(i, i + MAX_CONCURRENT);
- try {
- await page.goto(restaurantMeta.url, {
- waitUntil: 'load',
- timeout: TIMEOUT,
- });
+ const batchPromises = batch.map(async (meta) => {
+ const page = await browser.newPage();
+ try {
+ // Multi-location handling
+ if (meta.multiLocation) {
+ const { type, locations } = meta.multiLocation;
- console.log(`Scraping ${restaurantMeta.title} on ${restaurantMeta.url}`);
- const dishes = await browserScrapeFunction(page);
+ if (type === 'shared') {
+ // Scrape once and share across locations
+ const extractionResult = await scrapeFromUrl(page, meta, meta.url);
+ const sorted = extractionResult.dishes?.sort(compareDish) || [];
+ // Add closure detection to lunch metadata
+ const lunchInfoWithClosure = addClosureInfoToLunchMetadata(meta.title, extractionResult.lunchInfo || {}, extractionResult.pageText);
- console.log(`Resizing image for ${restaurantMeta.title}`);
+ const locs = locations.map((loc) => ({
+ ...loc,
+ dishCollection: [
+ {
+ language: config.defaultLanguage,
+ dishes: lunchInfoWithClosure.closureInfo?.isClosed ? [] : sorted,
+ lunchInfo: lunchInfoWithClosure,
+ },
+ ],
+ }));
- // upload image to bucket if there are any
- const imageUrl = await resizeImage(restaurantMeta.imageUrl, restaurantMeta.title, {
- size: {
- width: 400,
- height: 300,
- },
- quality: 70,
+ const restaurant: RestaurantProps = {
+ title: meta.title,
+ url: meta.url,
+ imageUrl: meta.imageUrl,
+ coordinate: meta.coordinate,
+ googleMapsUrl: meta.googleMapsUrl,
+ locations: locs,
+ dishCollection: [], // Empty for multi-location restaurants
+ };
+
+ return restaurant;
+ } else if (type === 'separate') {
+ // Scrape each location separately
+ const locs = await Promise.all(
+ locations.map(async (loc) => {
+ const locationPage = await browser.newPage();
+ try {
+ const extractionResult = await scrapeFromUrl(locationPage, meta, loc.url || meta.url, loc.title);
+ const sorted = extractionResult.dishes?.sort(compareDish) || [];
+ const lunchInfoWithClosure = addClosureInfoToLunchMetadata(meta.title, extractionResult.lunchInfo || {}, extractionResult.pageText);
+
+ return {
+ ...loc,
+ dishCollection: [
+ {
+ language: config.defaultLanguage,
+ dishes: lunchInfoWithClosure.closureInfo?.isClosed ? [] : sorted,
+ lunchInfo: lunchInfoWithClosure,
+ },
+ ],
+ };
+ } finally {
+ await locationPage.close();
+ }
+ }),
+ );
+
+ const restaurant: RestaurantProps = {
+ title: meta.title,
+ url: meta.url,
+ imageUrl: meta.imageUrl,
+ coordinate: meta.coordinate,
+ googleMapsUrl: meta.googleMapsUrl,
+ locations: locs,
+ dishCollection: [], // Empty for multi-location restaurants
+ };
+
+ return restaurant;
+ } else if (type === 'filtered') {
+ // Scrape once and filter content for each location
+ const content = await buildPageContent(page, meta, meta.url);
+
+ const locs = await Promise.all(
+ locations.map(async (loc) => {
+ const otherLocationFilters = locations
+ .filter((other) => other.title !== loc.title)
+ .map((other) => other.locationFilter || other.title);
+
+ // Reuse the base content but with location-specific filtering
+ const extractionResult = await extractDishesWithFallback(page, content, meta, loc.locationFilter || loc.title, otherLocationFilters);
+ const sorted = extractionResult.dishes?.sort(compareDish) || [];
+ const lunchInfoWithClosure = addClosureInfoToLunchMetadata(meta.title, extractionResult.lunchInfo || {}, content.text);
+
+ return {
+ ...loc,
+ dishCollection: [
+ {
+ language: config.defaultLanguage,
+ dishes: lunchInfoWithClosure.closureInfo?.isClosed ? [] : sorted,
+ lunchInfo: lunchInfoWithClosure,
+ },
+ ],
+ };
+ }),
+ );
+
+ const restaurant: RestaurantProps = {
+ title: meta.title,
+ url: meta.url,
+ imageUrl: meta.imageUrl,
+ coordinate: meta.coordinate,
+ googleMapsUrl: meta.googleMapsUrl,
+ locations: locs,
+ dishCollection: [], // Empty for multi-location restaurants
+ };
+
+ return restaurant;
+ }
+ }
+
+ // Single-location restaurant
+ const extractionResult = await scrapeFromUrl(page, meta, meta.url);
+ const sorted = extractionResult.dishes?.sort(compareDish) || [];
+ const lunchInfoWithClosure = addClosureInfoToLunchMetadata(meta.title, extractionResult.lunchInfo || {}, extractionResult.pageText);
+
+ const restaurant: RestaurantProps = {
+ title: meta.title,
+ url: meta.url,
+ imageUrl: meta.imageUrl,
+ coordinate: meta.coordinate,
+ googleMapsUrl: meta.googleMapsUrl,
+ dishCollection: [
+ {
+ language: config.defaultLanguage,
+ dishes: lunchInfoWithClosure.closureInfo?.isClosed ? [] : sorted,
+ lunchInfo: lunchInfoWithClosure,
+ },
+ ],
+ };
+
+ return restaurant;
+ } catch (error) {
+ logger.error({ title: meta.title, err: error }, 'Error processing restaurant');
+ return null;
+ } finally {
+ await page.close();
+ }
});
- const imageUrlLowQuality = await resizeImage(restaurantMeta.imageUrl, restaurantMeta.title, {
- size: {
- width: 40,
- height: 30,
+ const batchResults = await Promise.all(batchPromises);
+ const validRestaurants = batchResults.filter((r): r is RestaurantProps => r !== null);
+ restaurants.push(...validRestaurants);
+
+ logger.info(
+ {
+ batch: Math.ceil((i + 1) / MAX_CONCURRENT),
+ totalBatches: Math.ceil(metas.length / MAX_CONCURRENT),
+ processed: validRestaurants.length,
},
- quality: 10,
- });
+ 'Processed restaurant batch',
+ );
+ }
- const isClosed = dishes?.some((dish: DishProps) => dish.title?.toLowerCase().includes('stängt'));
-
- const restaurant: RestaurantProps = {
- ...restaurantMeta,
- imageUrl: imageUrl,
- imageUrlLowQuality: imageUrlLowQuality,
- dishCollection: [
- {
- language: config.defaultLanguage,
- dishes: isClosed
- ? []
- : dishes
- ?.map((dish: DishProps) =>
- updateDishType(dish, {
- unknownDishTypeDefault: restaurantMeta?.unknownMealDefault,
- }),
- )
- ?.sort(compareDish),
- },
- ],
- };
+ return restaurants;
+};
- return restaurant;
- } catch (err: unknown) {
- console.error('Error', err);
- return {
- ...restaurantMeta,
- dishCollection: [],
+/**
+ * Main scraping logic - can be called directly or via HTTP
+ */
+export const runScraping = async (): Promise => {
+ logger.info('Starting AI-powered restaurant scraping');
+
+ const browser = await puppeteer.launch({
+ args: !config.development ? ['--disable-gpu'] : [],
+ headless: true,
+ });
+
+ try {
+ // Get restaurant metadata
+ const metas = getRestaurantMetas();
+ logger.info({ count: metas.length }, 'Found restaurants to scrape');
+
+ // Process all restaurants
+ const restaurants = await processRestaurants(browser, metas);
+ logger.info({ count: restaurants.length }, 'Completed scraping');
+
+ await browser.close();
+
+ // Prepare final scrape result
+ const scrape: Scrape = {
+ date: new Date(),
+ restaurants: await translateRestaurants(restaurants),
};
- } finally {
- await page.close();
+
+ // Development mode: save to local file
+ if (config.development) {
+ const fs = await import('fs/promises');
+ const path = await import('path');
+
+ const localFilePath = path.join(process.cwd(), 'scrape.json');
+
+ // If TEST_OVERRIDE is used, merge with existing scrape.json to save time/tokens
+ if (process.env.TEST_OVERRIDE) {
+ try {
+ const existingData = await fs.readFile(localFilePath, 'utf-8');
+ const existingScrape = JSON.parse(existingData) as Scrape;
+
+ // Create a map of scraped restaurants by title for fast lookup
+ const scrapedRestaurantsMap = new Map(
+ scrape.restaurants.map(r => [r.title, r])
+ );
+
+ // Update existing restaurants with new data, keep others unchanged
+ const updatedRestaurants = existingScrape.restaurants.map(existingRestaurant => {
+ const scrapedRestaurant = scrapedRestaurantsMap.get(existingRestaurant.title);
+ return scrapedRestaurant || existingRestaurant;
+ });
+
+ // Add any completely new restaurants (shouldn't happen with TEST_OVERRIDE but just in case)
+ const existingTitles = new Set(existingScrape.restaurants.map(r => r.title));
+ const newRestaurants = scrape.restaurants.filter(r => !existingTitles.has(r.title));
+ updatedRestaurants.push(...newRestaurants);
+
+ const mergedScrape: Scrape = {
+ date: new Date(),
+ restaurants: updatedRestaurants,
+ };
+
+ await fs.writeFile(localFilePath, JSON.stringify(mergedScrape, null, 2));
+ logger.info({
+ updated: scrape.restaurants.length,
+ total: updatedRestaurants.length,
+ path: localFilePath
+ }, 'Updated TEST_OVERRIDE restaurants in existing scrape.json');
+
+ return mergedScrape;
+ } catch (error) {
+ logger.warn({ err: error }, 'Could not read existing scrape.json, creating new file');
+ // Fall through to create new file
+ }
+ }
+
+ // Normal behavior: create complete new file
+ await fs.writeFile(localFilePath, JSON.stringify(scrape, null, 2));
+ logger.info({ count: scrape.restaurants.length, path: localFilePath }, 'Saved restaurants to local file');
+ } else {
+ // Production: upload to storage
+ if (!scrape?.restaurants?.length) {
+ throw new Error('No restaurants scraped successfully');
+ }
+
+ const bucket = storage.bucket(BUCKET_NAME);
+ await bucket.file('scrape.json').save(JSON.stringify(scrape));
+ logger.info({ count: scrape.restaurants.length }, 'Uploaded restaurants to cloud storage');
+ }
+
+ return scrape;
+ } catch (error) {
+ logger.error({ err: error }, 'Scraping failed');
+ await browser.close();
+ throw error;
}
};
+
+// Cloud Function HTTP handler
+ff.http('scrape', async (_req: ff.Request, res: ff.Response) => {
+ void _req;
+ try {
+ const scrape = await runScraping();
+ res.json(scrape);
+ } catch (error) {
+ logger.error({ err: error }, 'Scraping failed');
+ res.sendStatus(500);
+ }
+});
+
+// Direct execution when run as script
+if (import.meta.url === `file://${process.argv[1]}`) {
+ runScraping()
+ .then(() => {
+ logger.info('Scraping completed successfully');
+ process.exit(0);
+ })
+ .catch((error) => {
+ logger.error({ err: error }, 'Direct scraping failed');
+ process.exit(1);
+ });
+}
\ No newline at end of file
diff --git a/apps/functions/scraper/src/scrapers/content.ts b/apps/functions/scraper/src/scrapers/content.ts
new file mode 100644
index 0000000..01754c6
--- /dev/null
+++ b/apps/functions/scraper/src/scrapers/content.ts
@@ -0,0 +1,98 @@
+import type { Page } from 'puppeteer';
+import type { RestaurantMetaProps } from '@devolunch/shared';
+import { logger } from '@devolunch/shared/logger/node';
+
+import { config } from '../config.js';
+import { extractCleanContent, getOptimizationMetrics, CleanedPageContent } from '../utils/contentCleaner.js';
+import { handleInteractiveMenus } from './interactive.js';
+import type { PageContent } from '../types/index.js';
+
+const TIMEOUT = 120000;
+
+/**
+ * Builds PageContent for a given URL with optional content cleaning
+ */
+export const buildPageContent = async (
+ page: Page,
+ meta: RestaurantMetaProps,
+ url: string,
+): Promise => {
+ // Use a common desktop UA to avoid basic bot blocks and ensure PDF viewers behave
+ try {
+ await page.setUserAgent(
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ );
+ await page.setExtraHTTPHeaders({ Referer: url });
+ } catch {
+ logger.warn({ title: meta.title }, 'Error setting user agent or headers');
+ }
+
+ await page.goto(url, { waitUntil: 'networkidle2', timeout: TIMEOUT });
+ await new Promise((resolve) => globalThis.setTimeout(resolve, 1500));
+
+ // Handle interactive menus (day tabs, etc.)
+ await handleInteractiveMenus(page, meta);
+
+ await page.addScriptTag({ content: `(${extractCleanContent.toString()})` });
+
+ let content: PageContent;
+ // Use content cleaner by default, allow restaurant-specific override
+ const useContentCleaner = meta.useContentCleaner ?? config.useContentCleaner;
+
+ if (useContentCleaner) {
+ const originalHtml = await page.content();
+ const cleanedContent: CleanedPageContent = await page.evaluate(extractCleanContent);
+ const metrics = getOptimizationMetrics(originalHtml, cleanedContent);
+ logger.info(
+ { percentSaved: metrics.percentSaved, original: metrics.originalTokens, cleaned: metrics.cleanedTokens },
+ 'Content optimization metrics',
+ );
+ content = {
+ html: cleanedContent.html,
+ text: cleanedContent.text,
+ title: cleanedContent.title,
+ url,
+ images: cleanedContent.images,
+ };
+ } else {
+ const html = await page.content();
+ const title = await page.title();
+ const text = await page.evaluate(() => document.body?.innerText || '');
+
+ // Extract images for Vision API processing (similar to old ai-generic.ts)
+ const images = await page.evaluate(() => {
+ const menuImages: string[] = [];
+ const images = document.querySelectorAll('img[src], img[data-src]');
+
+ images.forEach((img) => {
+ const src = img.getAttribute('src') || img.getAttribute('data-src') || '';
+ const alt = img.getAttribute('alt') || '';
+ const className = img.getAttribute('class') || '';
+ const parentText = img.closest('section, div, article')?.textContent?.toLowerCase() || '';
+
+ const rect = img.getBoundingClientRect();
+ if (rect.width < 200 || rect.height < 150) return;
+
+ const menuKeywords = ['menu', 'meny', 'lunch', 'mat', 'food', 'dagens', 'vecka'];
+ const isMenuRelated = menuKeywords.some(
+ (keyword) =>
+ alt.toLowerCase().includes(keyword) ||
+ className.toLowerCase().includes(keyword) ||
+ parentText.includes(keyword) ||
+ src.toLowerCase().includes(keyword),
+ );
+
+ if (src && (isMenuRelated || menuImages.length < 3)) {
+ const absoluteSrc = src.startsWith('http') ? src : new URL(src, window.location.href).href;
+ menuImages.push(absoluteSrc);
+ }
+ });
+
+ return menuImages.length > 0 ? menuImages : undefined;
+ });
+
+ content = { html, text, title, url, images };
+ }
+
+ return content;
+};
\ No newline at end of file
diff --git a/apps/functions/scraper/src/scrapers/interactive.ts b/apps/functions/scraper/src/scrapers/interactive.ts
new file mode 100644
index 0000000..ccb25c2
--- /dev/null
+++ b/apps/functions/scraper/src/scrapers/interactive.ts
@@ -0,0 +1,115 @@
+import type { Page } from 'puppeteer';
+import type { RestaurantMetaProps } from '@devolunch/shared';
+import { logger } from '@devolunch/shared/logger/node';
+
+/**
+ * Enhanced interactive menu handling for day-specific content
+ * Automatically clicks on day tabs/buttons to show current day's menu
+ */
+export const handleInteractiveMenus = async (page: Page, meta: RestaurantMetaProps): Promise => {
+ // Get current day for targeting the right tab
+ const currentDay = new Date();
+ const dayNames = ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'];
+ const dayNamesEn = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
+ const currentDayIndex = currentDay.getDay();
+ const currentDayName = dayNames[currentDayIndex];
+ const currentDayNameEn = dayNamesEn[currentDayIndex];
+
+ logger.info(
+ { sv: currentDayName, en: currentDayNameEn },
+ 'Looking for interactive day tabs for today',
+ );
+
+ try {
+ // Look for interactive day tabs/buttons
+ const dayTabClicked = await page.evaluate(
+ (dayName, dayNameEn) => {
+ // Common selectors for day tabs
+ const selectors = [
+ `button:contains("${dayName}")`,
+ `button:contains("${dayNameEn}")`,
+ `a:contains("${dayName}")`,
+ `a:contains("${dayNameEn}")`,
+ `[data-day="${dayName}"]`,
+ `[data-day="${dayNameEn}"]`,
+ `[data-day="${dayName.charAt(0).toUpperCase() + dayName.slice(1)}"]`,
+ `.day-${dayName}`,
+ `.day-${dayNameEn}`,
+ `#${dayName}`,
+ `#${dayNameEn}`,
+ `[aria-label*="${dayName}"]`,
+ `[aria-label*="${dayNameEn}"]`,
+ `[title*="${dayName}"]`,
+ `[title*="${dayNameEn}"]`,
+ ];
+
+ // Helper function to check if element contains text (case insensitive)
+ const containsText = (element: Element, text: string): boolean => {
+ return element.textContent?.toLowerCase().includes(text.toLowerCase()) || false;
+ };
+
+ // Find and click day-specific elements
+ for (const selector of selectors) {
+ try {
+ if (selector.includes(':contains')) {
+ // Handle pseudo-selector manually
+ const baseSelector = selector.split(':contains')[0];
+ const searchText = selector.match(/\\("([^"]+)"\\)/)?.[1];
+ if (searchText) {
+ const elements = document.querySelectorAll(baseSelector);
+ for (const element of elements) {
+ if (containsText(element, searchText)) {
+ console.log(`📅 Clicking day tab: ${searchText}`);
+ (element as HTMLElement).click();
+ return true;
+ }
+ }
+ }
+ } else {
+ const element = document.querySelector(selector);
+ if (element) {
+ console.log(`📅 Clicking day element: ${selector}`);
+ (element as HTMLElement).click();
+ return true;
+ }
+ }
+ } catch {
+ console.log(`⚠️ Error clicking day element: ${selector}`);
+ }
+ }
+
+ // Fallback: look for any clickable elements with day names
+ const allClickables = document.querySelectorAll('button, a, [onclick], [data-day], .day, .tab');
+ for (const element of allClickables) {
+ if (containsText(element, dayName) || containsText(element, dayNameEn)) {
+ console.log(`📅 Clicking found day element with text: ${element.textContent?.substring(0, 50)}`);
+ (element as HTMLElement).click();
+ return true;
+ }
+ }
+
+ return false;
+ },
+ currentDayName,
+ currentDayNameEn,
+ );
+
+ if (dayTabClicked) {
+ logger.info({ day: currentDayName }, 'Clicked day tab; waiting for content');
+ await new Promise((resolve) => globalThis.setTimeout(resolve, 2000)); // Wait for dynamic content
+
+ // Wait for any loading indicators to disappear
+ try {
+ await page.waitForFunction(() => !document.querySelector('.loading, .spinner, [data-loading="true"]'), {
+ timeout: 5000,
+ });
+ } catch {
+ logger.warn({ title: meta.title }, 'Error waiting for loading indicators to disappear');
+ }
+ } else {
+ logger.info({ title: meta.title }, 'No interactive day tabs found');
+ }
+ } catch (error) {
+ logger.warn({ err: error }, 'Error handling interactive menus');
+ }
+};
\ No newline at end of file
diff --git a/apps/functions/scraper/src/services/aiMenuExtractor.ts b/apps/functions/scraper/src/services/aiMenuExtractor.ts
new file mode 100644
index 0000000..47d67b9
--- /dev/null
+++ b/apps/functions/scraper/src/services/aiMenuExtractor.ts
@@ -0,0 +1,145 @@
+import type { ChatCompletionMessageParam, ChatCompletionContentPart } from 'openai/resources/chat/completions';
+import type { RestaurantMetaProps } from '@devolunch/shared';
+import { logger } from '@devolunch/shared/logger/node';
+
+import { getOpenAI } from '../clients/openai.js';
+import { createMenuExtractionPrompt, createMenuExtractionInstructions } from '../prompts/menuExtraction.js';
+import { parseAIResponse, normalizeResult } from '../parsers/aiResponse.js';
+import type { PageContent, MenuExtractionResult } from '../types/index.js';
+
+/**
+ * Main entry point for AI-powered menu extraction
+ */
+export const extractMenuWithAI = async (
+ pageContent: PageContent,
+ restaurantMeta: RestaurantMetaProps,
+ locationFilter?: string,
+): Promise => {
+ try {
+ // Check if we have images that might contain menu information
+ const hasMenuImages = pageContent.images && pageContent.images.length > 0;
+
+ if (hasMenuImages) {
+ logger.info(
+ { imageCount: pageContent.images?.length || 0 },
+ 'Found images; using Vision API for menu extraction',
+ );
+ return await extractMenuFromImagesWithAI(pageContent, restaurantMeta, locationFilter);
+ }
+
+ const prompt = createMenuExtractionPrompt(pageContent, restaurantMeta, locationFilter);
+
+ const completion = await getOpenAI().chat.completions.create({
+ model: 'gpt-4o-mini', // Cost-effective model good for structured tasks
+ max_tokens: 3000, // Increased to handle many dishes
+ temperature: 0.0, // Use lowest temperature to reduce hallucinations
+ response_format: { type: 'json_object' },
+ messages: [
+ {
+ role: 'system',
+ content:
+ "You are a precise menu extraction assistant for Swedish restaurants. Extract dishes that appear on the menu for TODAY'S weekday, AND always include vegetarian/vegan options even if they span multiple days (e.g., 'Mån-Ons'). NEVER add or invent dishes that are not explicitly listed. Exclude dinner/evening/à la carte items, sides, desserts, snacks, kids menus, and drinks. Output strictly valid JSON.",
+ },
+ {
+ role: 'user',
+ content: prompt,
+ },
+ ],
+ });
+
+ const responseText = completion.choices[0]?.message?.content;
+ if (!responseText) {
+ throw new Error('No response content from OpenAI');
+ }
+
+ const rawResult = parseAIResponse(responseText);
+ const result = normalizeResult(rawResult);
+ logger.info(
+ { count: result.dishes.length, confidence: result.confidence },
+ 'OpenAI extracted dishes',
+ );
+ logger.debug({ reasoning: result.reasoning }, 'AI reasoning');
+
+ return result;
+ } catch (error) {
+ logger.error({ err: error }, 'AI menu extraction failed');
+ return {
+ dishes: [],
+ confidence: 0,
+ reasoning: `AI extraction failed: ${error}`,
+ };
+ }
+};
+
+/**
+ * Extracts menu from images using OpenAI Vision API
+ */
+const extractMenuFromImagesWithAI = async (
+ pageContent: PageContent,
+ _restaurantMeta: RestaurantMetaProps,
+ locationFilter?: string,
+): Promise => {
+ try {
+ const weekdaySv = new Date().toLocaleDateString('sv-SE', { weekday: 'long' });
+ const instructions = createMenuExtractionInstructions(weekdaySv, locationFilter);
+
+ const messages: ChatCompletionMessageParam[] = [
+ {
+ role: 'system',
+ content:
+ "You are a precise menu extraction assistant for Swedish restaurants. Extract dishes that appear on the menu for TODAY'S weekday, AND always include vegetarian/vegan options even if they span multiple days (e.g., 'Mån-Ons'). NEVER add or invent dishes that are not explicitly listed. Exclude dinner/evening/à la carte items, sides, desserts, snacks, kids menus, and drinks. Output strictly valid JSON.",
+ },
+ {
+ role: 'user',
+ content: [
+ {
+ type: 'text',
+ text: `${instructions}\\n\\nPlease analyze these menu images and extract lunch dishes according to the instructions above.`,
+ },
+ ...(pageContent.images?.slice(0, 4).map(
+ (imageUrl): ChatCompletionContentPart => ({
+ type: 'image_url',
+ image_url: {
+ url: imageUrl,
+ detail: 'high',
+ },
+ }),
+ ) || []),
+ ],
+ },
+ ];
+
+ const completion = await getOpenAI().chat.completions.create({
+ model: 'gpt-4o', // Vision requires gpt-4o
+ max_tokens: 3000,
+ temperature: 0.0,
+ response_format: { type: 'json_object' },
+ messages,
+ });
+
+ const responseText = completion.choices[0]?.message?.content;
+ if (!responseText) {
+ throw new Error('No response content from OpenAI Vision API');
+ }
+
+ const rawResult = parseAIResponse(responseText);
+ const result = normalizeResult(rawResult);
+ logger.info(
+ { count: result.dishes.length, confidence: result.confidence },
+ 'OpenAI Vision extracted dishes',
+ );
+ logger.debug({ reasoning: result.reasoning }, 'AI Vision reasoning');
+
+ return result;
+ } catch (error) {
+ logger.error({ err: error }, 'Vision API extraction failed');
+ return {
+ dishes: [],
+ confidence: 0,
+ reasoning: `Vision API Error: ${error}`,
+ };
+ }
+};
+
+// Re-export types for backward compatibility
+export type { PageContent, MenuExtractionResult };
\ No newline at end of file
diff --git a/apps/functions/scraper/src/services/dishExtractor.ts b/apps/functions/scraper/src/services/dishExtractor.ts
new file mode 100644
index 0000000..e67af08
--- /dev/null
+++ b/apps/functions/scraper/src/services/dishExtractor.ts
@@ -0,0 +1,257 @@
+import type { Page } from 'puppeteer';
+import type { RestaurantMetaProps } from '@devolunch/shared';
+import { logger } from '@devolunch/shared/logger/node';
+
+import { config } from '../config.js';
+import { extractMenuWithAI } from './aiMenuExtractor.js';
+import { extractPdfContent } from '../processors/pdf.js';
+import { extractCleanContent } from '../utils/contentCleaner.js';
+import type { PageContent, MenuExtractionResult } from '../types/index.js';
+
+/**
+ * Attempts to extract dishes with multiple fallback strategies:
+ * 1. Text extraction from HTML
+ * 2. PDF extraction (if PDF links found)
+ * 3. Image extraction (Vision API)
+ * 4. Delayed text extraction (for slow-loading content)
+ */
+export const extractDishesWithFallback = async (
+ page: Page,
+ content: PageContent,
+ meta: RestaurantMetaProps,
+ locationFilter?: string,
+ otherLocationFilters?: string[],
+): Promise => {
+ const minConfidence = 0.5;
+
+ // Special handling for Sankt Knut which has heavy JavaScript and needs content cleaning
+ const isStanktKnut = locationFilter === 'Sankt Knut';
+ const useContentCleanerOverride = isStanktKnut ? true : (meta.useContentCleaner ?? config.useContentCleaner);
+
+ // Helper: compile regex from a filter string (supports alternations already)
+ const compile = (pat: string) => new RegExp(pat, 'i');
+ const targetRe = locationFilter ? compile(locationFilter) : null;
+ const othersRe = otherLocationFilters?.length
+ ? new RegExp(otherLocationFilters.map((p) => `(${p})`).join('|'), 'i')
+ : null;
+
+ const narrowTextByLocation = (text: string): string => {
+ if (!targetRe) return text;
+ const lines = text.split('\n');
+ const segments: string[] = [];
+ let i = 0;
+ while (i < lines.length) {
+ if (targetRe.test(lines[i])) {
+ // capture from a bit above to include heading
+ let start = Math.max(0, i - 2);
+ let j = i + 1;
+ while (j < lines.length) {
+ if (othersRe && othersRe.test(lines[j])) break;
+ j++;
+ }
+ segments.push(lines.slice(start, j).join('\n'));
+ i = j;
+ } else {
+ i++;
+ }
+ }
+ if (segments.length === 0) return text; // fallback
+ return segments.join('\n\n');
+ };
+
+ // STEP 1: Try text extraction (with special handling for Sankt Knut)
+ if (isStanktKnut) {
+ logger.info('Sankt Knut detected: Using content cleaning for initial attempt');
+ // Wait for dynamic content to load
+ await new Promise((resolve) => globalThis.setTimeout(resolve, 10000));
+
+ // Use content cleaning for Sankt Knut (text only, no images)
+ const cleanedContent = await page.evaluate(extractCleanContent);
+ const sankKnutContent: PageContent = {
+ html: cleanedContent.html,
+ // Don't narrow by location since we're already on the Sankt Knut-specific page
+ text: cleanedContent.text,
+ title: cleanedContent.title,
+ url: cleanedContent.url,
+ images: undefined, // No images for Spoonery - text extraction only
+ };
+
+ const sankKnutResult = await extractMenuWithAI(sankKnutContent, meta, locationFilter);
+ if (sankKnutResult.dishes.length > 0) {
+ logger.info({ count: sankKnutResult.dishes.length }, 'Sankt Knut SUCCESS: dishes extracted with content cleaning');
+ return sankKnutResult;
+ }
+ }
+
+ logger.info('Attempt 1: Text extraction from HTML');
+ const textOnlyContent: PageContent = {
+ ...content,
+ text: locationFilter ? narrowTextByLocation(content.text) : content.text,
+ images: undefined, // No images for text-only attempt
+ };
+
+ const textResult = await extractMenuWithAI(textOnlyContent, meta, locationFilter);
+ const acceptText = textResult.dishes.length > 0 && (config.development || textResult.confidence >= minConfidence);
+ if (acceptText) {
+ logger.info(
+ {
+ count: textResult.dishes.length,
+ confidence: textResult.confidence,
+ minConfidence,
+ dev: !!config.development,
+ locationFilter,
+ },
+ 'Step 1 SUCCESS: dishes from text',
+ );
+ return textResult;
+ } else if (textResult.dishes.length > 0) {
+ logger.info(
+ { confidence: textResult.confidence, minConfidence, locationFilter },
+ 'Step 1 low confidence; trying PDF',
+ );
+ } else {
+ logger.info('Step 1: No dishes found in text content');
+ }
+
+ // STEP 2: Try PDF extraction
+ logger.info('Attempt 2: PDF link detection and processing');
+ const pdfUrl = await page.evaluate(() => {
+ const lunchKeywords = ['lunch', 'lunchmeny', 'dagens lunch', 'veckans lunch', 'weekly menu', 'week'];
+ const generalMenuKeywords = ['meny', 'menu'];
+ const links = Array.from(document.querySelectorAll('a[href]')) as HTMLAnchorElement[];
+
+ let bestMatch: string | null = null;
+ let bestScore = 0;
+
+ for (const link of links) {
+ const href = link.getAttribute('href');
+ const text = link.innerText?.toLowerCase() || '';
+ const title = link.getAttribute('title')?.toLowerCase() || '';
+ const ariaLabel = link.getAttribute('aria-label')?.toLowerCase() || '';
+ const allText = `${text} ${title} ${ariaLabel}`;
+
+ if (href && href.toLowerCase().includes('.pdf')) {
+ // Score based on how lunch-specific the link is
+ let score = 0;
+
+ for (const keyword of lunchKeywords) {
+ if (allText.includes(keyword) || href.toLowerCase().includes(keyword)) {
+ score += keyword === 'lunch' || keyword === 'lunchmeny' ? 10 : 5;
+ }
+ }
+
+ // Also check for week/date patterns that suggest current menus
+ if (href.match(/v\\.?\\s*\\d{1,2}/i) || href.match(/week\\s*\\d{1,2}/i) || href.match(/vecka\\s*\\d{1,2}/i)) {
+ score += 3;
+ }
+
+ if (score > bestScore) {
+ bestMatch = href.startsWith('http') ? href : new URL(href, window.location.href).href;
+ bestScore = score;
+ } else if (score === 0) {
+ // Fallback to general menu PDFs
+ for (const keyword of generalMenuKeywords) {
+ if (allText.includes(keyword) || href.toLowerCase().includes(keyword)) {
+ if (!bestMatch && bestScore === 0) {
+ bestMatch = href.startsWith('http') ? href : new URL(href, window.location.href).href;
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ console.log(`PDF search found: ${bestMatch} (score: ${bestScore})`);
+ return bestMatch;
+ });
+
+ if (pdfUrl) {
+ logger.info({ pdfUrl }, 'Found PDF menu');
+ const pdfText = await extractPdfContent(pdfUrl);
+
+ if (pdfText && pdfText.trim().length > 50) {
+ const narrowedPdfText = locationFilter ? narrowTextByLocation(pdfText) : pdfText;
+ const pdfContent: PageContent = {
+ html: `PDF Menu Content
`,
+ text: narrowedPdfText,
+ title: `${meta.title} - PDF Menu`,
+ url: pdfUrl,
+ };
+
+ const pdfResult = await extractMenuWithAI(pdfContent, meta, locationFilter);
+ if (pdfResult.dishes.length > 0) {
+ logger.info({ count: pdfResult.dishes.length }, 'Step 2 SUCCESS: dishes from PDF');
+ return pdfResult;
+ } else {
+ logger.info({ confidence: pdfResult.confidence }, 'Step 2: PDF found but no dishes extracted');
+ }
+ } else {
+ logger.info('Step 2: PDF text extraction failed or insufficient content');
+ }
+ } else {
+ logger.info('Step 2: No PDF links detected');
+ }
+
+ // STEP 3: Try image extraction (Vision API)
+ if (content.images && content.images.length > 0) {
+ logger.info('Attempt 3: Image extraction with Vision API');
+ const imageWithTextContent: PageContent = {
+ html: content.html,
+ text: locationFilter ? narrowTextByLocation(content.text) : content.text,
+ title: content.title,
+ url: content.url,
+ images: content.images,
+ };
+
+ const imageResult = await extractMenuWithAI(imageWithTextContent, meta, locationFilter);
+ if (imageResult.dishes.length > 0) {
+ logger.info({ count: imageResult.dishes.length }, 'Step 3 SUCCESS: dishes from images');
+ return imageResult;
+ } else {
+ logger.info({ confidence: imageResult.confidence }, 'Step 3: Images found but no dishes extracted');
+ }
+ } else {
+ logger.info('Step 3: No images found for Vision API processing');
+ }
+
+ // STEP 4: Wait and retry text extraction for slow-loading content
+ logger.info('Attempt 4: Waiting for slow-loading content and retrying text extraction');
+ await new Promise((resolve) => globalThis.setTimeout(resolve, 7000)); // Wait 7 seconds for dynamic content
+
+ // Re-extract content after waiting
+ let retryContent: PageContent;
+
+ if (useContentCleanerOverride) {
+ const cleanedRetryContent = await page.evaluate(extractCleanContent);
+ retryContent = {
+ html: cleanedRetryContent.html,
+ text: cleanedRetryContent.text,
+ title: cleanedRetryContent.title,
+ url: cleanedRetryContent.url,
+ images: cleanedRetryContent.images,
+ };
+ } else {
+ const html = await page.content();
+ const title = await page.title();
+ const text = await page.evaluate(() => document.body?.innerText || '');
+ retryContent = { html, text, title, url: content.url };
+ }
+
+ const retryTextContent: PageContent = {
+ ...retryContent,
+ text: locationFilter ? narrowTextByLocation(retryContent.text) : retryContent.text,
+ images: undefined, // Text-only for final attempt
+ };
+
+ const retryResult = await extractMenuWithAI(retryTextContent, meta, locationFilter);
+ if (retryResult.dishes.length > 0) {
+ logger.info({ count: retryResult.dishes.length }, 'Step 4 SUCCESS: dishes from delayed text extraction');
+ return retryResult;
+ } else {
+ logger.info('Step 4: Still no dishes after waiting for dynamic content');
+ }
+
+ logger.warn({ locationFilter }, 'All 4 extraction attempts failed');
+ return { dishes: [], confidence: 0, reasoning: 'All extraction attempts failed', lunchInfo: undefined };
+};
\ No newline at end of file
diff --git a/apps/functions/scraper/src/types/index.ts b/apps/functions/scraper/src/types/index.ts
new file mode 100644
index 0000000..5f41b34
--- /dev/null
+++ b/apps/functions/scraper/src/types/index.ts
@@ -0,0 +1,20 @@
+import type { DishProps } from '@devolunch/shared';
+
+export interface PageContent {
+ html: string;
+ text: string;
+ title: string;
+ url: string;
+ images?: string[];
+}
+
+export interface MenuExtractionResult {
+ dishes: DishProps[];
+ confidence: number;
+ reasoning: string;
+ lunchInfo?: {
+ servingTimes?: string;
+ includedItems?: string[];
+ specialNotes?: string;
+ };
+}
diff --git a/apps/functions/scraper/src/types/pdf-parse.d.ts b/apps/functions/scraper/src/types/pdf-parse.d.ts
new file mode 100644
index 0000000..dc8f145
--- /dev/null
+++ b/apps/functions/scraper/src/types/pdf-parse.d.ts
@@ -0,0 +1,20 @@
+declare module 'pdf-parse/lib/pdf-parse.js' {
+ interface PdfParseOptions {
+ version?: string;
+ max?: number;
+ normalizeWhitespace?: boolean;
+ }
+
+ interface PdfParseResult {
+ numpages: number;
+ numrender: number;
+ info: Record;
+ metadata: Record;
+ text: string;
+ version: string;
+ }
+
+ const pdf: (data: Buffer | Uint8Array, options?: PdfParseOptions) => Promise;
+ export default pdf;
+}
+
diff --git a/apps/functions/scraper/src/utils/closureDetection.ts b/apps/functions/scraper/src/utils/closureDetection.ts
new file mode 100644
index 0000000..759629f
--- /dev/null
+++ b/apps/functions/scraper/src/utils/closureDetection.ts
@@ -0,0 +1,185 @@
+import { ClosureInfo } from '@devolunch/shared';
+import { logger } from '@devolunch/shared/logger/node';
+
+/**
+ * Known restaurant closure patterns
+ */
+const KNOWN_CLOSURES: Record = {
+ 'marie antoinette': ['monday', 'tuesday'],
+ 'marvin': ['monday', 'tuesday'],
+ // Add more restaurants as needed
+};
+
+/**
+ * Day names for calculation
+ */
+const DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
+const WEEKDAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
+
+/**
+ * Detects closure information for a restaurant based on current day and known patterns
+ */
+export function detectClosureInfo(restaurantName: string, pageContent?: string): ClosureInfo | null {
+ // First check for dynamic closure/booking patterns in page content
+ if (pageContent) {
+ const dynamicClosure = detectDynamicClosure(pageContent);
+ if (dynamicClosure) {
+ logger.info({
+ restaurant: restaurantName,
+ reason: dynamicClosure.reason
+ }, 'Detected dynamic closure/booking');
+ return dynamicClosure;
+ }
+ }
+
+ // Fall back to known closure patterns
+ const normalizedName = restaurantName.toLowerCase();
+ const closedDays = KNOWN_CLOSURES[normalizedName];
+
+ if (!closedDays || closedDays.length === 0) {
+ return null;
+ }
+
+ const today = new Date();
+ const currentDay = DAYS[today.getDay()];
+
+ const isClosed = closedDays.includes(currentDay);
+
+ if (!isClosed) {
+ return null;
+ }
+
+ // Calculate when they reopen
+ const reopensOn = calculateReopeningDay(closedDays, today);
+
+ const reason = formatClosureReason(closedDays);
+
+ logger.info({
+ restaurant: restaurantName,
+ currentDay,
+ closedDays,
+ isClosed,
+ reopensOn
+ }, 'Detected restaurant closure');
+
+ return {
+ isClosed: true,
+ reason,
+ reopensOn,
+ closedDays
+ };
+}
+
+/**
+ * Detects dynamic closure patterns like "ABONNERAT" (booked/private event)
+ */
+function detectDynamicClosure(pageContent: string): ClosureInfo | null {
+ const today = new Date();
+ const todaySv = ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'][today.getDay()];
+
+ // Check for "ABONNERAT" or similar booking patterns
+ const bookingPatterns = [
+ /abonnerat/i,
+ /privat\s+event/i,
+ /stängt\s+för\s+privat/i,
+ /fully\s+booked/i,
+ /helt\s+bokad/i,
+ ];
+
+ const hasBookingText = bookingPatterns.some(pattern => pattern.test(pageContent));
+
+ if (!hasBookingText) {
+ return null;
+ }
+
+ // Check if today is affected
+ const lines = pageContent.toLowerCase().split('\n');
+ const todayAffected = lines.some(line => {
+ const lineContainsTodaySv = line.includes(todaySv);
+ const lineContainsBooking = bookingPatterns.some(pattern => pattern.test(line));
+ return lineContainsTodaySv && lineContainsBooking;
+ });
+
+ // Also check for "hela veckan" (whole week) patterns
+ const wholeWeekPattern = /hela\s+veckan|entire\s+week|whole\s+week/i;
+ const isWholeWeekBooked = wholeWeekPattern.test(pageContent) && hasBookingText;
+
+ if (todayAffected || isWholeWeekBooked) {
+ return {
+ isClosed: true,
+ reason: 'Private event (Abonnerat)',
+ reopensOn: 'Check website for availability',
+ closedDays: [] // Dynamic, not regular closure pattern
+ };
+ }
+
+ return null;
+}
+
+/**
+ * Formats closure reason for display
+ */
+function formatClosureReason(closedDays: string[]): string {
+ if (closedDays.length === 1) {
+ return `Closed on ${closedDays[0].charAt(0).toUpperCase() + closedDays[0].slice(1)}s`;
+ }
+
+ if (closedDays.length === 2) {
+ const [first, second] = closedDays.map(day => day.charAt(0).toUpperCase() + day.slice(1) + 's');
+ return `Closed ${first} and ${second}`;
+ }
+
+ const formatted = closedDays.map(day => day.charAt(0).toUpperCase() + day.slice(1) + 's');
+ const lastDay = formatted.pop();
+ return `Closed ${formatted.join(', ')} and ${lastDay}`;
+}
+
+/**
+ * Calculates the next day the restaurant will be open
+ */
+function calculateReopeningDay(closedDays: string[], currentDate: Date): string {
+ const closedDayIndices = closedDays.map(day => DAYS.indexOf(day));
+
+ // Start checking from tomorrow
+ let checkDate = new Date(currentDate);
+ checkDate.setDate(checkDate.getDate() + 1);
+
+ // Check up to 7 days ahead
+ for (let i = 0; i < 7; i++) {
+ const dayIndex = checkDate.getDay();
+
+ if (!closedDayIndices.includes(dayIndex)) {
+ if (i === 0) {
+ return 'tomorrow';
+ } else if (i === 1) {
+ return 'the day after tomorrow';
+ } else {
+ return WEEKDAYS[dayIndex];
+ }
+ }
+
+ checkDate.setDate(checkDate.getDate() + 1);
+ }
+
+ return 'next week';
+}
+
+/**
+ * Adds closure detection to scraped restaurant data
+ */
+export function addClosureInfoToLunchMetadata(
+ restaurantName: string,
+ lunchMetadata: any,
+ pageContent?: string
+): any {
+ const closureInfo = detectClosureInfo(restaurantName, pageContent);
+
+ if (!closureInfo) {
+ return lunchMetadata;
+ }
+
+ return {
+ ...lunchMetadata,
+ closureInfo
+ };
+}
diff --git a/apps/functions/scraper/src/utils/contentCleaner.ts b/apps/functions/scraper/src/utils/contentCleaner.ts
new file mode 100644
index 0000000..d163a02
--- /dev/null
+++ b/apps/functions/scraper/src/utils/contentCleaner.ts
@@ -0,0 +1,131 @@
+/**
+ * Content cleaner utility to strip unnecessary HTML content and reduce token usage
+ * for AI menu extraction while preserving the essential menu information.
+ */
+
+export interface CleanedPageContent {
+ text: string;
+ html: string;
+ title: string;
+ url: string;
+ images?: string[];
+}
+
+/**
+ * Extracts and cleans page content in the browser context
+ * Removes unnecessary elements like scripts, styles, ads, etc.
+ * while preserving menu-relevant content.
+ */
+export const extractCleanContent = (): CleanedPageContent => {
+ // Only remove truly non-content elements - keep all visible content
+ const elementsToRemove = [
+ 'script',
+ 'style',
+ 'noscript',
+ 'link[rel="stylesheet"]',
+ 'meta:not([name="description"]):not([name="keywords"]):not([property])',
+ ];
+
+ // Clone the document to avoid modifying the original
+ const cleanDoc = document.cloneNode(true) as Document;
+
+ // Remove unwanted elements
+ elementsToRemove.forEach((selector) => {
+ try {
+ const elements = cleanDoc.querySelectorAll(selector);
+ elements.forEach((el) => el.remove());
+ } catch (_e) {
+ // Ignore selector errors
+ }
+ });
+
+ // Strip attributes from all elements while keeping structure
+ const stripAttributes = (element: Element) => {
+ // Keep only essential attributes that might be needed for content understanding
+ const keepAttributes = ['href', 'src', 'alt', 'title'];
+
+ const attributes = Array.from(element.attributes);
+ attributes.forEach((attr) => {
+ if (!keepAttributes.includes(attr.name)) {
+ element.removeAttribute(attr.name);
+ }
+ });
+
+ // Recursively process child elements
+ Array.from(element.children).forEach((child) => {
+ stripAttributes(child);
+ });
+ };
+
+ // Strip attributes from the entire document
+ if (cleanDoc.documentElement) {
+ stripAttributes(cleanDoc.documentElement);
+ }
+
+ // Use full body content and stripped HTML
+ const body = cleanDoc.body;
+ const fullContent = body ? body.textContent?.trim() || '' : '';
+ const strippedHtml = cleanDoc.documentElement ? cleanDoc.documentElement.innerHTML : '';
+
+ // Extract menu-relevant images
+ const menuImages: string[] = [];
+ const images = document.querySelectorAll('img[src], img[data-src]');
+
+ images.forEach((img) => {
+ const src = img.getAttribute('src') || img.getAttribute('data-src') || '';
+ const alt = img.getAttribute('alt') || '';
+ const className = img.getAttribute('class') || '';
+ const parentText = img.closest('section, div, article')?.textContent?.toLowerCase() || '';
+
+ const rect = img.getBoundingClientRect();
+ if (rect.width < 100 || rect.height < 75) return; // Skip tiny images
+
+ const menuKeywords = ['menu', 'meny', 'lunch', 'mat', 'food', 'dagens', 'vecka', 'dish', 'rätt'];
+ const isMenuRelated = menuKeywords.some(
+ (keyword) =>
+ alt.toLowerCase().includes(keyword) ||
+ className.toLowerCase().includes(keyword) ||
+ parentText.includes(keyword) ||
+ src.toLowerCase().includes(keyword),
+ );
+
+ if (src && (isMenuRelated || menuImages.length < 2)) {
+ // Limit to 2 images max
+ const absoluteSrc = src.startsWith('http') ? src : new URL(src, window.location.href).href;
+ menuImages.push(absoluteSrc);
+ }
+ });
+
+ return {
+ text: fullContent.slice(0, 50000), // Significantly increased for Sankt Knut
+ html: strippedHtml.slice(0, 60000), // Increased HTML limit as well
+ title: document.title,
+ url: window.location.href,
+ images: menuImages.length > 0 ? menuImages : undefined,
+ };
+};
+
+/**
+ * Token estimation utility
+ */
+export const estimateTokenCount = (text: string): number => {
+ // Rough estimation: ~4 characters per token for typical text
+ return Math.ceil(text.length / 4);
+};
+
+/**
+ * Content optimization metrics
+ */
+export const getOptimizationMetrics = (originalHtml: string, cleanedContent: CleanedPageContent) => {
+ const originalTokens = estimateTokenCount(originalHtml);
+ const cleanedTokens = estimateTokenCount(cleanedContent.text + cleanedContent.html);
+ const tokenSavings = originalTokens - cleanedTokens;
+ const percentSaved = Math.round((tokenSavings / originalTokens) * 100);
+
+ return {
+ originalTokens,
+ cleanedTokens,
+ tokenSavings,
+ percentSaved,
+ };
+};
diff --git a/apps/functions/scraper/src/utils/dish-type-lookup.ts b/apps/functions/scraper/src/utils/dish-type-lookup.ts
deleted file mode 100644
index 42866b3..0000000
--- a/apps/functions/scraper/src/utils/dish-type-lookup.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { DishProps, DishType } from '@devolunch/shared';
-
-import { keywordGroups } from '../data/keywords.js';
-
-export interface OptionProps {
- unknownDishTypeDefault: DishType;
-}
-
-const isKeywordPrefixedWith = (lookupString: string, keyword: string, word: string): boolean => {
- const keywordPosition = lookupString.indexOf(keyword);
-
- // use a regular expression to find the last word before the keyword
- const lastWordMatch = lookupString.substring(0, keywordPosition).match(/\b\w+\s*$/);
- const lastWord = lastWordMatch ? lastWordMatch[0].trim() : '';
-
- return lastWord === word;
-};
-
-const findKeywordInLookup = (keywords: string[], lookupString: string): boolean => {
- // use a regular expression to split the lookup string into sentences
- const sentences = lookupString.match(/[^.!?]+[.!?]+/g) || [lookupString];
-
- const sentencesWithoutWord = sentences.filter((sentence) => !sentence.includes('lägg till'));
-
- return keywords.some((keyword) => {
- const keywordWithoutPrefix = isKeywordPrefixedWith(sentencesWithoutWord.join('.'), keyword, 'utan');
- return sentencesWithoutWord.some((sentence) => sentence.includes(keyword) && !keywordWithoutPrefix);
- });
-};
-
-export const determineDishType = (lookupString: string, unknownDishTypeDefault: DishType): DishType => {
- const lowerCaseLookupString = lookupString.toLowerCase();
-
- for (const { keywords, type } of keywordGroups) {
- if (findKeywordInLookup(keywords, lowerCaseLookupString)) {
- return type;
- }
- }
-
- return unknownDishTypeDefault;
-};
-
-export const updateDishType = (dish: DishProps, { unknownDishTypeDefault = 'misc' }: OptionProps): DishProps => ({
- ...dish,
- type:
- dish.title && !dish.type
- ? determineDishType(`${dish.title} ${dish.description}`, unknownDishTypeDefault)
- : dish.type,
-});
diff --git a/apps/functions/scraper/src/utils/image-resizer.ts b/apps/functions/scraper/src/utils/image-resizer.ts
deleted file mode 100644
index 189360f..0000000
--- a/apps/functions/scraper/src/utils/image-resizer.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import sharp from 'sharp';
-
-import { BUCKET_NAME, storage } from '../index.js';
-
-interface ResizeImageOptions {
- size: {
- width: number;
- height: number;
- };
- quality: number;
-}
-
-export default async (imageUrl: string, imageName: string, options: ResizeImageOptions) => {
- const bucket = storage.bucket(BUCKET_NAME);
-
- const titleFileName = imageName.toLowerCase().replace(/[^a-z]+/, '');
-
- const file = bucket.file(`images/${titleFileName}-q${options.quality}.webp`);
- const existsArray = await file.exists();
- const exists = existsArray[0];
-
- if (!exists) {
- if (!imageUrl) {
- return '';
- }
-
- const res = await fetch(imageUrl);
- const imageBuffer = await res.arrayBuffer();
-
- const writeStream = bucket.file(`images/${titleFileName}-q${options.quality}.webp`).createWriteStream();
-
- await new Promise((resolve, reject) => {
- sharp(imageBuffer)
- .on('error', (err) => {
- console.error(titleFileName, err);
- reject();
- })
- .on('end', () => {
- resolve();
- })
- .on('finish', () => {
- resolve();
- })
- .resize(options.size.width, options.size.height, {
- fit: 'cover',
- })
- .withMetadata()
- .webp({
- quality: options.quality,
- })
- .pipe(writeStream);
- });
- }
-
- const [url] = await file.getSignedUrl({ action: 'read', expires: '01-01-2026' });
- return url;
-};
diff --git a/apps/functions/scraper/src/utils/storage.ts b/apps/functions/scraper/src/utils/storage.ts
new file mode 100644
index 0000000..a5f3454
--- /dev/null
+++ b/apps/functions/scraper/src/utils/storage.ts
@@ -0,0 +1,7 @@
+import { Storage } from '@google-cloud/storage';
+
+export const BUCKET_NAME = 'devolunchv2';
+
+export const storage = new Storage({
+ projectId: 'devolunch',
+});
diff --git a/apps/functions/scraper/src/utils/translator.ts b/apps/functions/scraper/src/utils/translator.ts
index 24e85c2..590f109 100644
--- a/apps/functions/scraper/src/utils/translator.ts
+++ b/apps/functions/scraper/src/utils/translator.ts
@@ -1,7 +1,8 @@
import { v2 } from '@google-cloud/translate';
-import { config } from '../index.js';
-import { DishProps, RestaurantProps } from '@devolunch/shared';
+import { config } from '../config.js';
+import { logger } from '@devolunch/shared/logger/node';
+import { DishProps, RestaurantProps, RestaurantLocation } from '@devolunch/shared';
const translate = new v2.Translate({
projectId: 'devolunch',
@@ -9,12 +10,12 @@ const translate = new v2.Translate({
export const translateText = async (from: string, to: string, originalText: DishProps['title']) => {
if (!originalText?.length) {
- console.error('Text to translate is not defined');
+ logger.error('Text to translate is not defined');
return '';
}
if (!from?.length || !to?.length) {
- console.error(`Either 'from' or 'to' language is not defined, to: ${to}, from: ${from}`);
+ logger.error(`Either 'from' or 'to' language is not defined, to: ${to}, from: ${from}`);
return '';
}
@@ -29,25 +30,75 @@ const translateRestaurant = async (restaurant: RestaurantProps) => {
try {
await Promise.all(
config.translateLanguages.split(',')?.map(async (language: string) => {
- restaurant.dishCollection?.push({
- language,
- dishes: restaurant.dishCollection.filter((a) => a.dishes?.length).length
- ? await Promise.all(
- restaurant.dishCollection[0]?.dishes?.map(async (dish) => ({
- ...dish,
- title: await translateText(config.defaultLanguage, language, dish.title),
- })),
- )
- : [],
- });
+ // Translate top-level dishes (single-location)
+ if (restaurant.dishCollection) {
+ restaurant.dishCollection.push({
+ language,
+ dishes: restaurant.dishCollection.filter((a) => a.dishes?.length).length
+ ? await Promise.all(
+ restaurant.dishCollection[0]?.dishes?.map(async (dish) => ({
+ ...dish,
+ title: await translateText(config.defaultLanguage, language, dish.title),
+ })),
+ )
+ : [],
+ });
+ }
+
+ // Translate multi-location dishes
+ if (restaurant.locations?.length) {
+ await Promise.all(
+ restaurant.locations.map(async (loc: RestaurantLocation) => {
+ if (!loc.dishCollection) return;
+ const base = loc.dishCollection[0]?.dishes || [];
+ const translated = base.length
+ ? await Promise.all(
+ base.map(async (dish) => ({
+ ...dish,
+ title: await translateText(config.defaultLanguage, language, dish.title),
+ })),
+ )
+ : [];
+ loc.dishCollection.push({ language, dishes: translated });
+ }),
+ );
+ }
}),
);
} catch (err: unknown) {
- console.error("Can't reach google translate service");
- console.error(err);
+ logger.error("Can't reach google translate service");
+ logger.error({ err }, 'Translation error');
}
return restaurant;
};
-export const translateRestaurants = async (restaurants: RestaurantProps[]) =>
- await Promise.all(restaurants.map(async (restaurant: RestaurantProps) => await translateRestaurant(restaurant)));
+export const translateRestaurants = async (restaurants: RestaurantProps[]) => {
+ if (config.development) {
+ logger.info('Development mode: Skipping translation service');
+ // In development, just add English dishes as copies of Swedish (top-level and locations)
+ return restaurants.map((restaurant) => ({
+ ...restaurant,
+ dishCollection: [
+ ...(restaurant.dishCollection || []),
+ ...(restaurant.dishCollection?.map((collection) => ({
+ language: 'en',
+ dishes: collection.dishes || [],
+ })) || []),
+ ],
+ locations: restaurant.locations?.map((loc) => ({
+ ...loc,
+ dishCollection: [
+ ...(loc.dishCollection || []),
+ ...(loc.dishCollection?.map((collection) => ({
+ language: 'en',
+ dishes: collection.dishes || [],
+ })) || []),
+ ],
+ })),
+ }));
+ }
+
+ return await Promise.all(
+ restaurants.map(async (restaurant: RestaurantProps) => await translateRestaurant(restaurant)),
+ );
+};
diff --git a/apps/functions/scraper/test/data/05-versions-space.pdf b/apps/functions/scraper/test/data/05-versions-space.pdf
deleted file mode 100644
index 757bb1f..0000000
Binary files a/apps/functions/scraper/test/data/05-versions-space.pdf and /dev/null differ
diff --git a/apps/functions/scraper/test/data/05-versions-space.pdf.txt b/apps/functions/scraper/test/data/05-versions-space.pdf.txt
deleted file mode 100644
index 139597f..0000000
--- a/apps/functions/scraper/test/data/05-versions-space.pdf.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/apps/functions/scraper/tsconfig.jest.json b/apps/functions/scraper/tsconfig.jest.json
deleted file mode 100644
index 220eb81..0000000
--- a/apps/functions/scraper/tsconfig.jest.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "module": "NodeNext"
- },
- "include": ["./src/**/*.test.ts"],
- "exclude": ["node_modules", "src/**/*.test.ts"]
-}
diff --git a/apps/functions/scraper/tsconfig.json b/apps/functions/scraper/tsconfig.json
index 8b8d3ce..57c4ccc 100644
--- a/apps/functions/scraper/tsconfig.json
+++ b/apps/functions/scraper/tsconfig.json
@@ -1,14 +1,10 @@
{
+ "extends": "../../../tsconfig.base.json",
"compilerOptions": {
- "target": "ESNext",
- "module": "NodeNext",
- "moduleResolution": "NodeNext",
- "lib": ["ESNext", "dom", "dom.iterable"],
- "esModuleInterop": true,
- "strict": true,
"outDir": "dist",
- "skipLibCheck": true
+ "noEmit": false,
+ "lib": ["ESNext", "dom", "dom.iterable"]
},
- "include": ["./src/**/*"],
- "exclude": ["node_modules", "src/**/*.test.ts"]
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "src/**/*.test.ts"]
}
diff --git a/apps/server/.env.example b/apps/server/.env.example
index 7e67069..47612ac 100644
--- a/apps/server/.env.example
+++ b/apps/server/.env.example
@@ -1,3 +1,2 @@
-SLACK_OAUTH_TOKEN=
-SLACK_CHANNEL_ID=
-NODE_ENV=development
\ No newline at end of file
+NODE_ENV=development
+OPENAI_API_KEY=your-openai-api-key
diff --git a/apps/server/.eslintrc.json b/apps/server/.eslintrc.json
deleted file mode 100644
index b30c859..0000000
--- a/apps/server/.eslintrc.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/eslintrc.json",
- "root": true,
- "env": {
- "node": true
- },
- "extends": ["custom"]
-}
diff --git a/apps/server/eslint.config.js b/apps/server/eslint.config.js
new file mode 100644
index 0000000..98ae7df
--- /dev/null
+++ b/apps/server/eslint.config.js
@@ -0,0 +1,37 @@
+import js from '@eslint/js';
+import tseslint from '@typescript-eslint/eslint-plugin';
+import tsparser from '@typescript-eslint/parser';
+
+export default [
+ js.configs.recommended,
+ {
+ files: ['**/*.{js,ts}'],
+ languageOptions: {
+ parser: tsparser,
+ globals: {
+ console: 'readonly',
+ process: 'readonly',
+ Buffer: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ global: 'readonly',
+ fetch: 'readonly',
+ },
+ },
+ plugins: {
+ '@typescript-eslint': tseslint,
+ },
+ rules: {
+ ...tseslint.configs.recommended.rules,
+ 'no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars': [
+ 'error',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ caughtErrorsIgnorePattern: '^_',
+ },
+ ],
+ },
+ },
+];
diff --git a/apps/server/package.json b/apps/server/package.json
index 6608cd3..26168f5 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -1,37 +1,34 @@
{
"name": "@devolunch/server",
"version": "0.1.0",
+ "type": "module",
"license": "MIT",
"scripts": {
- "dev": "nodemon --delay 500ms -e ts --exec ts-node src/index.ts | pino-pretty",
- "lint": "prettier --check --ignore-path=../../.prettierignore . && eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
- "format": "prettier --write --ignore-path=../../.prettierignore .",
- "build": "tsc -b tsconfig.build.json",
- "typecheck": "tsc --noEmit"
+ "dev": "nodemon --delay 500ms -e ts --exec tsx src/index.ts | pino-pretty",
+ "build": "tsc",
+ "typecheck": "tsc --noEmit",
+ "lint": "eslint src --ext ts --max-warnings 0",
+ "format": "prettier --write ."
},
"dependencies": {
"@devolunch/shared": "workspace:*",
- "@google-cloud/storage": "^5.20.5",
- "@slack/web-api": "^6.9.0",
- "compression": "1.7.4",
+ "@modelcontextprotocol/sdk": "^0.7.0",
+ "@google-cloud/storage": "^7.15.0",
+ "ws": "^8.18.0",
+ "compression": "^1.7.5",
"cors": "^2.8.5",
- "dotenv": "16.0.3",
- "express": "^4.18.2",
- "zod": "^3.22.4"
+ "dotenv": "^16.4.7",
+ "express": "^4.21.2",
+ "pino": "^9.10.0",
+ "zod": "^3.24.1"
},
"devDependencies": {
- "@tsconfig/node18": "^2.0.1",
- "@types/compression": "1.7.2",
+ "tsx": "^4.19.2",
+ "nodemon": "^3.1.10",
+ "@types/compression": "1.8.1",
"@types/cors": "^2.8.15",
- "@types/express": "^4.17.20",
- "@types/node": "^20.8.7",
- "@types/node-fetch": "^2.6.7",
- "eslint-config-custom": "workspace:*",
- "nodemon": "^2.0.22",
- "pino": "^7.11.0",
- "pino-pretty": "^7.6.1",
- "prettier": "2.6.2",
- "ts-node": "^10.9.1",
- "typescript": "^5.2.2"
+ "@types/express": "^5.0.3",
+ "pino-pretty": "^13.1.1",
+ "@types/ws": "^8.5.12"
}
}
diff --git a/apps/server/src/config.ts b/apps/server/src/config.ts
index 51d58b9..1c3ff23 100644
--- a/apps/server/src/config.ts
+++ b/apps/server/src/config.ts
@@ -2,16 +2,16 @@ import { z } from 'zod';
import dotenv from 'dotenv';
dotenv.config();
-const Config = z
+const ConfigSchema = z
.object({
development: z.boolean(),
port: z.number(),
})
.strict();
-export type Config = z.infer;
+export type Config = z.infer;
-export const config = Config.parse({
+export const config = ConfigSchema.parse({
development: process.env.NODE_ENV === 'development',
port: parseInt(process.env.PORT || '8080', 10),
});
diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts
index 86bcf0a..c383d09 100644
--- a/apps/server/src/index.ts
+++ b/apps/server/src/index.ts
@@ -1,12 +1,17 @@
-import express, { Request, Response } from 'express';
-import { resolve } from 'path';
+import express from 'express';
+import http from 'http';
+import type { Request, Response } from 'express';
+import { resolve, dirname } from 'path';
+import { fileURLToPath } from 'url';
import cors from 'cors';
import compression from 'compression';
-import { config } from './config';
-import { logger } from '@devolunch/shared';
-import routes from './routes';
+import { config } from './config.js';
+import { logger } from '@devolunch/shared/logger/node';
+import routes from './routes/index.js';
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
const CLIENT_DIR = resolve(__dirname, '..', '..', 'client');
const app = express();
@@ -33,6 +38,15 @@ app.get('/', (_, res) => {
app.use('/api/v1', routes);
-app.listen(config.port, () => {
+const server = http.createServer(app);
+
+// Attach WebSocket MCP gateway
+import { setupWsGateway } from './wsGateway.js';
+import { warmMcp } from './services/mcpClient.js';
+setupWsGateway(server);
+// Warm MCP child in background for lower first-hit latency
+warmMcp();
+
+server.listen(config.port, () => {
logger.info(`App listening on port ${config.port}`);
});
diff --git a/apps/server/src/logger.ts b/apps/server/src/logger.ts
deleted file mode 100644
index 06c4824..0000000
--- a/apps/server/src/logger.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Log api for mapping pino to stack driver format.
- *
- * See https://cloud.google.com/run/docs/logging.
- */
-import pino from 'pino';
-
-const logLevel = process.env.LOG_LEVEL || 'info';
-
-const loggerOptions = {
- formatters: {
- level: (label: string): object => ({ severity: severity(label) }),
- },
- base: null,
- // Google Cloud Logging also prefers that log data is present inside a message key instead of the default msg key that Pino uses.
- messageKey: 'message',
- timestamp: false,
- level: logLevel,
-};
-
-// Map pino levels to GCP, https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
-function severity(label: string): string {
- switch (label) {
- case 'trace':
- return 'DEBUG';
- case 'debug':
- return 'DEBUG';
- case 'info':
- return 'INFO';
- case 'warn':
- return 'WARNING';
- case 'error':
- return 'ERROR';
- case 'fatal':
- return 'CRITICAL';
- default:
- return 'DEFAULT';
- }
-}
-
-export const logger = pino(loggerOptions) as Logger;
-export type Logger = pino.Logger;
diff --git a/apps/server/src/routes/ai.ts b/apps/server/src/routes/ai.ts
new file mode 100644
index 0000000..29b07a8
--- /dev/null
+++ b/apps/server/src/routes/ai.ts
@@ -0,0 +1,47 @@
+// What: New AI route namespace with a search endpoint
+// Why: Expose a simple REST bridge to AI-powered (MCP) search for the client
+
+import express from 'express';
+import type { Request, Response, Router } from 'express';
+import { callSearchDishes, callSuggestMeal } from '../services/mcpClient.js';
+
+const router: Router = express.Router();
+
+router.get('/search', async (req: Request, res: Response) => {
+ const query = (req.query.query as string) || '';
+ const language = (req.query.language as string) || 'sv';
+ const expand = req.query.expand !== 'false';
+
+ if (!query.trim()) {
+ return res.status(400).json({ error: 'query is required' });
+ }
+
+ try {
+ const data = await callSearchDishes({ query, language, expand });
+ return res.json(data);
+ } catch (err) {
+ return res.status(500).json({ error: 'search_failed' });
+ }
+});
+
+// What: Suggest endpoint proxying MCP suggest_meal
+// Why: Provide a simple REST fallback for clients not using WS MCP
+router.get('/suggest', async (req: Request, res: Response) => {
+ const query = (req.query.query as string) || '';
+ const language = (req.query.language as string) || 'sv';
+ const topK = req.query.topK ? parseInt(String(req.query.topK), 10) : undefined;
+ const useLLM = req.query.useLLM !== 'false';
+
+ if (!query.trim()) {
+ return res.status(400).json({ error: 'query is required' });
+ }
+
+ try {
+ const data = await callSuggestMeal({ query, language, topK, useLLM });
+ return res.json(data);
+ } catch (err) {
+ return res.status(500).json({ error: 'suggest_failed' });
+ }
+});
+
+export default router;
diff --git a/apps/server/src/routes/index.ts b/apps/server/src/routes/index.ts
index 61a4b27..8f81bc2 100644
--- a/apps/server/src/routes/index.ts
+++ b/apps/server/src/routes/index.ts
@@ -1,9 +1,12 @@
import express from 'express';
-const router = express.Router();
+import type { Router } from 'express';
+const router: Router = express.Router();
-import restaurants from './restaurants';
+import restaurants from './restaurants.js';
+import ai from './ai.js';
router.get('/health', (_, res) => res.send("I'm healthy!"));
router.use('/restaurants', restaurants);
+router.use('/ai', ai);
export default router;
diff --git a/apps/server/src/routes/restaurants.ts b/apps/server/src/routes/restaurants.ts
index e263195..e3157a7 100644
--- a/apps/server/src/routes/restaurants.ts
+++ b/apps/server/src/routes/restaurants.ts
@@ -1,9 +1,9 @@
-import { Request, Response } from 'express';
import express from 'express';
+import type { Request, Response, Router } from 'express';
-import { getScrape } from '../services/storage';
+import { getScrape } from '../services/storage.js';
-const router = express.Router();
+const router: Router = express.Router();
router.get('/', async (_: Request, res: Response) => {
const scrape = await getScrape();
diff --git a/apps/server/src/services/mcpClient.ts b/apps/server/src/services/mcpClient.ts
new file mode 100644
index 0000000..49b3ce4
--- /dev/null
+++ b/apps/server/src/services/mcpClient.ts
@@ -0,0 +1,144 @@
+// What: Minimal MCP client spawner for server-side REST bridge
+// Why: Allow Express route to call MCP tools via stdio child process
+
+import { Client } from '@modelcontextprotocol/sdk/client/index.js';
+import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
+import { fileURLToPath } from 'url';
+import { dirname, resolve } from 'path';
+import { config } from '../config.js';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+// From apps/server/src/services -> root requires four levels up
+const repoRoot = resolve(__dirname, '..', '..', '..', '..');
+
+function getServerCommand(): { command: string; args: string[] } {
+ const isDev = process.env.NODE_ENV === 'development';
+ if (isDev) {
+ return { command: 'tsx', args: [resolve(repoRoot, 'packages/mcp-server/src/index.ts')] };
+ }
+ return { command: 'node', args: [resolve(repoRoot, 'packages/mcp-server/dist/mcp-server/src/index.js')] };
+}
+
+let clientSingleton: Client | null = null;
+let connecting: Promise | null = null;
+type CacheEntry = { value: any; expires: number };
+const cache = new Map();
+const CACHE_TTL_MS = 60_000; // 60 seconds
+
+function cacheKey(name: string, args?: Record): string {
+ return `${name}:${JSON.stringify(args || {})}`;
+}
+
+async function getClient(): Promise {
+ if (clientSingleton) return clientSingleton;
+ if (connecting) return connecting;
+
+ const { command, args } = getServerCommand();
+ const client = new Client({ name: '@devolunch/server-bridge', version: '0.1.0' }, { capabilities: {} });
+ const transport = new StdioClientTransport({
+ command,
+ args,
+ env: { ...process.env, MCP_SCRAPE_URL: `http://localhost:${config.port}/api/v1/restaurants` },
+ });
+
+ connecting = (async () => {
+ await client.connect(transport);
+ // Warm up: ensure tools available
+ await client.listTools().catch(() => undefined);
+ client.onclose = () => {
+ clientSingleton = null;
+ connecting = null;
+ };
+ client.onerror = () => {
+ // keep process alive; next call may recreate
+ };
+ clientSingleton = client;
+ return client;
+ })();
+
+ return connecting;
+}
+
+export async function callSearchDishes(params: { query: string; language?: string; expand?: boolean }) {
+ // Cached path
+ const key = cacheKey('search_dishes', params as Record);
+ const now = Date.now();
+ const hit = cache.get(key);
+ if (hit && hit.expires > now) return hit.value;
+
+ const client = await getClient();
+ const result = await client.callTool({ name: 'search_dishes', arguments: params });
+ const first = (result as any).content?.[0];
+ if (!first || first.type !== 'text') throw new Error('invalid_tool_result');
+ const parsed = JSON.parse(first.text);
+ cache.set(key, { value: parsed, expires: now + CACHE_TTL_MS });
+ return parsed;
+}
+
+export async function mcpListTools() {
+ const client = await getClient();
+ return client.listTools();
+}
+
+export async function mcpCallTool(params: { name: string; arguments?: Record }) {
+ // Cache only for search_dishes
+ if (params.name === 'search_dishes') {
+ const key = cacheKey(params.name, params.arguments);
+ const now = Date.now();
+ const hit = cache.get(key);
+ if (hit && hit.expires > now) {
+ // Re-wrap into MCP result format (text content)
+ const text = JSON.stringify(hit.value);
+ return { content: [{ type: 'text', text }] };
+ }
+ }
+
+ const client = await getClient();
+ const result = await client.callTool(params);
+
+ if (params.name === 'search_dishes') {
+ const first = (result as any).content?.[0];
+ if (first && first.type === 'text') {
+ try {
+ const parsed = JSON.parse(first.text);
+ cache.set(cacheKey(params.name, params.arguments), { value: parsed, expires: Date.now() + CACHE_TTL_MS });
+ } catch {
+ // ignore parse errors for caching
+ }
+ }
+ }
+ return result;
+}
+
+export async function callSuggestMeal(params: { query: string; language?: string; topK?: number; useLLM?: boolean }) {
+ // Cache suggestions similarly (short TTL) keyed by args
+ const key = cacheKey('suggest_meal', params as Record);
+ const now = Date.now();
+ const hit = cache.get(key);
+ if (hit && hit.expires > now) return hit.value;
+
+ const client = await getClient();
+ const result = await client.callTool({ name: 'suggest_meal', arguments: params });
+ const first = (result as any).content?.[0];
+ if (!first || first.type !== 'text') throw new Error('invalid_tool_result');
+ const parsed = JSON.parse(first.text);
+ cache.set(key, { value: parsed, expires: now + CACHE_TTL_MS });
+ return parsed;
+}
+
+process.on('SIGINT', async () => {
+ if (clientSingleton) {
+ await clientSingleton.close().catch(() => undefined);
+ }
+ process.exit(0);
+});
+
+export async function warmMcp() {
+ try {
+ const client = await getClient();
+ await client.listTools();
+ } catch {
+ // ignore; background reconnect will take over
+ }
+}
diff --git a/apps/server/src/services/storage.ts b/apps/server/src/services/storage.ts
index 10e78f0..b813e92 100644
--- a/apps/server/src/services/storage.ts
+++ b/apps/server/src/services/storage.ts
@@ -1,15 +1,75 @@
import { Storage } from '@google-cloud/storage';
+import { logger } from '@devolunch/shared/logger/node';
const BUCKET_NAME = 'devolunchv2';
+const LOCAL_SCRAPER_URL = 'http://localhost:8081';
const storage = new Storage({
projectId: 'devolunch',
});
-export const getScrape = async () => {
+const getLocalScrape = async () => {
+ try {
+ const fs = await import('fs/promises');
+ const path = await import('path');
+
+ // First try reading from local JSON file
+ const localFilePath = path.join(process.cwd(), '..', 'functions', 'scraper', 'scrape.json');
+ try {
+ const fileContent = await fs.readFile(localFilePath, 'utf8');
+ const scrapeData = JSON.parse(fileContent);
+ logger.info(
+ { count: scrapeData.restaurants?.length || 0 },
+ 'Using cached local scraper data',
+ );
+ return scrapeData;
+ } catch (_fileError) {
+ logger.info('Local JSON file not found, trying scraper endpoint...');
+ }
+
+ // Fallback to scraper endpoint if file doesn't exist
+ const response = await fetch(`${LOCAL_SCRAPER_URL}/scrape`);
+ if (!response.ok) {
+ throw new Error(`Scraper responded with ${response.status}`);
+ }
+
+ const contentType = response.headers.get('content-type');
+ if (contentType && contentType.includes('application/json')) {
+ const scrapeData = (await response.json()) as { restaurants?: unknown[] };
+ logger.info(
+ { count: scrapeData.restaurants?.length || 0 },
+ 'Using fresh local scraper data',
+ );
+ return scrapeData;
+ }
+
+ logger.warn('Local scraper returned non-JSON response, falling back to cloud storage');
+ return null;
+ } catch (error) {
+ logger.warn(
+ { err: error },
+ 'Local scraper not available, falling back to cloud storage',
+ );
+ return null;
+ }
+};
+
+const getCloudScrape = async () => {
const bucket = storage.bucket(BUCKET_NAME);
const file = await bucket.file('scrape.json').download();
const scrape = JSON.parse(file[0].toString('utf8'));
-
return scrape;
};
+
+export const getScrape = async () => {
+ const isDev = process.env.NODE_ENV === 'development';
+
+ if (isDev) {
+ const localScrape = await getLocalScrape();
+ if (localScrape) {
+ return localScrape;
+ }
+ }
+
+ return getCloudScrape();
+};
diff --git a/apps/server/src/wsGateway.ts b/apps/server/src/wsGateway.ts
new file mode 100644
index 0000000..64bccbb
--- /dev/null
+++ b/apps/server/src/wsGateway.ts
@@ -0,0 +1,82 @@
+// What: WebSocket MCP gateway
+// Why: Allow browser to connect via MCP over WebSocket instead of REST
+
+import type { Server as HttpServer } from 'http';
+import { WebSocketServer } from 'ws';
+import type { WebSocket, RawData } from 'ws';
+import { Server } from '@modelcontextprotocol/sdk/server/index.js';
+import {
+ ListToolsRequestSchema,
+ ListToolsResultSchema,
+ CallToolRequestSchema,
+ CallToolResultSchema,
+ type JSONRPCMessage,
+} from '@modelcontextprotocol/sdk/types.js';
+import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
+import { mcpListTools, mcpCallTool } from './services/mcpClient.js';
+
+class WsServerTransport implements Transport {
+ private ws: WebSocket;
+ onclose?: () => void;
+ onerror?: (error: Error) => void;
+ onmessage?: (message: JSONRPCMessage) => void;
+
+ constructor(ws: WebSocket) {
+ this.ws = ws;
+ }
+
+ async start(): Promise {
+ this.ws.on('message', (data: RawData) => {
+ try {
+ const msg = JSON.parse(data.toString());
+ this.onmessage?.(msg);
+ } catch (err) {
+ this.onerror?.(err as Error);
+ }
+ });
+ this.ws.on('close', () => this.onclose?.());
+ this.ws.on('error', (err: Error) => this.onerror?.(err));
+ }
+
+ async send(message: JSONRPCMessage): Promise {
+ this.ws.send(JSON.stringify(message));
+ }
+
+ async close(): Promise {
+ this.ws.close();
+ this.onclose?.();
+ }
+}
+
+export function setupWsGateway(server: HttpServer) {
+ const wss = new WebSocketServer({
+ server,
+ path: '/mcp',
+ handleProtocols: (protocols: Set): string | false => {
+ if (protocols.has('mcp')) return 'mcp';
+ return false; // reject if MCP not requested
+ },
+ });
+
+ wss.on('connection', async (socket: WebSocket) => {
+ const transport = new WsServerTransport(socket);
+ const mcpServer = new Server(
+ { name: '@devolunch/mcp-gateway', version: '0.1.0' },
+ { capabilities: { tools: {} } },
+ );
+
+ // tools/list -> forward from child MCP
+ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
+ const list = await mcpListTools();
+ return { tools: list.tools } as unknown as typeof ListToolsResultSchema._type;
+ });
+
+ // tools/call -> forward directly
+ mcpServer.setRequestHandler(CallToolRequestSchema, async (req) => {
+ const result = await mcpCallTool(req.params);
+ return result as unknown as typeof CallToolResultSchema._type;
+ });
+
+ await mcpServer.connect(transport);
+ });
+}
diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json
index 67abe79..586346b 100644
--- a/apps/server/tsconfig.json
+++ b/apps/server/tsconfig.json
@@ -1,30 +1,19 @@
{
- "extends": "@tsconfig/node18/tsconfig.json",
+ "extends": "../../tsconfig.base.json",
"compilerOptions": {
- "lib": ["ESNext", "dom", "dom.iterable"],
"outDir": "dist",
- "target": "ESNext",
- "strict": true,
- "noErrorTruncation": true,
- "strictNullChecks": true,
- "esModuleInterop": true,
+ "lib": ["ESNext"],
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "noEmit": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "sourceMap": true,
- "moduleResolution": "NodeNext",
- "composite": false,
"baseUrl": "."
},
- "include": ["src", ".eslintrc.js"],
- "exclude": ["node_modules"],
+ "include": ["src"],
+ "exclude": ["node_modules", "dist"],
"ts-node": {
- "files": true
- },
- "references": [
- {
- "path": "../../packages/tsconfig/base.tsconfig.json"
- }
- ]
+ "files": true,
+ "esm": true
+ }
}
diff --git a/docs/DEPENDENCY_MANAGEMENT.md b/docs/DEPENDENCY_MANAGEMENT.md
new file mode 100644
index 0000000..11d9eca
--- /dev/null
+++ b/docs/DEPENDENCY_MANAGEMENT.md
@@ -0,0 +1,172 @@
+# Dependency Management with Renovate
+
+This document explains how automated dependency management is set up for the DevoLunch project using Renovate.
+
+## 📋 Overview
+
+Renovate automatically keeps our dependencies up-to-date by:
+- 🔍 Scanning for outdated dependencies weekly
+- 📝 Creating pull requests with updates
+- 🛡️ Running security audits on dependency changes
+- 🚀 Auto-merging safe updates (patch/minor dev dependencies)
+- 📊 Grouping related updates for easier review
+
+## 🔧 Configuration
+
+### Renovate Configuration (`renovate.json`)
+
+Our Renovate setup includes:
+
+- **Schedule**: Updates run Monday mornings (before 6am CET)
+- **Grouping**: Related packages updated together (React, TypeScript, etc.)
+- **Auto-merge**: Safe dev dependency updates auto-merge after CI passes
+- **Security**: Vulnerability alerts trigger immediate updates
+- **Version Constraints**: Node.js ≥22, pnpm ≥10
+
+### Key Features
+
+#### 🏷️ Grouped Updates
+- **React ecosystem**: React, React DOM, related types
+- **TypeScript & ESLint**: TS compiler and linting tools
+- **Vite & Build tools**: Vite, Vitest, Rollup, ESBuild
+- **Testing libraries**: Testing Library packages
+
+#### 🔒 Security
+- **Vulnerability alerts**: Immediate updates for security issues
+- **Dependency review**: GitHub action reviews license and security
+- **Audit checks**: pnpm audit runs on all dependency PRs
+
+#### ⚡ Automation
+- **Auto-merge**: Patch/minor dev dependencies merge automatically
+- **Auto-approve**: Renovate PRs get automatic approval
+- **Status checks**: Full CI must pass before merge
+
+## 🚀 Setup Instructions
+
+### 1. Enable Renovate on GitHub
+
+1. Go to [Renovate GitHub App](https://github.com/apps/renovate)
+2. Click "Install" or "Configure"
+3. Select the repository: `adamoldin/devolunch`
+4. Grant necessary permissions
+
+### 2. Repository Settings
+
+Ensure these settings are configured:
+
+- **Branch protection**: `main` branch should require status checks
+- **Auto-merge**: Enable for the repository
+- **Dependency alerts**: Enable Dependabot security alerts
+
+### 3. Verify Configuration
+
+After setup, Renovate will:
+1. Create an onboarding PR explaining the configuration
+2. Start scanning for dependency updates
+3. Create the first batch of update PRs on the next Monday
+
+## 📊 What to Expect
+
+### Weekly Updates
+Every Monday morning, you'll receive PRs for:
+- Security vulnerabilities (immediate)
+- Outdated dependencies grouped logically
+- Lock file maintenance
+
+### Auto-merge Criteria
+These updates merge automatically:
+- ✅ Patch versions of dev dependencies (`1.2.3` → `1.2.4`)
+- ✅ Minor versions of dev dependencies (`1.2.3` → `1.3.0`)
+- ✅ All CI checks pass
+- ✅ No merge conflicts
+
+### Manual Review Required
+These updates need manual approval:
+- 🔍 Major version updates (`1.x.x` → `2.x.x`)
+- 🔍 Production dependencies (any version)
+- 🔍 Updates that fail CI
+
+## 🛠️ Customization
+
+### Modify Update Schedule
+
+Edit `renovate.json`:
+```json
+{
+ "schedule": ["before 6am on Monday"]
+}
+```
+
+### Change Auto-merge Rules
+
+Adjust the `packageRules` section:
+```json
+{
+ "matchDepTypes": ["devDependencies"],
+ "automerge": true,
+ "matchUpdateTypes": ["patch", "minor"]
+}
+```
+
+### Add Package Groups
+
+Create new grouped updates:
+```json
+{
+ "groupName": "Emotion packages",
+ "matchPackageNames": [
+ "@emotion/react",
+ "@emotion/styled"
+ ]
+}
+```
+
+## 🔍 Monitoring
+
+### Check Renovate Dashboard
+- Visit: https://developer.mend.io/
+- Login with GitHub
+- View repository status and logs
+
+### Review Dependency Health
+- Monitor security alerts in GitHub Security tab
+- Check CI failures on Renovate PRs
+- Review major version update PRs carefully
+
+## 🚨 Troubleshooting
+
+### Renovate Not Creating PRs
+1. Check repository access in Renovate dashboard
+2. Verify `renovate.json` syntax
+3. Look for error logs in dashboard
+
+### Auto-merge Not Working
+1. Ensure branch protection allows auto-merge
+2. Check that all required status checks pass
+3. Verify PR has correct labels
+
+### CI Failures
+1. Review failed tests in PR
+2. Check if dependency introduces breaking changes
+3. Update tests or configuration as needed
+
+### Emergency Dependency Updates
+For critical security fixes:
+1. Create manual PR with updated dependencies
+2. Merge immediately after CI passes
+3. Renovate will detect and skip in next run
+
+## 📈 Benefits
+
+- 🔒 **Security**: Automatic vulnerability patching
+- ⏰ **Time Saving**: No manual dependency checking
+- 🧪 **Quality**: All updates tested by CI
+- 📈 **Consistency**: Regular, predictable updates
+- 🔍 **Visibility**: Clear changelog and update info
+
+## 📝 Notes
+
+- First setup may create many PRs as dependencies catch up
+- Consider pausing Renovate during major refactoring
+- Review major updates carefully for breaking changes
+- Renovate respects semantic versioning for safer updates
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..a9d980a
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,11 @@
+# Devolunch Documentation
+
+- Development: see `docs/development.md`
+- Architecture overview: see `docs/architecture.md` (WIP)
+- Infrastructure & deployments: see `docs/infra.md` (WIP)
+- Dependency management: see `docs/DEPENDENCY_MANAGEMENT.md`
+
+App-specific notes
+- Scraper: `apps/functions/scraper/README.md`
+- Notify Slack: `apps/functions/notify-slack/README.md`
+
diff --git a/docs/architecture.md b/docs/architecture.md
new file mode 100644
index 0000000..fe67778
--- /dev/null
+++ b/docs/architecture.md
@@ -0,0 +1,53 @@
+# Architecture
+
+Components
+- Client (React + Vite): Renders daily menus; calls the server API.
+- Server (Express): Serves the client build and exposes API endpoints. Can serve images.
+- Scraper (Cloud Functions v2): Aggregates menus daily and writes `scrape.json` to Cloud Storage.
+- Notify Slack (Cloud Functions v2): Posts a daily summary to Slack using `scrape.json`.
+- Shared package: Provides typed models and cross-runtime logger.
+
+Mermaid overview
+```mermaid
+flowchart LR
+ subgraph GCP
+ F1[Scraper CF] -- write --> B[(GCS Bucket)]
+ F2[Notify Slack CF] -- read --> B
+ end
+
+ C[Client (React)] -- fetch --> S[Server (Express)]
+ S -- read --> B
+
+ classDef svc fill:#eef,stroke:#88f;
+ class F1,F2,S,C svc;
+```
+
+Data flow (daily)
+1) Scheduler triggers the Scraper CF
+2) Scraper gathers menus (HTML → PDF → Vision) and writes `scrape.json` to GCS
+3) Server reads `scrape.json` from GCS for API responses
+4) Notify Slack reads the same file and posts a Markdown summary
+
+Schedules
+- Scraper: triggered daily via Cloud Scheduler (see Terraform)
+- Notify Slack: triggered after scrape via Scheduler/CI (see Terraform)
+
+Configuration & secrets
+- Scraper: `DEFAULT_LANGUAGE`, `TRANSLATE_LANGUAGES`, `USE_CONTENT_CLEANER`, `OPENAI_API_KEY`
+- Server: standard web config + `LOG_LEVEL`
+- Notify Slack: `SLACK_OAUTH_TOKEN`, `SLACK_CHANNEL_ID`
+- Secrets are injected via CI/terraform; never committed.
+
+Logging & observability
+- Node services import `@devolunch/shared/logger/node` (Pino with GCP severity mapping)
+- Client uses `@devolunch/shared/logger/browser`
+- Avoid `console.*` in Node code; use logger.
+
+Error handling
+- Scraper retries via multi-step strategy (text → pdf → images → delayed retry)
+- Server returns clear status codes; logs warning/errors with context
+- Notify Slack logs failures with structured error objects
+
+Environments
+- Development: local runs (Functions Framework), scraper writes local `scrape.json`
+- Production: Cloud Functions + Cloud Run; artifacts read/written via GCS
diff --git a/docs/development.md b/docs/development.md
new file mode 100644
index 0000000..7083ab1
--- /dev/null
+++ b/docs/development.md
@@ -0,0 +1,43 @@
+# Development Guide
+
+Monorepo basics
+- Package manager: pnpm (Node ≥ 22)
+- Orchestration: Turborepo
+- Workspaces:
+ - apps/client — React + Vite
+ - apps/server — Express API
+ - apps/functions/scraper — GCF v2 scraper
+ - apps/functions/notify-slack — GCF v2 Slack notifier
+ - packages/shared — shared types and logger
+
+Common commands (root)
+- `pnpm dev` — run dev processes (Turbo)
+- `pnpm build` — build all (Turbo)
+- `pnpm typecheck` — run TypeScript checks (Turbo)
+- `pnpm lint` — lint (ESLint flat config)
+- `pnpm test` — run tests (Turbo; Vitest for client)
+- `pnpm clean` — clean outputs (dist/build)
+
+Per-project examples
+- Client: `pnpm -F @devolunch/client dev | build | test`
+- Server: `pnpm -F @devolunch/server dev | build`
+- Scraper: `pnpm -F scraper-cloud-function start | scrape | build`
+
+Logging
+- Node targets (server/functions): `@devolunch/shared/logger/node`
+- Client: `@devolunch/shared/logger/browser`
+- Avoid `console.*` in server code; browser `console` may be used inside `page.evaluate()` only.
+
+Husky hooks
+- pre-commit: `pnpm lint` + `pnpm typecheck`
+- pre-push: `pnpm test` + `pnpm build`
+- commit-msg: Conventional Commits enforced
+
+TypeScript
+- Strict settings enabled: `noUnusedLocals`, `noUnusedParameters`, `noImplicitReturns`
+- Shared subpath imports supported via paths/typesVersions
+
+CI
+- `.github/workflows/install-and-test.yaml` runs lint, typecheck, tests, coverage, and audit
+- Deploy workflows under `.github/workflows/*deploy*`
+
diff --git a/docs/infra.md b/docs/infra.md
new file mode 100644
index 0000000..f0bae2a
--- /dev/null
+++ b/docs/infra.md
@@ -0,0 +1,9 @@
+# Infrastructure (WIP)
+
+- Terraform under `terraform/` manages:
+ - Cloud Run (website)
+ - Cloud Functions v2 (scraper, notify-slack)
+ - Cloud Scheduler (scraper trigger)
+ - Cloud Storage (bucket for `scrape.json` and images)
+- GitHub Actions deploy workflows call Terraform modules with appropriate secrets.
+
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..4b98fd9
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,133 @@
+import js from '@eslint/js';
+import tsPlugin from '@typescript-eslint/eslint-plugin';
+import tsParser from '@typescript-eslint/parser';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+
+export default [
+ js.configs.recommended,
+ // Base TypeScript config
+ {
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ parser: tsParser,
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ },
+ globals: {
+ console: 'readonly',
+ },
+ },
+ plugins: {
+ '@typescript-eslint': tsPlugin,
+ },
+ rules: {
+ ...tsPlugin.configs.recommended.rules,
+ 'no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars': [
+ 'warn',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ caughtErrorsIgnorePattern: '^_',
+ },
+ ],
+ '@typescript-eslint/no-explicit-any': 'warn',
+ },
+ },
+ // Node.js environments (server, functions)
+ {
+ files: [
+ 'apps/server/**/*.{ts,tsx}',
+ 'apps/functions/**/*.{ts,tsx}',
+ 'packages/**/*.{ts,tsx}',
+ ],
+ languageOptions: {
+ globals: {
+ process: 'readonly',
+ Buffer: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ global: 'readonly',
+ module: 'readonly',
+ require: 'readonly',
+ exports: 'readonly',
+ fetch: 'readonly', // Node.js 18+ has fetch
+ FormData: 'readonly',
+ Headers: 'readonly',
+ Request: 'readonly',
+ Response: 'readonly',
+ // Browser globals for Puppeteer automation
+ document: 'readonly',
+ window: 'readonly',
+ setInterval: 'readonly',
+ clearInterval: 'readonly',
+ URL: 'readonly',
+ HTMLAnchorElement: 'readonly',
+ HTMLElement: 'readonly',
+ Document: 'readonly',
+ Element: 'readonly',
+ },
+ },
+ },
+ // Browser environment (client)
+ {
+ files: ['apps/client/**/*.{ts,tsx}'],
+ languageOptions: {
+ globals: {
+ window: 'readonly',
+ document: 'readonly',
+ navigator: 'readonly',
+ fetch: 'readonly',
+ URL: 'readonly',
+ URLSearchParams: 'readonly',
+ Image: 'readonly',
+ HTMLElement: 'readonly',
+ HTMLButtonElement: 'readonly',
+ HTMLInputElement: 'readonly',
+ setInterval: 'readonly',
+ clearInterval: 'readonly',
+ setTimeout: 'readonly',
+ clearTimeout: 'readonly',
+ },
+ },
+ plugins: {
+ 'react-hooks': reactHooks,
+ 'react-refresh': reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ 'react-refresh/only-export-components': 'warn',
+ },
+ },
+ // CommonJS files
+ {
+ files: ['**/*.config.{js,ts}', '.prettierrc.js', 'eslint.config.js', '**/*.cjs'],
+ languageOptions: {
+ globals: {
+ module: 'writable',
+ exports: 'writable',
+ require: 'readonly',
+ __dirname: 'readonly',
+ __filename: 'readonly',
+ process: 'readonly',
+ },
+ },
+ },
+ {
+ ignores: [
+ 'node_modules/**',
+ '**/dist/**',
+ '**/build/**',
+ '.turbo/**',
+ 'coverage/**',
+ '**/*.d.ts',
+ '**/*.js.map',
+ '**/*.mjs',
+ '**/dist.*',
+ '**/.cache/**',
+ '**/puppeteer/**',
+ ],
+ },
+];
diff --git a/package.json b/package.json
index 563c04d..7d00955 100644
--- a/package.json
+++ b/package.json
@@ -1,27 +1,53 @@
{
"name": "devolunch",
"version": "1.17.0",
+ "type": "module",
+ "packageManager": "pnpm@10.15.0",
"description": "DevoLunch is an lunch app used for providing the todays lunch menus nearby the office.",
"license": "MIT",
+ "engines": {
+ "node": ">=22.0.0",
+ "pnpm": ">=10.0.0"
+ },
"repository": {
"type": "git",
"url": "git+https://github.com/jayway/devolunch.git"
},
"homepage": "https://github.com/jayway/devolunch#readme",
"scripts": {
+ "build": "turbo build",
"dev": "turbo dev",
- "lint": "turbo lint --color --cache-dir=.turbo",
- "format": "turbo format",
- "typecheck": "turbo typecheck --color --cache-dir=.turbo",
+ "scrape:dev": "cd apps/functions/scraper && NODE_ENV=development pnpm scrape",
+ "lint": "eslint . --ext ts,tsx",
+ "lint:fix": "eslint . --ext ts,tsx --fix",
+ "format": "prettier --write .",
+ "format:check": "prettier --check .",
+ "typecheck": "turbo typecheck",
+ "test": "turbo test",
+ "test:watch": "turbo test:watch",
"clean": "turbo clean",
- "test": "turbo test --color --cache-dir=.turbo",
- "test:watch": "turbo test --color --cache-dir=.turbo -- --watch",
"prepare": "husky install",
"preinstall": "npx only-allow pnpm"
},
"devDependencies": {
- "husky": "^8.0.3",
- "prettier": "^2.8.8",
- "turbo": "1.10.7"
+ "@eslint/js": "^9.0.0",
+ "@types/node": "^24.5.2",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/parser": "^8.0.0",
+ "@vitest/coverage-v8": "3.2.4",
+ "eslint": "^9.0.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "husky": "^9.1.7",
+ "prettier": "^3.6.2",
+ "turbo": "2.5.6",
+ "typescript": "^5.7.3",
+ "vitest": "3.2.4"
+ },
+ "pnpm": {
+ "overrides": {
+ "pino": "^9.10.0",
+ "pino-pretty": "^13.1.1"
+ }
}
}
diff --git a/packages/eslint/index.js b/packages/eslint/index.js
deleted file mode 100644
index 76fe94e..0000000
--- a/packages/eslint/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-module.exports = {
- env: {
- browser: true,
- commonjs: true,
- es6: true,
- node: true,
- },
- extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
- parser: '@typescript-eslint/parser',
- plugins: ['@typescript-eslint'],
- parserOptions: {
- ecmaVersion: 'latest',
- sourceType: 'module',
- },
- rules: {
- 'no-unused-vars': 'off',
- '@typescript-eslint/no-unused-vars': [
- 'error',
- {
- argsIgnorePattern: '^_',
- varsIgnorePattern: '^_',
- caughtErrorsIgnorePattern: '^_',
- },
- ],
- },
-};
diff --git a/packages/eslint/package.json b/packages/eslint/package.json
deleted file mode 100644
index f480ee1..0000000
--- a/packages/eslint/package.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "name": "eslint-config-custom",
- "description": "Shared ESLint configuration",
- "main": "index.js",
- "version": "1.0.0",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "^6.8.0",
- "@typescript-eslint/parser": "^6.8.0",
- "eslint": "latest",
- "eslint-config-prettier": "latest"
- }
-}
diff --git a/packages/mcp-server/README.md b/packages/mcp-server/README.md
new file mode 100644
index 0000000..647ba00
--- /dev/null
+++ b/packages/mcp-server/README.md
@@ -0,0 +1,17 @@
+@devolunch/mcp-server
+=================================
+
+Minimal MCP server exposing tools for DevoLunch data:
+
+- get_restaurants: returns current scrape (via `MCP_SCRAPE_URL` or default `http://localhost:8080/api/v1/restaurants`).
+- search_dishes: searches dishes across restaurants, optional `language` filter.
+- suggest_meal: ranks and suggests top dishes with reasons; can optionally use OpenAI if `OPENAI_API_KEY` is set.
+
+Scripts
+- build: `pnpm -F @devolunch/mcp-server build`
+- start: `MCP_SCRAPE_URL=http://localhost:8080/api/v1/restaurants pnpm -F @devolunch/mcp-server start`
+
+Notes
+- Runs over stdio (MCP). Use an MCP-compatible client to connect.
+- Later we can factor data access to a shared module to remove the HTTP hop.
+- If `OPENAI_API_KEY` is available, the server uses it to expand queries and improve suggestions. Otherwise it falls back to curated synonyms.
diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json
new file mode 100644
index 0000000..78db1c3
--- /dev/null
+++ b/packages/mcp-server/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@devolunch/mcp-server",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ }
+ },
+ "scripts": {
+ "build": "tsc -p tsconfig.json",
+ "typecheck": "tsc --noEmit -p tsconfig.json",
+ "lint": "eslint src --ext ts --max-warnings 0",
+ "format": "prettier --write .",
+ "clean": "rimraf dist",
+ "start": "node dist/mcp-server/src/index.js",
+ "smoke": "pnpm -s build && node dist/mcp-server/src/scripts/smoke.js"
+ },
+ "dependencies": {
+ "@devolunch/shared": "workspace:*",
+ "@modelcontextprotocol/sdk": "^0.7.0"
+ },
+ "devDependencies": {
+ "rimraf": "^6.0.1"
+ }
+}
diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts
new file mode 100644
index 0000000..17e82da
--- /dev/null
+++ b/packages/mcp-server/src/index.ts
@@ -0,0 +1,285 @@
+import { Server } from '@modelcontextprotocol/sdk/server/index.js';
+import {
+ Tool,
+ ListToolsRequestSchema,
+ ListToolsResultSchema,
+ CallToolRequestSchema,
+ CallToolResultSchema,
+} from '@modelcontextprotocol/sdk/types.js';
+import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
+import { Scrape, DishProps, RestaurantProps, expandQuery } from '@devolunch/shared';
+
+const DEFAULT_SCRAPE_URL = process.env.MCP_SCRAPE_URL || 'http://localhost:8080/api/v1/restaurants';
+const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
+
+async function fetchScrape(): Promise {
+ const res = await fetch(DEFAULT_SCRAPE_URL);
+ if (!res.ok) throw new Error(`Failed to fetch scrape: ${res.status}`);
+ const data = (await res.json()) as Scrape;
+ return data;
+}
+
+const norm = (s: string) => s.toLowerCase().normalize('NFKD');
+
+async function callOpenAIChatJSON(
+ system: string,
+ user: string,
+ model = process.env.OPENAI_MODEL || 'gpt-4o-mini',
+) {
+ if (!OPENAI_API_KEY) throw new Error('OPENAI_API_KEY not set');
+ const res = await fetch('https://api.openai.com/v1/chat/completions', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${OPENAI_API_KEY}`,
+ },
+ body: JSON.stringify({
+ model,
+ response_format: { type: 'json_object' },
+ temperature: 0.2,
+ messages: [
+ { role: 'system', content: system },
+ { role: 'user', content: user },
+ ],
+ }),
+ });
+ if (!res.ok) {
+ const text = await res.text();
+ throw new Error(`OpenAI error ${res.status}: ${text}`);
+ }
+ const data = await res.json();
+ const content = data.choices?.[0]?.message?.content;
+ if (!content) throw new Error('No content from OpenAI');
+ return JSON.parse(content);
+}
+
+async function llmExpandTokens(query: string, language = 'sv'): Promise {
+ if (!OPENAI_API_KEY) return [];
+ try {
+ const sys =
+ 'You expand food queries into a small set of synonyms and closely related dish names. Respond as JSON {"synonyms":[...]} with max 8 entries, lowercase.';
+ const usr = `Query: ${query}\nLanguage: ${language}\nReturn synonyms and related dish names (Swedish if applicable).`;
+ const json = await callOpenAIChatJSON(sys, usr);
+ const arr: unknown = json?.synonyms;
+ return Array.isArray(arr) ? arr.map((s) => String(s)) : [];
+ } catch {
+ return [];
+ }
+}
+
+function filterRestaurants(
+ restaurants: RestaurantProps[],
+ query: string,
+ language?: string,
+ expand = true,
+ extraTokens: string[] = [],
+): { restaurant: RestaurantProps; matches: DishProps[]; reason: string }[] {
+ const q = norm(query.trim());
+ if (!q) {
+ return restaurants.map((r) => ({ restaurant: r, matches: [], reason: 'empty-query' }));
+ }
+
+ const { tokens, primary } = expand ? expandQuery(q, language || 'sv') : { tokens: [q], primary: q };
+ for (const t of extraTokens) tokens.push(norm(t));
+
+ return restaurants
+ .map((r) => {
+ const collections = r.dishCollection || [];
+ const relevant = language ? collections.filter((c) => c.language === language) : collections;
+ const scan = relevant.length ? relevant : collections;
+
+ const matches: DishProps[] = [];
+ let matchedToken: string | null = null;
+ for (const col of scan) {
+ for (const dish of col.dishes) {
+ const hay = `${dish.title} ${dish.description || ''}`;
+ const nh = norm(hay);
+ for (const t of tokens) {
+ if (nh.includes(t)) {
+ matches.push(dish);
+ matchedToken = matchedToken || t;
+ break;
+ }
+ }
+ }
+ }
+
+ // Fallback: title match
+ if (!matches.length) {
+ for (const t of tokens) {
+ if (norm(r.title).includes(t)) {
+ matchedToken = matchedToken || t;
+ break;
+ }
+ }
+ }
+
+ // Score: prefer primary token matches, then count of matches
+ const score = (!matches.length && !matchedToken ? 0 : 1) + (matchedToken === primary ? 1 : 0) + matches.length * 0.01;
+ const reason = matchedToken ? (matchedToken === primary ? 'exact-or-fuzzy' : 'synonym') : 'title-match';
+ return { restaurant: r, matches, reason, score };
+ })
+ .filter((x) => x.score > 0)
+ .sort((a, b) => b.score - a.score)
+ .map(({ score: _s, ...rest }) => rest);
+}
+
+const tools: Tool[] = [
+ {
+ name: 'get_restaurants',
+ description: 'Returns the latest restaurant scrape snapshot with menus and metadata.',
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
+ },
+ {
+ name: 'search_dishes',
+ description:
+ 'Search dishes across restaurants. Input: query string, optional language code to prioritize matching language menus.',
+ inputSchema: {
+ type: 'object',
+ properties: {
+ query: { type: 'string' },
+ language: { type: 'string' },
+ },
+ required: ['query'],
+ additionalProperties: false,
+ },
+ },
+ {
+ name: 'suggest_meal',
+ description:
+ 'Suggest top dishes and restaurants matching a query, optionally using LLM expansion. Returns reasons and ranked results.',
+ inputSchema: {
+ type: 'object',
+ properties: {
+ query: { type: 'string' },
+ language: { type: 'string' },
+ topK: { type: 'number' },
+ useLLM: { type: 'boolean' },
+ },
+ required: ['query'],
+ additionalProperties: false,
+ },
+ },
+];
+
+async function main() {
+ const server = new Server(
+ { name: '@devolunch/mcp-server', version: '0.1.0' },
+ { capabilities: { tools: {} } },
+ );
+
+ // tools/list handler
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
+ return { tools } as unknown as typeof ListToolsResultSchema._type;
+ });
+
+ // tools/call handler
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
+ const { name, arguments: args } = request.params ?? { name: '', arguments: {} };
+ if (name === 'get_restaurants') {
+ const scrape = await fetchScrape();
+ const text = JSON.stringify(scrape);
+ return { content: [{ type: 'text', text }] } as unknown as typeof CallToolResultSchema._type;
+ }
+ if (name === 'search_dishes') {
+ const { query, language, expand } = (args || {}) as { query: string; language?: string; expand?: boolean };
+ if (!query || typeof query !== 'string') {
+ throw new Error('query is required');
+ }
+ const scrape = await fetchScrape();
+ // Optional LLM token expansion for search
+ const extra = expand ? await llmExpandTokens(query, language || 'sv') : [];
+ const filtered = filterRestaurants(scrape.restaurants, query, language, expand ?? true, extra);
+ const results = filtered.map(({ restaurant, matches, reason }) => ({
+ restaurant: { title: restaurant.title, url: restaurant.url, googleMapsUrl: restaurant.googleMapsUrl },
+ reason,
+ dishes: matches,
+ }));
+ const text = JSON.stringify({ query, results });
+ return { content: [{ type: 'text', text }] } as unknown as typeof CallToolResultSchema._type;
+ }
+ if (name === 'suggest_meal') {
+ const { query, language, topK, useLLM } = (args || {}) as {
+ query: string;
+ language?: string;
+ topK?: number;
+ useLLM?: boolean;
+ };
+ if (!query || typeof query !== 'string') throw new Error('query is required');
+ const scrape = await fetchScrape();
+ const extra = useLLM ? await llmExpandTokens(query, language || 'sv') : [];
+ const prelim = filterRestaurants(scrape.restaurants, query, language, true, extra);
+
+ // Flatten candidates (cap to keep prompt small)
+ let candidates: { restaurant: string; dish: string }[] = [];
+ for (const r of prelim) {
+ for (const d of r.matches) {
+ candidates.push({ restaurant: r.restaurant.title, dish: d.title });
+ if (candidates.length >= 40) break;
+ }
+ if (candidates.length >= 40) break;
+ }
+
+ // If no candidates found and AI is enabled, use ALL dishes for concept-based matching
+ if (candidates.length === 0 && (useLLM ?? true)) {
+ console.log(`No text matches for "${query}", using AI concept matching with all dishes`);
+ for (const r of scrape.restaurants) {
+ const collections = r.dishCollection || [];
+ const relevant = language ? collections.filter((c) => c.language === language) : collections;
+ const scan = relevant.length ? relevant : collections;
+
+ for (const col of scan) {
+ for (const dish of col.dishes) {
+ candidates.push({ restaurant: r.title, dish: dish.title });
+ if (candidates.length >= 60) break; // More dishes for concept matching
+ }
+ if (candidates.length >= 60) break;
+ }
+ if (candidates.length >= 60) break;
+ }
+ }
+
+ let suggestions: unknown = null;
+ if (OPENAI_API_KEY && (useLLM ?? true) && candidates.length) {
+ try {
+ const sys = `You are a helpful lunch assistant in Sweden. Understand Swedish food concepts and cuisine styles. Rank and justify dish choices based on user intent. ${language === 'sv' ? 'Always respond with reasons in Swedish.' : 'Respond in the user\'s language.'}\n\nSwedish food concepts to understand:\n- "husmanskost" = traditional Swedish home cooking (meat, potatoes, sauce dishes)\n- "italienskt" = Italian cuisine (pasta, pizza, Italian dishes)\n- "asiatiskt" = Asian food (Chinese, Thai, Vietnamese, Japanese, Korean)\n- "fräscht" = fresh, light, healthy dishes (salads, vegetables, grilled items)`;
+
+ const usr = `User query: ${query}\nLanguage: ${language || 'sv'}\n\nFind dishes that match the concept or style requested. Look for dishes that would satisfy someone asking for "${query}".\n\nCandidates (restaurant - dish):\n${candidates
+ .map((c, i) => `${i + 1}. ${c.restaurant} - ${c.dish}`)
+ .join('\n')}\n\nReturn JSON {"suggestions":[{"restaurant":"...","dish":"...","reason":"..."}]}, max ${(topK ?? 5)} entries. ${language === 'sv' ? 'Make sure the "reason" field is in Swedish and explains why this dish matches the concept.' : 'Explain why each dish matches the request.'}`;
+ const json = await callOpenAIChatJSON(sys, usr);
+ suggestions = json?.suggestions;
+ } catch {
+ suggestions = null;
+ }
+ }
+
+ type Suggestion = { restaurant: string; dish?: string; reason?: string };
+ let results: Suggestion[];
+ if (Array.isArray(suggestions) && suggestions.length) {
+ results = (suggestions as unknown[])
+ .map((s) => {
+ const o = s as Record;
+ return { restaurant: String(o.restaurant || ''), dish: o.dish ? String(o.dish) : undefined, reason: o.reason ? String(o.reason) : undefined } as Suggestion;
+ })
+ .filter((s) => s.restaurant)
+ .slice(0, topK ?? 5);
+ } else {
+ // Fallback: take top prelim matches
+ results = prelim
+ .slice(0, topK ?? 5)
+ .map((r) => ({ restaurant: r.restaurant.title, dish: r.matches[0]?.title, reason: r.reason }));
+ }
+
+ const text = JSON.stringify({ query, results });
+ return { content: [{ type: 'text', text }] } as unknown as typeof CallToolResultSchema._type;
+ }
+ throw new Error(`Unknown tool: ${name}`);
+ });
+
+ const transport = new StdioServerTransport();
+ await server.connect(transport);
+}
+
+// Start if run directly
+void main();
diff --git a/packages/mcp-server/src/scripts/smoke.ts b/packages/mcp-server/src/scripts/smoke.ts
new file mode 100644
index 0000000..7fe8e7d
--- /dev/null
+++ b/packages/mcp-server/src/scripts/smoke.ts
@@ -0,0 +1,49 @@
+import { Client } from '@modelcontextprotocol/sdk/client/index.js';
+import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
+
+async function main() {
+ const scrape = {
+ date: new Date().toISOString(),
+ restaurants: [
+ {
+ title: 'Testaurant',
+ url: 'https://example.com',
+ imageUrl: '',
+ coordinate: { lat: 0, lon: 0 },
+ googleMapsUrl: 'https://maps.example.com',
+ dishCollection: [
+ {
+ language: 'en',
+ dishes: [
+ { type: 'veg', title: 'Falafel', description: 'Tasty chickpea balls' },
+ { type: 'meat', title: 'Chicken Bowl', description: 'Grilled chicken with rice' },
+ ],
+ },
+ ],
+ },
+ ],
+ };
+
+ const dataUrl = `data:application/json,${encodeURIComponent(JSON.stringify(scrape))}`;
+
+ const client = new Client({ name: 'smoke-client', version: '0.0.0' }, { capabilities: {} });
+ const transport = new StdioClientTransport({
+ command: 'node',
+ args: ['dist/mcp-server/src/index.js'],
+ env: { ...process.env, MCP_SCRAPE_URL: dataUrl, NODE_NO_WARNINGS: '1' },
+ });
+
+ await client.connect(transport);
+
+ const list = await client.listTools();
+ console.log('Tools:', list.tools.map((t) => t.name));
+
+ const getRes = await client.callTool({ name: 'get_restaurants', arguments: {} });
+ console.log('get_restaurants ->', JSON.stringify(getRes, null, 2).slice(0, 200) + '...');
+
+ const search = await client.callTool({ name: 'search_dishes', arguments: { query: 'chicken', language: 'en' } });
+ console.log('search_dishes(chicken) ->', JSON.stringify(search, null, 2).slice(0, 200) + '...');
+}
+
+// eslint-disable-next-line @typescript-eslint/no-floating-promises
+main();
diff --git a/packages/mcp-server/tsconfig.json b/packages/mcp-server/tsconfig.json
new file mode 100644
index 0000000..437659f
--- /dev/null
+++ b/packages/mcp-server/tsconfig.json
@@ -0,0 +1,15 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "dist",
+ "noEmit": false,
+ "lib": ["ESNext", "DOM"],
+ "moduleResolution": "bundler",
+ "module": "ESNext",
+ "target": "ES2022",
+ "resolveJsonModule": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/shared/package.json b/packages/shared/package.json
index a125cfb..b3541dc 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,29 +1,61 @@
{
"name": "@devolunch/shared",
"version": "1.0.0",
+ "type": "module",
"main": "./dist/index.js",
- "module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
".": {
- "require": "./dist/index.js",
- "import": "./dist/index.mjs",
- "types": "./dist/index.d.ts"
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "./types": {
+ "types": "./dist/types.d.ts",
+ "default": "./dist/types.js"
+ },
+ "./logger/node": {
+ "types": "./dist/logger/node.d.ts",
+ "default": "./dist/logger/node.js"
+ },
+ "./logger/browser": {
+ "types": "./dist/logger/browser.d.ts",
+ "default": "./dist/logger/browser.js"
+ }
+ },
+ "typesVersions": {
+ "*": {
+ "logger/node": [
+ "src/logger/node.ts"
+ ],
+ "logger/browser": [
+ "src/logger/browser.ts"
+ ],
+ "*": [
+ "src/*"
+ ]
}
},
"scripts": {
- "build": "tsup src/index.ts --format cjs,esm --dts --clean",
- "dev": "pnpm run build --watch src"
+ "build": "tsc -p tsconfig.json",
+ "typecheck": "tsc --noEmit -p tsconfig.json",
+ "lint": "eslint src --ext ts --max-warnings 0",
+ "format": "prettier --write .",
+ "clean": "rimraf dist"
},
- "private": true,
- "dependencies": {
- "pino": "^7.10.0",
- "pino-pretty": "^7.6.1",
- "zod": "3.20.2"
+ "peerDependencies": {
+ "pino": "^9.10.0",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "pino": {
+ "optional": true
+ }
},
"devDependencies": {
- "@swc/core": "1.3.32",
- "@types/node": "20.1.7",
- "tsup": "6.6.0"
+ "rimraf": "^6.0.1"
+ },
+ "private": true,
+ "dependencies": {
+ "pino-pretty": "^13.1.1"
}
}
diff --git a/packages/shared/src/food-lexicon/en.ts b/packages/shared/src/food-lexicon/en.ts
new file mode 100644
index 0000000..dbda4dc
--- /dev/null
+++ b/packages/shared/src/food-lexicon/en.ts
@@ -0,0 +1,17 @@
+// What: English food synonym list and helper
+// Why: Support query expansion (e.g., "meatballs" -> related Swedish dishes)
+
+export const EN_SYNONYMS: Record = {
+ // meatballs and related Swedish dishes
+ 'meatball': ['meatballs', 'swedish meatballs', 'köttbulle', 'köttbullar', 'wallenbergare', 'järpe', 'järpar', 'pannbiff', 'biff lindström'],
+ 'meatballs': ['meatball', 'swedish meatballs', 'köttbulle', 'köttbullar', 'wallenbergare', 'järpe', 'järpar', 'pannbiff', 'biff lindström'],
+ 'swedish meatballs': ['meatball', 'meatballs', 'köttbulle', 'köttbullar'],
+ 'wallenbergare': ['meatball', 'meatballs', 'köttbullar', 'järpe', 'järpar', 'pannbiff'],
+ 'järpe': ['meatballs', 'järpar', 'köttbullar', 'wallenbergare', 'pannbiff'],
+ 'järpar': ['meatballs', 'järpe', 'köttbullar', 'wallenbergare', 'pannbiff'],
+ 'köttbulle': ['köttbullar', 'meatballs', 'swedish meatballs'],
+ 'köttbullar': ['köttbulle', 'meatballs', 'swedish meatballs'],
+ 'pannbiff': ['meatballs', 'köttbullar', 'järpar', 'wallenbergare'],
+ 'biff lindström': ['meatballs', 'köttbullar', 'pannbiff'],
+};
+
diff --git a/packages/shared/src/food-lexicon/index.ts b/packages/shared/src/food-lexicon/index.ts
new file mode 100644
index 0000000..365b2fa
--- /dev/null
+++ b/packages/shared/src/food-lexicon/index.ts
@@ -0,0 +1,35 @@
+// What: Query expansion helper combining language-specific synonym maps
+// Why: Central place to enrich user queries for better matching
+
+import { EN_SYNONYMS } from './en';
+import { SV_SYNONYMS } from './sv';
+
+const norm = (s: string) => s.toLowerCase().normalize('NFKD');
+
+const LEXICONS: Record> = {
+ en: EN_SYNONYMS,
+ sv: SV_SYNONYMS,
+};
+
+export function expandQuery(query: string, language: string = 'sv'): { tokens: string[]; primary: string } {
+ const q = norm(query.trim());
+ const lex = LEXICONS[language] || LEXICONS['sv'];
+ const expansions = new Set([q]);
+
+ // direct mappings
+ if (lex[q]) {
+ lex[q].forEach((alt) => expansions.add(norm(alt)));
+ }
+
+ // Also check if any key includes the primary (basic fuzzy)
+ Object.keys(lex).forEach((key) => {
+ const nk = norm(key);
+ if (nk.includes(q) || q.includes(nk)) {
+ lex[key].forEach((alt) => expansions.add(norm(alt)));
+ expansions.add(nk);
+ }
+ });
+
+ return { tokens: Array.from(expansions), primary: q };
+}
+
diff --git a/packages/shared/src/food-lexicon/sv.ts b/packages/shared/src/food-lexicon/sv.ts
new file mode 100644
index 0000000..b9b5daf
--- /dev/null
+++ b/packages/shared/src/food-lexicon/sv.ts
@@ -0,0 +1,14 @@
+// What: Swedish food synonym list and helper
+// Why: Support query expansion for Swedish inputs (e.g., "köttbullar")
+
+export const SV_SYNONYMS: Record = {
+ 'köttbulle': ['köttbullar', 'meatballs', 'swedish meatballs'],
+ 'köttbullar': ['köttbulle', 'meatballs', 'swedish meatballs', 'järpe', 'järpar', 'wallenbergare', 'pannbiff', 'biff lindström'],
+ 'wallenbergare': ['köttbullar', 'järpe', 'järpar', 'pannbiff', 'meatballs'],
+ 'järpe': ['järpar', 'köttbullar', 'wallenbergare', 'pannbiff'],
+ 'järpar': ['järpe', 'köttbullar', 'wallenbergare', 'pannbiff'],
+ 'pannbiff': ['köttbullar', 'järpar', 'wallenbergare'],
+ 'biff lindström': ['köttbullar', 'pannbiff', 'meatballs'],
+ 'meatballs': ['köttbullar', 'swedish meatballs'],
+};
+
diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts
index 692daf1..b7d6883 100644
--- a/packages/shared/src/index.ts
+++ b/packages/shared/src/index.ts
@@ -1,2 +1,2 @@
export * from './types';
-export * from './logger';
+export * from './food-lexicon';
diff --git a/packages/shared/src/logger.ts b/packages/shared/src/logger.ts
deleted file mode 100644
index 06c4824..0000000
--- a/packages/shared/src/logger.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Log api for mapping pino to stack driver format.
- *
- * See https://cloud.google.com/run/docs/logging.
- */
-import pino from 'pino';
-
-const logLevel = process.env.LOG_LEVEL || 'info';
-
-const loggerOptions = {
- formatters: {
- level: (label: string): object => ({ severity: severity(label) }),
- },
- base: null,
- // Google Cloud Logging also prefers that log data is present inside a message key instead of the default msg key that Pino uses.
- messageKey: 'message',
- timestamp: false,
- level: logLevel,
-};
-
-// Map pino levels to GCP, https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
-function severity(label: string): string {
- switch (label) {
- case 'trace':
- return 'DEBUG';
- case 'debug':
- return 'DEBUG';
- case 'info':
- return 'INFO';
- case 'warn':
- return 'WARNING';
- case 'error':
- return 'ERROR';
- case 'fatal':
- return 'CRITICAL';
- default:
- return 'DEFAULT';
- }
-}
-
-export const logger = pino(loggerOptions) as Logger;
-export type Logger = pino.Logger;
diff --git a/packages/shared/src/logger/browser.ts b/packages/shared/src/logger/browser.ts
new file mode 100644
index 0000000..98ee765
--- /dev/null
+++ b/packages/shared/src/logger/browser.ts
@@ -0,0 +1,44 @@
+type LogContext = Record | unknown;
+
+const serialize = (ctx?: LogContext) => {
+ if (ctx === undefined) return undefined;
+ if (ctx instanceof Error) return { err: { message: ctx.message, stack: ctx.stack } };
+ if (typeof ctx === 'object') return ctx as Record;
+ return { value: ctx };
+};
+
+const isDebug = (() => {
+ try {
+ const g: any = globalThis as any;
+ if (typeof g.DEVOLUNCH_DEBUG === 'boolean') return g.DEVOLUNCH_DEBUG;
+ if (typeof window !== 'undefined' && window.location) {
+ return /localhost|127\.0\.0\.1/.test(window.location.hostname);
+ }
+ } catch {
+ // ignore
+ }
+ return false;
+})();
+
+export const logger = {
+ info: (context?: LogContext, msg?: string) => {
+ if (msg) console.info(msg, serialize(context));
+ else if (context) console.info(context);
+ },
+ warn: (context?: LogContext, msg?: string) => {
+ if (msg) console.warn(msg, serialize(context));
+ else if (context) console.warn(context);
+ },
+ error: (context?: LogContext, msg?: string) => {
+ if (msg) console.error(msg, serialize(context));
+ else if (context) console.error(context);
+ },
+ debug: (context?: LogContext, msg?: string) => {
+ if (!isDebug) return;
+ if (msg) console.debug(msg, serialize(context));
+ else if (context) console.debug(context);
+ },
+};
+
+export type Logger = typeof logger;
+export default logger;
diff --git a/packages/shared/src/logger/node.ts b/packages/shared/src/logger/node.ts
new file mode 100644
index 0000000..00f60a8
--- /dev/null
+++ b/packages/shared/src/logger/node.ts
@@ -0,0 +1,50 @@
+import pino from 'pino';
+
+const logLevel = process.env.LOG_LEVEL || 'info';
+const isDevelopment = process.env.NODE_ENV === 'development';
+
+const loggerOptions = isDevelopment
+ ? {
+ level: logLevel,
+ transport: {
+ target: 'pino-pretty',
+ options: {
+ colorize: true,
+ translateTime: 'HH:MM:ss',
+ ignore: 'pid,hostname',
+ }
+ }
+ }
+ : {
+ formatters: {
+ level: (label: string): object => ({ severity: severity(label) }),
+ },
+ base: null,
+ // Google Cloud Logging prefers a 'message' key
+ messageKey: 'message',
+ timestamp: false,
+ level: logLevel,
+ };
+
+function severity(label: string): string {
+ switch (label) {
+ case 'trace':
+ return 'DEBUG';
+ case 'debug':
+ return 'DEBUG';
+ case 'info':
+ return 'INFO';
+ case 'warn':
+ return 'WARNING';
+ case 'error':
+ return 'ERROR';
+ case 'fatal':
+ return 'CRITICAL';
+ default:
+ return 'DEFAULT';
+ }
+}
+
+export const logger = pino(loggerOptions) as Logger;
+export default logger;
+export type Logger = pino.Logger;
diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts
index cb2d79f..c7f287e 100644
--- a/packages/shared/src/types.ts
+++ b/packages/shared/src/types.ts
@@ -17,11 +17,28 @@ export interface RestaurantProps {
distance?: number;
googleMapsUrl: string;
unknownMealDefault?: 'veg';
+ locationFilter?: string;
+ locations?: RestaurantLocation[]; // For multi-location restaurants
}
export interface DishCollectionProps {
language: string;
dishes: DishProps[];
+ lunchInfo?: LunchMetadata;
+}
+
+export interface LunchMetadata {
+ servingTimes?: string; // e.g., "11:30-14:00", "Lunch serveras 11-15"
+ includedItems?: string[]; // e.g., ["sallad", "bröd", "smör", "kaffe"]
+ specialNotes?: string; // e.g., "Hämtlunch", "Buffé", "Vegetariska alternativ finns alltid"
+ closureInfo?: ClosureInfo; // Information about restaurant closures
+}
+
+export interface ClosureInfo {
+ isClosed: boolean;
+ reason?: string; // e.g., "Closed Mondays and Tuesdays"
+ reopensOn?: string; // e.g., "Wednesday", "Tomorrow", specific date
+ closedDays?: string[]; // e.g., ["monday", "tuesday"]
}
export interface DishProps {
@@ -37,4 +54,21 @@ export interface Coordinate {
export type DishType = 'meat' | 'fish' | 'veg' | 'vegan' | 'misc';
-export interface RestaurantMetaProps extends Omit {}
+export interface RestaurantLocation {
+ title: string;
+ googleMapsUrl: string;
+ coordinate: Coordinate;
+ url?: string; // Only for 'separate' type
+ locationFilter?: string; // For 'filtered' and 'separate' types
+ dishCollection?: DishCollectionProps[];
+}
+
+export interface MultiLocationConfig {
+ type: 'shared' | 'filtered' | 'separate';
+ locations: RestaurantLocation[];
+}
+
+export interface RestaurantMetaProps extends Omit {
+ useContentCleaner?: boolean;
+ multiLocation?: MultiLocationConfig;
+}
diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json
index 68aea3e..45ca67b 100644
--- a/packages/shared/tsconfig.json
+++ b/packages/shared/tsconfig.json
@@ -1,15 +1,11 @@
{
+ "extends": "../../tsconfig.base.json",
"compilerOptions": {
- "strict": true,
"outDir": "dist",
- "strictNullChecks": true,
- "esModuleInterop": true,
+ "noEmit": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "sourceMap": true,
- "moduleResolution": "node"
+ "lib": ["ESNext", "DOM"]
},
"include": ["src/**/*"]
}
diff --git a/packages/tsconfig/base.tsconfig.json b/packages/tsconfig/base.tsconfig.json
deleted file mode 100644
index 92dc17a..0000000
--- a/packages/tsconfig/base.tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "strict": true,
- "outDir": "dist",
- "strictNullChecks": true,
- "esModuleInterop": true,
- "emitDecoratorMetadata": true,
- "experimentalDecorators": true,
- "noUnusedLocals": true,
- "skipLibCheck": true,
- "sourceMap": true,
- "moduleResolution": "node",
- "composite": true
- },
- "include": ["src/**/*"]
-}
diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json
deleted file mode 100644
index 9e18d8a..0000000
--- a/packages/tsconfig/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@devolunch/tsconfig",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "keywords": [],
- "author": "",
- "license": "ISC"
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 85685fa..a433b98 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,79 +1,112 @@
-lockfileVersion: '6.0'
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+ injectWorkspacePackages: true
+
+overrides:
+ pino: ^9.10.0
+ pino-pretty: ^13.1.1
importers:
.:
devDependencies:
+ '@eslint/js':
+ specifier: ^9.0.0
+ version: 9.35.0
+ '@types/node':
+ specifier: ^24.5.2
+ version: 24.5.2
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^8.0.0
+ version: 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)
+ '@typescript-eslint/parser':
+ specifier: ^8.0.0
+ version: 8.44.0(eslint@9.35.0)(typescript@5.9.2)
+ '@vitest/coverage-v8':
+ specifier: 3.2.4
+ version: 3.2.4(vitest@3.2.4(@types/node@24.5.2)(jsdom@26.1.0)(terser@5.44.0)(tsx@4.20.5))
+ eslint:
+ specifier: ^9.0.0
+ version: 9.35.0
+ eslint-plugin-react-hooks:
+ specifier: ^5.2.0
+ version: 5.2.0(eslint@9.35.0)
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.20
+ version: 0.4.20(eslint@9.35.0)
husky:
- specifier: ^8.0.3
- version: 8.0.3
+ specifier: ^9.1.7
+ version: 9.1.7
prettier:
- specifier: ^2.8.8
- version: 2.8.8
+ specifier: ^3.6.2
+ version: 3.6.2
turbo:
- specifier: 1.10.7
- version: 1.10.7
+ specifier: 2.5.6
+ version: 2.5.6
+ typescript:
+ specifier: ^5.7.3
+ version: 5.9.2
+ vitest:
+ specifier: 3.2.4
+ version: 3.2.4(@types/node@24.5.2)(jsdom@26.1.0)(terser@5.44.0)(tsx@4.20.5)
apps/client:
dependencies:
'@emotion/react':
- specifier: ^11.10.8
- version: 11.10.8(@types/react@18.2.0)(react@18.2.0)
+ specifier: ^11.14.0
+ version: 11.14.0(@types/react@19.1.13)(react@18.3.1)
+ '@modelcontextprotocol/sdk':
+ specifier: ^0.7.0
+ version: 0.7.0
'@vitejs/plugin-react':
- specifier: ^4.0.0
- version: 4.0.0(vite@4.3.5)
+ specifier: ^4.4.2
+ version: 4.7.0(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))
react:
- specifier: ^18.2.0
- version: 18.2.0
+ specifier: ^18.3.1
+ version: 18.3.1
react-dom:
- specifier: ^18.2.0
- version: 18.2.0(react@18.2.0)
- typescript:
- specifier: ^5.0.4
- version: 5.0.4
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
vite-plugin-pwa:
- specifier: ^0.14.7
- version: 0.14.7(vite@4.3.5)(workbox-build@6.6.0)(workbox-window@6.6.0)
+ specifier: ^1.0.3
+ version: 1.0.3(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))(workbox-build@6.6.0(@types/babel__core@7.20.5))(workbox-window@6.6.0)
vite-plugin-svgr:
- specifier: ^3.2.0
- version: 3.2.0(rollup@2.79.1)(vite@4.3.5)
+ specifier: ^4.2.0
+ version: 4.5.0(rollup@2.79.2)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))
devDependencies:
'@devolunch/shared':
specifier: workspace:*
version: link:../../packages/shared
- '@types/node':
- specifier: ^18.16.1
- version: 18.16.1
+ '@testing-library/jest-dom':
+ specifier: ^6.6.3
+ version: 6.8.0
+ '@testing-library/react':
+ specifier: ^16.1.0
+ version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: ^14.5.2
+ version: 14.6.1(@testing-library/dom@10.4.1)
'@types/react':
- specifier: ^18.2.0
- version: 18.2.0
+ specifier: ^19.1.13
+ version: 19.1.13
'@types/react-dom':
- specifier: ^18.2.1
- version: 18.2.1
- '@vitest/coverage-c8':
- specifier: 0.31.1
- version: 0.31.1(vitest@0.31.1)
- eslint-config-custom:
- specifier: workspace:*
- version: link:../../packages/eslint
- eslint-plugin-react-hooks:
- specifier: ^4.6.0
- version: 4.6.0(eslint@8.56.0)
- eslint-plugin-react-refresh:
- specifier: ^0.3.4
- version: 0.3.4(eslint@8.56.0)
- prettier:
- specifier: ^2.8.8
- version: 2.8.8
+ specifier: ^19.1.9
+ version: 19.1.9(@types/react@19.1.13)
+ jsdom:
+ specifier: ^26.0.0
+ version: 26.1.0
+ rollup-plugin-visualizer:
+ specifier: ^5.12.0
+ version: 5.14.0(rollup@2.79.2)
vite:
- specifier: ^4.3.5
- version: 4.3.5(@types/node@18.16.1)
+ specifier: ^7.1.6
+ version: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
vite-plugin-compression:
- specifier: 0.5.1
- version: 0.5.1(vite@4.3.5)
- vitest:
- specifier: 0.31.1
- version: 0.31.1
+ specifier: ^0.5.1
+ version: 0.5.1(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))
apps/functions/notify-slack:
dependencies:
@@ -83,104 +116,62 @@ importers:
'@google-cloud/storage':
specifier: ^5.20.5
version: 5.20.5
- '@types/express':
- specifier: ^4.17.20
- version: 4.17.20
dotenv:
specifier: 16.0.3
version: 16.0.3
- form-data:
- specifier: ^4.0.0
- version: 4.0.0
- node-fetch:
- specifier: ^2.7.0
- version: 2.7.0
+ pino:
+ specifier: ^9.10.0
+ version: 9.10.0
zod:
specifier: ^3.22.4
- version: 3.22.4
+ version: 3.25.76
devDependencies:
'@devolunch/shared':
specifier: workspace:^
version: link:../../../packages/shared
'@pnpm/make-dedicated-lockfile':
specifier: ^0.5.10
- version: 0.5.10
- '@types/node':
- specifier: 20.1.7
- version: 20.1.7
- '@types/node-fetch':
- specifier: ^2.6.7
- version: 2.6.7
- eslint-config-custom:
- specifier: workspace:^
- version: link:../../../packages/eslint
- prettier:
- specifier: 2.8.8
- version: 2.8.8
- typescript:
- specifier: ^5.2.2
- version: 5.2.2
+ version: 0.5.15
apps/functions/scraper:
dependencies:
'@google-cloud/functions-framework':
- specifier: 3.2.0
- version: 3.2.0
+ specifier: ^3.4.4
+ version: 3.5.1
'@google-cloud/storage':
- specifier: ^5.20.5
- version: 5.20.5
+ specifier: ^7.15.0
+ version: 7.17.1
'@google-cloud/translate':
- specifier: ^6.3.1
- version: 6.3.1
+ specifier: ^8.4.0
+ version: 8.5.1
dotenv:
- specifier: 16.0.3
- version: 16.0.3
+ specifier: ^16.4.7
+ version: 16.6.1
+ openai:
+ specifier: ^5.21.0
+ version: 5.21.0(ws@8.18.3)(zod@3.25.76)
pdf-parse:
- specifier: 1.1.1
+ specifier: ^1.1.1
version: 1.1.1
+ pdfjs-dist:
+ specifier: ^5.4.149
+ version: 5.4.149
+ pino:
+ specifier: ^9.10.0
+ version: 9.10.0
puppeteer:
- specifier: ^20.9.0
- version: 20.9.0(typescript@5.2.2)
- sharp:
- specifier: 0.33.2
- version: 0.33.2
+ specifier: ^24.0.0
+ version: 24.22.0(typescript@5.9.2)
zod:
- specifier: ^3.22.4
- version: 3.22.4
+ specifier: ^3.24.1
+ version: 3.25.76
devDependencies:
'@devolunch/shared':
specifier: workspace:^
version: link:../../../packages/shared
'@pnpm/make-dedicated-lockfile':
specifier: ^0.5.10
- version: 0.5.10
- '@types/express':
- specifier: ^4.17.20
- version: 4.17.20
- '@types/jest':
- specifier: ^29.5.6
- version: 29.5.6
- '@types/node':
- specifier: 20.1.7
- version: 20.1.7
- '@types/pdf-parse':
- specifier: 1.1.1
- version: 1.1.1
- eslint-config-custom:
- specifier: workspace:^
- version: link:../../../packages/eslint
- jest:
- specifier: ^29.7.0
- version: 29.7.0(@types/node@20.1.7)
- prettier:
- specifier: 2.8.8
- version: 2.8.8
- ts-jest:
- specifier: ^29.1.1
- version: 29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.2.2)
- typescript:
- specifier: ^5.2.2
- version: 5.2.2
+ version: 0.5.15
apps/server:
dependencies:
@@ -188,2604 +179,5950 @@ importers:
specifier: workspace:*
version: link:../../packages/shared
'@google-cloud/storage':
- specifier: ^5.20.5
- version: 5.20.5
- '@slack/web-api':
- specifier: ^6.9.0
- version: 6.9.0
+ specifier: ^7.15.0
+ version: 7.17.1
+ '@modelcontextprotocol/sdk':
+ specifier: ^0.7.0
+ version: 0.7.0
compression:
- specifier: 1.7.4
- version: 1.7.4
+ specifier: ^1.7.5
+ version: 1.8.1
cors:
specifier: ^2.8.5
version: 2.8.5
dotenv:
- specifier: 16.0.3
- version: 16.0.3
+ specifier: ^16.4.7
+ version: 16.6.1
express:
- specifier: ^4.18.2
- version: 4.18.2
+ specifier: ^4.21.2
+ version: 4.21.2
+ pino:
+ specifier: ^9.10.0
+ version: 9.10.0
+ ws:
+ specifier: ^8.18.0
+ version: 8.18.3
zod:
- specifier: ^3.22.4
- version: 3.22.4
+ specifier: ^3.24.1
+ version: 3.25.76
devDependencies:
- '@tsconfig/node18':
- specifier: ^2.0.1
- version: 2.0.1
'@types/compression':
- specifier: 1.7.2
- version: 1.7.2
+ specifier: 1.8.1
+ version: 1.8.1
'@types/cors':
specifier: ^2.8.15
- version: 2.8.15
+ version: 2.8.19
'@types/express':
- specifier: ^4.17.20
- version: 4.17.20
- '@types/node':
- specifier: ^20.8.7
- version: 20.8.7
- '@types/node-fetch':
- specifier: ^2.6.7
- version: 2.6.7
- eslint-config-custom:
- specifier: workspace:*
- version: link:../../packages/eslint
+ specifier: ^5.0.3
+ version: 5.0.3
+ '@types/ws':
+ specifier: ^8.5.12
+ version: 8.18.1
nodemon:
- specifier: ^2.0.22
- version: 2.0.22
- pino:
- specifier: ^7.11.0
- version: 7.11.0
+ specifier: ^3.1.10
+ version: 3.1.10
pino-pretty:
- specifier: ^7.6.1
- version: 7.6.1
- prettier:
- specifier: 2.6.2
- version: 2.6.2
- ts-node:
- specifier: ^10.9.1
- version: 10.9.1(@types/node@20.8.7)(typescript@5.2.2)
- typescript:
- specifier: ^5.2.2
- version: 5.2.2
+ specifier: ^13.1.1
+ version: 13.1.1
+ tsx:
+ specifier: ^4.19.2
+ version: 4.20.5
- packages/eslint:
+ packages/mcp-server:
dependencies:
- '@typescript-eslint/eslint-plugin':
- specifier: ^6.8.0
- version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.56.0)(typescript@5.2.2)
- '@typescript-eslint/parser':
- specifier: ^6.8.0
- version: 6.8.0(eslint@8.56.0)(typescript@5.2.2)
- eslint:
- specifier: latest
- version: 8.56.0
- eslint-config-prettier:
- specifier: latest
- version: 9.0.0(eslint@8.56.0)
+ '@devolunch/shared':
+ specifier: workspace:*
+ version: link:../shared
+ '@modelcontextprotocol/sdk':
+ specifier: ^0.7.0
+ version: 0.7.0
+ devDependencies:
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
packages/shared:
dependencies:
pino:
- specifier: ^7.10.0
- version: 7.10.0
+ specifier: ^9.10.0
+ version: 9.10.0
pino-pretty:
- specifier: ^7.6.1
- version: 7.6.1
- zod:
- specifier: 3.20.2
- version: 3.20.2
+ specifier: ^13.1.1
+ version: 13.1.1
+ typescript:
+ specifier: '*'
+ version: 5.9.2
devDependencies:
- '@swc/core':
- specifier: 1.3.32
- version: 1.3.32
- '@types/node':
- specifier: 20.1.7
- version: 20.1.7
- tsup:
- specifier: 6.6.0
- version: 6.6.0(@swc/core@1.3.32)
-
- packages/tsconfig: {}
+ rimraf:
+ specifier: ^6.0.1
+ version: 6.0.1
packages:
- /@aashutoshrathi/word-wrap@1.2.6:
- resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
- engines: {node: '>=0.10.0'}
+ '@adobe/css-tools@4.4.4':
+ resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
- /@ampproject/remapping@2.2.1:
- resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
- dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.18
- /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0):
+ '@apideck/better-ajv-errors@0.3.6':
resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
engines: {node: '>=10'}
peerDependencies:
ajv: '>=8'
- dependencies:
- ajv: 8.12.0
- json-schema: 0.4.0
- jsonpointer: 5.0.1
- leven: 3.1.0
- dev: false
-
- /@babel/code-frame@7.22.13:
- resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/highlight': 7.22.20
- chalk: 2.4.2
-
- /@babel/code-frame@7.22.5:
- resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/highlight': 7.22.5
- dev: false
-
- /@babel/compat-data@7.22.6:
- resolution: {integrity: sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==}
- engines: {node: '>=6.9.0'}
- dev: false
-
- /@babel/compat-data@7.23.2:
- resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==}
- engines: {node: '>=6.9.0'}
-
- /@babel/core@7.22.8:
- resolution: {integrity: sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@ampproject/remapping': 2.2.1
- '@babel/code-frame': 7.22.5
- '@babel/generator': 7.22.7
- '@babel/helper-compilation-targets': 7.22.6(@babel/core@7.22.8)
- '@babel/helper-module-transforms': 7.22.5
- '@babel/helpers': 7.22.6
- '@babel/parser': 7.22.7
- '@babel/template': 7.22.5
- '@babel/traverse': 7.22.8
- '@babel/types': 7.22.5
- '@nicolo-ribaudo/semver-v6': 6.3.3
- convert-source-map: 1.9.0
- debug: 4.3.4
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/core@7.23.2:
- resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@ampproject/remapping': 2.2.1
- '@babel/code-frame': 7.22.13
- '@babel/generator': 7.23.0
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
- '@babel/helpers': 7.23.2
- '@babel/parser': 7.23.0
- '@babel/template': 7.22.15
- '@babel/traverse': 7.23.2
- '@babel/types': 7.23.0
- convert-source-map: 2.0.0
- debug: 4.3.4
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
+ '@asamuzakjp/css-color@3.2.0':
+ resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
- /@babel/generator@7.22.7:
- resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==}
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.5
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.18
- jsesc: 2.5.2
- dev: false
- /@babel/generator@7.23.0:
- resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
+ '@babel/compat-data@7.28.4':
+ resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
- jsesc: 2.5.2
- /@babel/helper-annotate-as-pure@7.22.5:
- resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
+ '@babel/core@7.28.4':
+ resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
- dev: false
- /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15:
- resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==}
+ '@babel/generator@7.28.3':
+ resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
- dev: false
- /@babel/helper-compilation-targets@7.22.15:
- resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/compat-data': 7.23.2
- '@babel/helper-validator-option': 7.22.15
- browserslist: 4.22.1
- lru-cache: 5.1.1
- semver: 6.3.1
- /@babel/helper-compilation-targets@7.22.6(@babel/core@7.22.8):
- resolution: {integrity: sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==}
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/compat-data': 7.22.6
- '@babel/core': 7.22.8
- '@babel/helper-validator-option': 7.22.5
- '@nicolo-ribaudo/semver-v6': 6.3.3
- browserslist: 4.21.9
- lru-cache: 5.1.1
- dev: false
- /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==}
+ '@babel/helper-create-class-features-plugin@7.28.3':
+ resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-member-expression-to-functions': 7.23.0
- '@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- semver: 6.3.1
- dev: false
- /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==}
+ '@babel/helper-create-regexp-features-plugin@7.27.1':
+ resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-annotate-as-pure': 7.22.5
- regexpu-core: 5.3.2
- semver: 6.3.1
- dev: false
- /@babel/helper-define-polyfill-provider@0.4.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==}
+ '@babel/helper-define-polyfill-provider@0.6.5':
+ resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==}
peerDependencies:
'@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- debug: 4.3.4
- lodash.debounce: 4.0.8
- resolve: 1.22.8
- transitivePeerDependencies:
- - supports-color
- dev: false
-
- /@babel/helper-environment-visitor@7.22.20:
- resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
- engines: {node: '>=6.9.0'}
- /@babel/helper-environment-visitor@7.22.5:
- resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
engines: {node: '>=6.9.0'}
- dev: false
- /@babel/helper-function-name@7.22.5:
- resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==}
+ '@babel/helper-member-expression-to-functions@7.27.1':
+ resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.22.5
- '@babel/types': 7.22.5
- dev: false
-
- /@babel/helper-function-name@7.23.0:
- resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.22.15
- '@babel/types': 7.23.0
-
- /@babel/helper-hoist-variables@7.22.5:
- resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.5
-
- /@babel/helper-member-expression-to-functions@7.23.0:
- resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
- dev: false
-
- /@babel/helper-module-imports@7.22.15:
- resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
-
- /@babel/helper-module-imports@7.22.5:
- resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.5
- dev: false
- /@babel/helper-module-transforms@7.22.5:
- resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==}
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-module-imports': 7.22.5
- '@babel/helper-simple-access': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/helper-validator-identifier': 7.22.5
- '@babel/template': 7.22.5
- '@babel/traverse': 7.22.8
- '@babel/types': 7.22.5
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-module-imports': 7.22.15
- '@babel/helper-simple-access': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/helper-validator-identifier': 7.22.20
- /@babel/helper-optimise-call-expression@7.22.5:
- resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
+ '@babel/helper-optimise-call-expression@7.27.1':
+ resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
- dev: false
- /@babel/helper-plugin-utils@7.22.5:
- resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
engines: {node: '>=6.9.0'}
- /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.2):
- resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==}
+ '@babel/helper-remap-async-to-generator@7.27.1':
+ resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-wrap-function': 7.22.20
- dev: false
- /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2):
- resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
+ '@babel/helper-replace-supers@7.27.1':
+ resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-member-expression-to-functions': 7.23.0
- '@babel/helper-optimise-call-expression': 7.22.5
- dev: false
-
- /@babel/helper-simple-access@7.22.5:
- resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.5
-
- /@babel/helper-skip-transparent-expression-wrappers@7.22.5:
- resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.0
- dev: false
-
- /@babel/helper-split-export-declaration@7.22.6:
- resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.22.5
- /@babel/helper-string-parser@7.22.5:
- resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
engines: {node: '>=6.9.0'}
- /@babel/helper-validator-identifier@7.22.20:
- resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
- /@babel/helper-validator-identifier@7.22.5:
- resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
+ '@babel/helper-validator-identifier@7.27.1':
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
engines: {node: '>=6.9.0'}
- /@babel/helper-validator-option@7.22.15:
- resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
- /@babel/helper-validator-option@7.22.5:
- resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
+ '@babel/helper-wrap-function@7.28.3':
+ resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==}
engines: {node: '>=6.9.0'}
- dev: false
- /@babel/helper-wrap-function@7.22.20:
- resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-function-name': 7.23.0
- '@babel/template': 7.22.15
- '@babel/types': 7.23.0
- dev: false
-
- /@babel/helpers@7.22.6:
- resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.22.5
- '@babel/traverse': 7.22.8
- '@babel/types': 7.22.5
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/helpers@7.23.2:
- resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.22.15
- '@babel/traverse': 7.23.2
- '@babel/types': 7.23.0
- transitivePeerDependencies:
- - supports-color
+ '@babel/parser@7.28.4':
+ resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
- /@babel/highlight@7.22.20:
- resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1':
+ resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.22.20
- chalk: 2.4.2
- js-tokens: 4.0.0
+ peerDependencies:
+ '@babel/core': ^7.0.0
- /@babel/highlight@7.22.5:
- resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==}
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1':
+ resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.22.5
- chalk: 2.4.2
- js-tokens: 4.0.0
- dev: false
-
- /@babel/parser@7.22.7:
- resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==}
- engines: {node: '>=6.0.0'}
- hasBin: true
- dependencies:
- '@babel/types': 7.22.5
- dev: false
-
- /@babel/parser@7.23.0:
- resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
- engines: {node: '>=6.0.0'}
- hasBin: true
- dependencies:
- '@babel/types': 7.23.0
+ peerDependencies:
+ '@babel/core': ^7.0.0
- /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==}
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1':
+ resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==}
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1':
+ resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.13.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2):
- resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3':
+ resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==}
engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- dev: false
+ '@babel/core': ^7.0.0
- /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2):
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ '@babel/plugin-syntax-import-assertions@7.27.1':
+ resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
- /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.2):
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ '@babel/plugin-syntax-import-attributes@7.27.1':
+ resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
+ '@babel/core': ^7.0.0
- /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ '@babel/plugin-transform-arrow-functions@7.27.1':
+ resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+ '@babel/plugin-transform-async-generator-functions@7.28.0':
+ resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==}
+ '@babel/plugin-transform-async-to-generator@7.27.1':
+ resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==}
+ '@babel/plugin-transform-block-scoped-functions@7.27.1':
+ resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2):
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ '@babel/plugin-transform-block-scoping@7.28.4':
+ resolution: {integrity: sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ '@babel/plugin-transform-class-properties@7.27.1':
+ resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==}
+ '@babel/plugin-transform-class-static-block@7.28.3':
+ resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==}
engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
+ '@babel/core': ^7.12.0
- /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.2):
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ '@babel/plugin-transform-classes@7.28.4':
+ resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ '@babel/plugin-transform-computed-properties@7.27.1':
+ resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.2):
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ '@babel/plugin-transform-destructuring@7.28.0':
+ resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ '@babel/plugin-transform-dotall-regex@7.27.1':
+ resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ '@babel/plugin-transform-duplicate-keys@7.27.1':
+ resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1':
+ resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==}
+ engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
+ '@babel/core': ^7.0.0
- /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ '@babel/plugin-transform-dynamic-import@7.27.1':
+ resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ '@babel/plugin-transform-explicit-resource-management@7.28.0':
+ resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==}
+ '@babel/plugin-transform-exponentiation-operator@7.27.1':
+ resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
- /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.2):
- resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ '@babel/plugin-transform-export-namespace-from@7.27.1':
+ resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
+ '@babel/core': ^7.0.0-0
- /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==}
+ '@babel/plugin-transform-for-of@7.27.1':
+ resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-async-generator-functions@7.23.2(@babel/core@7.23.2):
- resolution: {integrity: sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==}
+ '@babel/plugin-transform-function-name@7.27.1':
+ resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==}
+ '@babel/plugin-transform-json-strings@7.27.1':
+ resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-module-imports': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==}
+ '@babel/plugin-transform-literals@7.27.1':
+ resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==}
+ '@babel/plugin-transform-logical-assignment-operators@7.27.1':
+ resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==}
+ '@babel/plugin-transform-member-expression-literals@7.27.1':
+ resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==}
+ '@babel/plugin-transform-modules-amd@7.27.1':
+ resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==}
engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.12.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2)
- dev: false
+ '@babel/core': ^7.0.0-0
- /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==}
+ '@babel/plugin-transform-modules-commonjs@7.27.1':
+ resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
- '@babel/helper-split-export-declaration': 7.22.6
- globals: 11.12.0
- dev: false
-
- /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==}
+
+ '@babel/plugin-transform-modules-systemjs@7.27.1':
+ resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/template': 7.22.15
- dev: false
- /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==}
+ '@babel/plugin-transform-modules-umd@7.27.1':
+ resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==}
+ '@babel/plugin-transform-named-capturing-groups-regex@7.27.1':
+ resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==}
engines: {node: '>=6.9.0'}
peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
+ '@babel/core': ^7.0.0
- /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==}
+ '@babel/plugin-transform-new-target@7.27.1':
+ resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==}
+ '@babel/plugin-transform-nullish-coalescing-operator@7.27.1':
+ resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==}
+ '@babel/plugin-transform-numeric-separator@7.27.1':
+ resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==}
+ '@babel/plugin-transform-object-rest-spread@7.28.4':
+ resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==}
+ '@babel/plugin-transform-object-super@7.27.1':
+ resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==}
+ '@babel/plugin-transform-optional-catch-binding@7.27.1':
+ resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==}
+ '@babel/plugin-transform-optional-chaining@7.27.1':
+ resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==}
+ '@babel/plugin-transform-parameters@7.27.7':
+ resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==}
+ '@babel/plugin-transform-private-methods@7.27.1':
+ resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==}
+ '@babel/plugin-transform-private-property-in-object@7.27.1':
+ resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==}
+ '@babel/plugin-transform-property-literals@7.27.1':
+ resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==}
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-simple-access': 7.22.5
- dev: false
- /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==}
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-identifier': 7.22.20
- dev: false
- /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==}
+ '@babel/plugin-transform-regenerator@7.28.4':
+ resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==}
+ '@babel/plugin-transform-regexp-modifiers@7.27.1':
+ resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==}
+ '@babel/plugin-transform-reserved-words@7.27.1':
+ resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==}
+ '@babel/plugin-transform-shorthand-properties@7.27.1':
+ resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2)
- dev: false
- /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==}
+ '@babel/plugin-transform-spread@7.27.1':
+ resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2)
- dev: false
-
- /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/compat-data': 7.23.2
- '@babel/core': 7.23.2
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2)
- dev: false
-
- /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2)
- dev: false
-
- /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2)
- dev: false
-
- /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2)
- dev: false
-
- /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.2):
- resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.2):
- resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2)
- dev: false
-
- /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.8):
- resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.8):
- resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.2):
- resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- regenerator-transform: 0.15.2
- dev: false
-
- /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
-
- /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- dev: false
- /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==}
+ '@babel/plugin-transform-sticky-regex@7.27.1':
+ resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==}
+ '@babel/plugin-transform-template-literals@7.27.1':
+ resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==}
+ '@babel/plugin-transform-typeof-symbol@7.27.1':
+ resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.2):
- resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==}
+ '@babel/plugin-transform-unicode-escapes@7.27.1':
+ resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==}
+ '@babel/plugin-transform-unicode-property-regex@7.27.1':
+ resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==}
+ '@babel/plugin-transform-unicode-regex@7.27.1':
+ resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==}
+ '@babel/plugin-transform-unicode-sets-regex@7.27.1':
+ resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.2)
- '@babel/helper-plugin-utils': 7.22.5
- dev: false
- /@babel/preset-env@7.23.2(@babel/core@7.23.2):
- resolution: {integrity: sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==}
+ '@babel/preset-env@7.28.3':
+ resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- dependencies:
- '@babel/compat-data': 7.23.2
- '@babel/core': 7.23.2
- '@babel/helper-compilation-targets': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-option': 7.22.15
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.2)
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.2)
- '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2)
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2)
- '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.2)
- '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-async-generator-functions': 7.23.2(@babel/core@7.23.2)
- '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.2)
- '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.2)
- '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.2)
- '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.2)
- '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.2)
- '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.2)
- '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.2)
- '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.2)
- '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.2)
- '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.2)
- '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.2)
- '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.2)
- '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.2)
- '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.2)
- '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.2)
- '@babel/types': 7.23.0
- babel-plugin-polyfill-corejs2: 0.4.6(@babel/core@7.23.2)
- babel-plugin-polyfill-corejs3: 0.8.5(@babel/core@7.23.2)
- babel-plugin-polyfill-regenerator: 0.5.3(@babel/core@7.23.2)
- core-js-compat: 3.33.0
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.2):
+ '@babel/preset-modules@0.1.6-no-external-plugins':
resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
peerDependencies:
'@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/types': 7.23.0
- esutils: 2.0.3
- dev: false
-
- /@babel/regjsgen@0.8.0:
- resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
- dev: false
-
- /@babel/runtime@7.22.6:
- resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.13.11
- dev: false
- /@babel/runtime@7.23.2:
- resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
+ '@babel/runtime@7.28.4':
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.14.0
- dev: false
- /@babel/template@7.22.15:
- resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.13
- '@babel/parser': 7.23.0
- '@babel/types': 7.23.0
- /@babel/template@7.22.5:
- resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
+ '@babel/traverse@7.28.4':
+ resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.5
- '@babel/parser': 7.22.7
- '@babel/types': 7.22.5
- dev: false
- /@babel/traverse@7.22.8:
- resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==}
+ '@babel/types@7.28.4':
+ resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.5
- '@babel/generator': 7.22.7
- '@babel/helper-environment-visitor': 7.22.5
- '@babel/helper-function-name': 7.22.5
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/parser': 7.22.7
- '@babel/types': 7.22.5
- debug: 4.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@babel/traverse@7.23.2:
- resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.13
- '@babel/generator': 7.23.0
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/parser': 7.23.0
- '@babel/types': 7.23.0
- debug: 4.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
+ '@bcoe/v8-coverage@1.0.2':
+ resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
+ engines: {node: '>=18'}
- /@babel/types@7.22.5:
- resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.22.5
- '@babel/helper-validator-identifier': 7.22.5
- to-fast-properties: 2.0.0
+ '@csstools/color-helpers@5.1.0':
+ resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==}
+ engines: {node: '>=18'}
- /@babel/types@7.23.0:
- resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.22.5
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
+ '@csstools/css-calc@2.1.4':
+ resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
- /@bcoe/v8-coverage@0.2.3:
- resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
- dev: true
+ '@csstools/css-color-parser@3.1.0':
+ resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
- /@cspotcode/source-map-support@0.8.1:
- resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
- engines: {node: '>=12'}
- dependencies:
- '@jridgewell/trace-mapping': 0.3.9
- dev: true
+ '@csstools/css-parser-algorithms@3.0.5':
+ resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^3.0.4
- /@emnapi/runtime@0.45.0:
- resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==}
- requiresBuild: true
- dependencies:
- tslib: 2.6.2
- dev: false
- optional: true
+ '@csstools/css-tokenizer@3.0.4':
+ resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
+ engines: {node: '>=18'}
- /@emotion/babel-plugin@11.11.0:
- resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
- dependencies:
- '@babel/helper-module-imports': 7.22.5
- '@babel/runtime': 7.22.6
- '@emotion/hash': 0.9.1
- '@emotion/memoize': 0.8.1
- '@emotion/serialize': 1.1.2
- babel-plugin-macros: 3.1.0
- convert-source-map: 1.9.0
- escape-string-regexp: 4.0.0
- find-root: 1.1.0
- source-map: 0.5.7
- stylis: 4.2.0
- dev: false
+ '@emotion/babel-plugin@11.13.5':
+ resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==}
- /@emotion/cache@11.11.0:
- resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
- dependencies:
- '@emotion/memoize': 0.8.1
- '@emotion/sheet': 1.2.2
- '@emotion/utils': 1.2.1
- '@emotion/weak-memoize': 0.3.1
- stylis: 4.2.0
- dev: false
+ '@emotion/cache@11.14.0':
+ resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==}
- /@emotion/hash@0.9.1:
- resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
- dev: false
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
- /@emotion/memoize@0.8.1:
- resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
- dev: false
+ '@emotion/memoize@0.9.0':
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
- /@emotion/react@11.10.8(@types/react@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-ZfGfiABtJ1P1OXqOBsW08EgCDp5fK6C5I8hUJauc/VcJBGSzqAirMnFslhFWnZJ/w5HxPI36XbvMV0l4KZHl+w==}
+ '@emotion/react@11.14.0':
+ resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==}
peerDependencies:
'@types/react': '*'
react: '>=16.8.0'
peerDependenciesMeta:
'@types/react':
optional: true
- dependencies:
- '@babel/runtime': 7.22.6
- '@emotion/babel-plugin': 11.11.0
- '@emotion/cache': 11.11.0
- '@emotion/serialize': 1.1.2
- '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0)
- '@emotion/utils': 1.2.1
- '@emotion/weak-memoize': 0.3.1
- '@types/react': 18.2.0
- hoist-non-react-statics: 3.3.2
- react: 18.2.0
- dev: false
- /@emotion/serialize@1.1.2:
- resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==}
- dependencies:
- '@emotion/hash': 0.9.1
- '@emotion/memoize': 0.8.1
- '@emotion/unitless': 0.8.1
- '@emotion/utils': 1.2.1
- csstype: 3.1.2
- dev: false
+ '@emotion/serialize@1.3.3':
+ resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==}
- /@emotion/sheet@1.2.2:
- resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
- dev: false
+ '@emotion/sheet@1.4.0':
+ resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==}
- /@emotion/unitless@0.8.1:
- resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
- dev: false
+ '@emotion/unitless@0.10.0':
+ resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==}
- /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0):
- resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==}
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0':
+ resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==}
peerDependencies:
react: '>=16.8.0'
- dependencies:
- react: 18.2.0
- dev: false
- /@emotion/utils@1.2.1:
- resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
- dev: false
+ '@emotion/utils@1.4.2':
+ resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==}
- /@emotion/weak-memoize@0.3.1:
- resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
- dev: false
+ '@emotion/weak-memoize@0.4.0':
+ resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==}
- /@esbuild/android-arm64@0.17.19:
- resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
- engines: {node: '>=12'}
+ '@esbuild/aix-ppc64@0.25.10':
+ resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.10':
+ resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- requiresBuild: true
- optional: true
- /@esbuild/android-arm@0.17.19:
- resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
- engines: {node: '>=12'}
+ '@esbuild/android-arm@0.25.10':
+ resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==}
+ engines: {node: '>=18'}
cpu: [arm]
os: [android]
- requiresBuild: true
- optional: true
- /@esbuild/android-x64@0.17.19:
- resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
- engines: {node: '>=12'}
+ '@esbuild/android-x64@0.25.10':
+ resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [android]
- requiresBuild: true
- optional: true
- /@esbuild/darwin-arm64@0.17.19:
- resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
- engines: {node: '>=12'}
+ '@esbuild/darwin-arm64@0.25.10':
+ resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- requiresBuild: true
- optional: true
- /@esbuild/darwin-x64@0.17.19:
- resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
- engines: {node: '>=12'}
+ '@esbuild/darwin-x64@0.25.10':
+ resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- requiresBuild: true
- optional: true
- /@esbuild/freebsd-arm64@0.17.19:
- resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
- engines: {node: '>=12'}
+ '@esbuild/freebsd-arm64@0.25.10':
+ resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- requiresBuild: true
- optional: true
- /@esbuild/freebsd-x64@0.17.19:
- resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
- engines: {node: '>=12'}
+ '@esbuild/freebsd-x64@0.25.10':
+ resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- requiresBuild: true
- optional: true
- /@esbuild/linux-arm64@0.17.19:
- resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
- engines: {node: '>=12'}
+ '@esbuild/linux-arm64@0.25.10':
+ resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-arm@0.17.19:
- resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
- engines: {node: '>=12'}
+ '@esbuild/linux-arm@0.25.10':
+ resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==}
+ engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-ia32@0.17.19:
- resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
- engines: {node: '>=12'}
+ '@esbuild/linux-ia32@0.25.10':
+ resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==}
+ engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-loong64@0.17.19:
- resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
- engines: {node: '>=12'}
+ '@esbuild/linux-loong64@0.25.10':
+ resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==}
+ engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-mips64el@0.17.19:
- resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
- engines: {node: '>=12'}
+ '@esbuild/linux-mips64el@0.25.10':
+ resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==}
+ engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-ppc64@0.17.19:
- resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
- engines: {node: '>=12'}
+ '@esbuild/linux-ppc64@0.25.10':
+ resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==}
+ engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-riscv64@0.17.19:
- resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
- engines: {node: '>=12'}
+ '@esbuild/linux-riscv64@0.25.10':
+ resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==}
+ engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-s390x@0.17.19:
- resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
- engines: {node: '>=12'}
+ '@esbuild/linux-s390x@0.25.10':
+ resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==}
+ engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/linux-x64@0.17.19:
- resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
- engines: {node: '>=12'}
+ '@esbuild/linux-x64@0.25.10':
+ resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- requiresBuild: true
- optional: true
- /@esbuild/netbsd-x64@0.17.19:
- resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
- engines: {node: '>=12'}
+ '@esbuild/netbsd-arm64@0.25.10':
+ resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.10':
+ resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- requiresBuild: true
- optional: true
- /@esbuild/openbsd-x64@0.17.19:
- resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
- engines: {node: '>=12'}
+ '@esbuild/openbsd-arm64@0.25.10':
+ resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.10':
+ resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- requiresBuild: true
- optional: true
- /@esbuild/sunos-x64@0.17.19:
- resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
- engines: {node: '>=12'}
+ '@esbuild/openharmony-arm64@0.25.10':
+ resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.10':
+ resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- requiresBuild: true
- optional: true
- /@esbuild/win32-arm64@0.17.19:
- resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
- engines: {node: '>=12'}
+ '@esbuild/win32-arm64@0.25.10':
+ resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==}
+ engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- requiresBuild: true
- optional: true
- /@esbuild/win32-ia32@0.17.19:
- resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
- engines: {node: '>=12'}
+ '@esbuild/win32-ia32@0.25.10':
+ resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==}
+ engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- requiresBuild: true
- optional: true
- /@esbuild/win32-x64@0.17.19:
- resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
- engines: {node: '>=12'}
+ '@esbuild/win32-x64@0.25.10':
+ resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==}
+ engines: {node: '>=18'}
cpu: [x64]
os: [win32]
- requiresBuild: true
- optional: true
- /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ '@eslint-community/eslint-utils@4.9.0':
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- dependencies:
- eslint: 8.56.0
- eslint-visitor-keys: 3.4.3
- /@eslint-community/regexpp@4.9.1:
- resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==}
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- /@eslint/eslintrc@2.1.4:
- resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- ajv: 6.12.6
- debug: 4.3.4
- espree: 9.6.1
- globals: 13.23.0
- ignore: 5.2.4
- import-fresh: 3.3.0
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
+ '@eslint/config-array@0.21.0':
+ resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- /@eslint/js@8.56.0:
- resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ '@eslint/config-helpers@0.3.1':
+ resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- /@google-cloud/common@3.10.0:
- resolution: {integrity: sha512-XMbJYMh/ZSaZnbnrrOFfR/oQrb0SxG4qh6hDisWCoEbFcBHV0qHQo4uXfeMCzolx2Mfkh6VDaOGg+hyJsmxrlw==}
- engines: {node: '>=10'}
- dependencies:
- '@google-cloud/projectify': 2.1.1
- '@google-cloud/promisify': 2.0.4
- arrify: 2.0.1
- duplexify: 4.1.2
- ent: 2.2.0
- extend: 3.0.2
- google-auth-library: 7.14.1
- retry-request: 4.2.2
- teeny-request: 7.2.0
- transitivePeerDependencies:
- - encoding
- - supports-color
- dev: false
+ '@eslint/core@0.15.2':
+ resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.1':
+ resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- /@google-cloud/functions-framework@3.2.0:
+ '@eslint/js@9.35.0':
+ resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.6':
+ resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.3.5':
+ resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@google-cloud/common@5.0.2':
+ resolution: {integrity: sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/functions-framework@3.2.0':
resolution: {integrity: sha512-eFafD4xocXmt3KM1z2X3lARvT2zLuXcw1V+T6xGoOAPfXQDduK77bKpkJx44QCAXh2c8qHYIT6dlSJWu5n5Lmg==}
engines: {node: '>=10.0.0'}
hasBin: true
- dependencies:
- '@types/express': 4.17.17
- body-parser: 1.20.2
- cloudevents: 6.0.4
- express: 4.18.2
- minimist: 1.2.8
- on-finished: 2.4.1
- read-pkg-up: 7.0.1
- semver: 7.5.4
- transitivePeerDependencies:
- - supports-color
- dev: false
- /@google-cloud/paginator@3.0.7:
+ '@google-cloud/functions-framework@3.5.1':
+ resolution: {integrity: sha512-J01F8mCAb9SEsEGOJjKR/1UHmZTzBWIBNjAETtiPx7Xie3WgeWTvMnfrbsZbaBG0oePkepRxo28R8Fi9B2J++A==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ '@google-cloud/paginator@3.0.7':
resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==}
engines: {node: '>=10'}
- dependencies:
- arrify: 2.0.1
- extend: 3.0.2
- dev: false
- /@google-cloud/projectify@2.1.1:
+ '@google-cloud/paginator@5.0.2':
+ resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/projectify@2.1.1':
resolution: {integrity: sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==}
engines: {node: '>=10'}
- dev: false
- /@google-cloud/promisify@2.0.4:
+ '@google-cloud/projectify@4.0.0':
+ resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==}
+ engines: {node: '>=14.0.0'}
+
+ '@google-cloud/promisify@2.0.4':
resolution: {integrity: sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==}
engines: {node: '>=10'}
- dev: false
- /@google-cloud/storage@5.20.5:
+ '@google-cloud/promisify@4.1.0':
+ resolution: {integrity: sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==}
+ engines: {node: '>=18'}
+
+ '@google-cloud/storage@5.20.5':
resolution: {integrity: sha512-lOs/dCyveVF8TkVFnFSF7IGd0CJrTm91qiK6JLu+Z8qiT+7Ag0RyVhxZIWkhiACqwABo7kSHDm8FdH8p2wxSSw==}
engines: {node: '>=10'}
- dependencies:
- '@google-cloud/paginator': 3.0.7
- '@google-cloud/projectify': 2.1.1
- '@google-cloud/promisify': 2.0.4
- abort-controller: 3.0.0
- arrify: 2.0.1
- async-retry: 1.3.3
- compressible: 2.0.18
- configstore: 5.0.1
- duplexify: 4.1.2
- ent: 2.2.0
- extend: 3.0.2
- gaxios: 4.3.3
- google-auth-library: 7.14.1
- hash-stream-validation: 0.2.4
- mime: 3.0.0
- mime-types: 2.1.35
- p-limit: 3.1.0
- pumpify: 2.0.1
- retry-request: 4.2.2
- stream-events: 1.0.5
- teeny-request: 7.2.0
- uuid: 8.3.2
- xdg-basedir: 4.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
- dev: false
- /@google-cloud/translate@6.3.1:
- resolution: {integrity: sha512-x6/NxMzhUA2ottO0RmRT5u/nhd9Yssond5b3RpgAe1Klb4TCuYep2lh9LUzpnWuCYhBCjh2/9lNkjTWj9kXLQg==}
- engines: {node: '>=10'}
- dependencies:
- '@google-cloud/common': 3.10.0
- '@google-cloud/promisify': 2.0.4
- arrify: 2.0.1
- extend: 3.0.2
- google-gax: 2.30.5
- is-html: 2.0.0
- protobufjs: 6.11.4
- transitivePeerDependencies:
- - encoding
+ '@google-cloud/storage@7.17.1':
+ resolution: {integrity: sha512-2FMQbpU7qK+OtBPaegC6n+XevgZksobUGo6mGKnXNmeZpvLiAo1gTAE3oTKsrMGDV4VtL8Zzpono0YsK/Q7Iqg==}
+ engines: {node: '>=14'}
+
+ '@google-cloud/translate@8.5.1':
+ resolution: {integrity: sha512-xqIRV+lTaszgPHw0ulUQ3CUhnbPnsnYlh90mBh3PomU5SUGRlJc5bjN0UEP6MICnrj3AugxYQSelNn+rxGj2Ig==}
+ engines: {node: '>=14.0.0'}
+
+ '@grpc/grpc-js@1.14.0':
+ resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==}
+ engines: {node: '>=12.10.0'}
+
+ '@grpc/proto-loader@0.7.15':
+ resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ '@grpc/proto-loader@0.8.0':
+ resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ '@gwhitney/detect-indent@7.0.1':
+ resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==}
+ engines: {node: '>=12.20'}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@isaacs/balanced-match@4.0.1':
+ resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
+ engines: {node: 20 || >=22}
+
+ '@isaacs/brace-expansion@5.0.0':
+ resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
+ engines: {node: 20 || >=22}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@js-sdsl/ordered-map@4.4.2':
+ resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
+
+ '@modelcontextprotocol/sdk@0.7.0':
+ resolution: {integrity: sha512-YlnQf8//eDHClUM607vb/6+GHmCdMnIfOkN2pcpexN4go9sYHm2JfNnqc5ILS7M8enUlwe9dQO9886l3NO3rUw==}
+
+ '@napi-rs/canvas-android-arm64@0.1.80':
+ resolution: {integrity: sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@napi-rs/canvas-darwin-arm64@0.1.80':
+ resolution: {integrity: sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@napi-rs/canvas-darwin-x64@0.1.80':
+ resolution: {integrity: sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80':
+ resolution: {integrity: sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.80':
+ resolution: {integrity: sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-arm64-musl@0.1.80':
+ resolution: {integrity: sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.80':
+ resolution: {integrity: sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==}
+ engines: {node: '>= 10'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-x64-gnu@0.1.80':
+ resolution: {integrity: sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-x64-musl@0.1.80':
+ resolution: {integrity: sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@napi-rs/canvas-win32-x64-msvc@0.1.80':
+ resolution: {integrity: sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@napi-rs/canvas@0.1.80':
+ resolution: {integrity: sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==}
+ engines: {node: '>= 10'}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@pnpm/constants@7.1.1':
+ resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/crypto.base32-hash@2.0.0':
+ resolution: {integrity: sha512-3ttOeHBpmWRbgJrpDQ8Nwd3W8s8iuiP5YZM0JRyKWaMtX8lu9d7/AKyxPmhYsMJuN+q/1dwHa7QFeDZJ53b0oA==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/dependency-path@2.1.8':
+ resolution: {integrity: sha512-ywBaTjy0iSEF7lH3DlF8UXrdL2bw4AQFV2tTOeNeY7wc1W5CE+RHSJhf9MXBYcZPesqGRrPiU7Pimj3l05L9VA==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/error@5.0.3':
+ resolution: {integrity: sha512-ONJU5cUeoeJSy50qOYsMZQHTA/9QKmGgh1ATfEpCLgtbdwqUiwD9MxHNeXUYYI/pocBCz6r1ZCFqiQvO+8SUKA==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/exec@2.0.0':
+ resolution: {integrity: sha512-b5ALfWEOFQprWKntN7MF8XWCyslBk2c8u20GEDcDDQOs6c0HyHlWxX5lig8riQKdS000U6YyS4L4b32NOleXAQ==}
+ engines: {node: '>=10'}
+
+ '@pnpm/exportable-manifest@5.0.12':
+ resolution: {integrity: sha512-ZDDZ56rC07ypTsyaNon09mbTh6Fgq4tF1Gi5pWQ55UE/oytDUokIPukzYw+LfA+w5QgO9zTdTcP7aeIKJ4UbMQ==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/find-workspace-dir@6.0.3':
+ resolution: {integrity: sha512-0iJnNkS4T8lJE4ldOhRERgER1o59iHA1nMlvpUI5lxNC9SUruH6peRUOlP4/rNcDg+UQ9u0rt5loYOnWKCojtw==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/git-utils@1.0.0':
+ resolution: {integrity: sha512-lUI+XrzOJN4zdPGOGnFUrmtXAXpXi8wD8OI0nWOZmlh+raqbLzC3VkXu1zgaduOK6YonOcnQW88O+ojav1rAdA==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/graceful-fs@3.2.0':
+ resolution: {integrity: sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/lockfile-file@8.1.8':
+ resolution: {integrity: sha512-bRadYzGFyFtwiynwp4Mkn7NDNHkgKvJ9xtjsCT5XiE6S8wpzS3W8yx2WzHGk9Mm1J/2wM0F52+NzCWhlz5eIqA==}
+ engines: {node: '>=16.14'}
+ peerDependencies:
+ '@pnpm/logger': ^5.0.0
+
+ '@pnpm/lockfile-types@5.1.5':
+ resolution: {integrity: sha512-02FP0HynzX+2DcuPtuMy7PH+kLIC0pevAydAOK+zug2bwdlSLErlvSkc+4+3dw60eRWgUXUqyfO2eR/Ansdbng==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/logger@5.2.0':
+ resolution: {integrity: sha512-dCdSs2wPCweMkRLdISAKBOKSWeq/9iS9aanWgjoUkFs06KN2o5XGFg53oCXg/KbZhF9AXS3vMHPwTebzCeAEsA==}
+ engines: {node: '>=18.12'}
+
+ '@pnpm/make-dedicated-lockfile@0.5.15':
+ resolution: {integrity: sha512-jLLRzwp/Vd1W5DMXgOJc+ED1IHT8ctOMgD/Ts5dP/gImBIWHI5S/pbM15yKIDGwGPQbza8DdQGkxsoPFETNgxg==}
+ engines: {node: '>=16.14'}
+ hasBin: true
+
+ '@pnpm/merge-lockfile-changes@5.0.7':
+ resolution: {integrity: sha512-fYmX1+EHv3wg7l4A9FCEkjgEBIHaY6JosknkLk3pL8dbB9k6unjIrF9f2onNtpj3XUlWxZ3aBw9THk/Bf6hKow==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/prune-lockfile@5.0.10':
+ resolution: {integrity: sha512-0/BO97f6jOnCo0YTQcUrrIUQMtz7Y2tDBUteWKTvAPYFifOFkmeIPhPecEfNemxVv9ryBUoCS2KzyIHKDQv+ug==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/ramda@0.28.1':
+ resolution: {integrity: sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==}
+
+ '@pnpm/read-project-manifest@5.0.11':
+ resolution: {integrity: sha512-themRLiDt9Ud6Somlu0PJbeprBBQEhlI1xNG5bZIv26yfLsc1vYLd1TfgGViD1b8fP0jxAqsUrDM+WMaMKI+gw==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/self-installer@2.2.1':
+ resolution: {integrity: sha512-aefLe96wAWghkx6q1PwbVS1Iz1iGE+HKwkTmtzWLFXeGhbknaIdG2voMwaBGIYGCSxm8sDKR1uLO4aRRAYuc+Q==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ '@pnpm/text.comments-parser@2.0.0':
+ resolution: {integrity: sha512-DRWtTmmxQQtuWHf1xPt9bqzCSq8d0MQF5x1kdpCDMLd7xk3nP4To2/OGkPrb8MKbrWsgCNDwXyKCFlEKrAg7fg==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/types@9.4.2':
+ resolution: {integrity: sha512-g1hcF8Nv4gd76POilz9gD4LITAPXOe5nX4ijgr8ixCbLQZfcpYiMfJ+C1RlMNRUDo8vhlNB4O3bUlxmT6EAQXA==}
+ engines: {node: '>=16.14'}
+
+ '@pnpm/util.lex-comparator@1.0.0':
+ resolution: {integrity: sha512-3aBQPHntVgk5AweBWZn+1I/fqZ9krK/w01197aYVkAJQGftb+BVWgEepxY5GChjSW12j52XX+CmfynYZ/p0DFQ==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/write-project-manifest@5.0.6':
+ resolution: {integrity: sha512-3qkKCftRE/HXzoWedyDuaMMUQzheDwx8AQXR0DnA9ylsBnZQYNut19Ado/gzi5+IvznaMcqrBszw57j3y1/ILw==}
+ engines: {node: '>=16.14'}
+
+ '@protobufjs/aspromise@1.1.2':
+ resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+
+ '@protobufjs/base64@1.1.2':
+ resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+
+ '@protobufjs/codegen@2.0.4':
+ resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+
+ '@protobufjs/eventemitter@1.1.0':
+ resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+
+ '@protobufjs/fetch@1.1.0':
+ resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+
+ '@protobufjs/float@1.0.2':
+ resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+
+ '@protobufjs/inquire@1.1.0':
+ resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+
+ '@protobufjs/path@1.1.2':
+ resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+
+ '@protobufjs/pool@1.1.0':
+ resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+
+ '@protobufjs/utf8@1.1.0':
+ resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+
+ '@puppeteer/browsers@2.10.10':
+ resolution: {integrity: sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ '@rolldown/pluginutils@1.0.0-beta.27':
+ resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
+
+ '@rollup/plugin-babel@5.3.1':
+ resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
+ engines: {node: '>= 10.0.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ '@types/babel__core': ^7.1.9
+ rollup: ^1.20.0||^2.0.0
+ peerDependenciesMeta:
+ '@types/babel__core':
+ optional: true
+
+ '@rollup/plugin-node-resolve@11.2.1':
+ resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==}
+ engines: {node: '>= 10.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+
+ '@rollup/plugin-replace@2.4.2':
+ resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==}
+ peerDependencies:
+ rollup: ^1.20.0 || ^2.0.0
+
+ '@rollup/pluginutils@3.1.0':
+ resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+
+ '@rollup/pluginutils@5.3.0':
+ resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.51.0':
+ resolution: {integrity: sha512-VyfldO8T/C5vAXBGIobrAnUE+VJNVLw5z9h4NgSDq/AJZWt/fXqdW+0PJbk+M74xz7yMDRiHtlsuDV7ew6K20w==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.51.0':
+ resolution: {integrity: sha512-Z3ujzDZgsEVSokgIhmOAReh9SGT2qloJJX2Xo1Q3nPU1EhCXrV0PbpR3r7DWRgozqnjrPZQkLe5cgBPIYp70Vg==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.51.0':
+ resolution: {integrity: sha512-T3gskHgArUdR6TCN69li5VELVAZK+iQ4iwMoSMNYixoj+56EC9lTj35rcxhXzIJt40YfBkvDy3GS+t5zh7zM6g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.51.0':
+ resolution: {integrity: sha512-Hh7n/fh0g5UjH6ATDF56Qdf5bzdLZKIbhp5KftjMYG546Ocjeyg15dxphCpH1FFY2PJ2G6MiOVL4jMq5VLTyrQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.51.0':
+ resolution: {integrity: sha512-0EddADb6FBvfqYoxwVom3hAbAvpSVUbZqmR1wmjk0MSZ06hn/UxxGHKRqEQDMkts7XiZjejVB+TLF28cDTU+gA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.51.0':
+ resolution: {integrity: sha512-MpqaEDLo3JuVPF+wWV4mK7V8akL76WCz8ndfz1aVB7RhvXFO3k7yT7eu8OEuog4VTSyNu5ibvN9n6lgjq/qLEQ==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.51.0':
+ resolution: {integrity: sha512-WEWAGFNFFpvSWAIT3MYvxTkYHv/cJl9yWKpjhheg7ONfB0hetZt/uwBnM3GZqSHrk5bXCDYTFXg3jQyk/j7eXQ==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.51.0':
+ resolution: {integrity: sha512-9bxtxj8QoAp++LOq5PGDGkEEOpCDk9rOEHUcXadnijedDH8IXrBt6PnBa4Y6NblvGWdoxvXZYghZLaliTCmAng==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.51.0':
+ resolution: {integrity: sha512-DdqA+fARqIsfqDYkKo2nrWMp0kvu/wPJ2G8lZ4DjYhn+8QhrjVuzmsh7tTkhULwjvHTN59nWVzAixmOi6rqjNA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.51.0':
+ resolution: {integrity: sha512-2XVRNzcUJE1UJua8P4a1GXS5jafFWE+pQ6zhUbZzptOu/70p1F6+0FTi6aGPd6jNtnJqGMjtBCXancC2dhYlWw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.51.0':
+ resolution: {integrity: sha512-R8QhY0kLIPCAVXWi2yftDSpn7Jtejey/WhMoBESSfwGec5SKdFVupjxFlKoQ7clVRuaDpiQf7wNx3EBZf4Ey6g==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.51.0':
+ resolution: {integrity: sha512-I498RPfxx9cMv1KTHQ9tg2Ku1utuQm+T5B+Xro+WNu3FzAFSKp4awKfgMoZwjoPgNbaFGINaOM25cQW6WuBhiQ==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.51.0':
+ resolution: {integrity: sha512-o8COudsb8lvtdm9ixg9aKjfX5aeoc2x9KGE7WjtrmQFquoCRZ9jtzGlonujE4WhvXFepTraWzT4RcwyDDeHXjA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.51.0':
+ resolution: {integrity: sha512-0shJPgSXMdYzOQzpM5BJN2euXY1f8uV8mS6AnrbMcH2KrkNsbpMxWB1wp8UEdiJ1NtyBkCk3U/HfX5mEONBq6w==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.51.0':
+ resolution: {integrity: sha512-L7pV+ny7865jamSCQwyozBYjFRUKaTsPqDz7ClOtJCDu4paf2uAa0mrcHwSt4XxZP2ogFZS9uuitH3NXdeBEJA==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.51.0':
+ resolution: {integrity: sha512-4YHhP+Rv3T3+H3TPbUvWOw5tuSwhrVhkHHZhk4hC9VXeAOKR26/IsUAT4FsB4mT+kfIdxxb1BezQDEg/voPO8A==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.51.0':
+ resolution: {integrity: sha512-P7U7U03+E5w7WgJtvSseNLOX1UhknVPmEaqgUENFWfNxNBa1OhExT6qYGmyF8gepcxWSaSfJsAV5UwhWrYefdQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openharmony-arm64@4.51.0':
+ resolution: {integrity: sha512-FuD8g3u9W6RPwdO1R45hZFORwa1g9YXEMesAKP/sOi7mDqxjbni8S3zAXJiDcRfGfGBqpRYVuH54Gu3FTuSoEw==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.51.0':
+ resolution: {integrity: sha512-zST+FdMCX3QAYfmZX3dp/Fy8qLUetfE17QN5ZmmFGPrhl86qvRr+E9u2bk7fzkIXsfQR30Z7ZRS7WMryPPn4rQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.51.0':
+ resolution: {integrity: sha512-U+qhoCVAZmTHCmUKxdQxw1jwAFNFXmOpMME7Npt5GTb1W/7itfgAgNluVOvyeuSeqW+dEQLFuNZF3YZPO8XkMg==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.51.0':
+ resolution: {integrity: sha512-z6UpFzMhXSD8NNUfCi2HO+pbpSzSWIIPgb1TZsEZjmZYtk6RUIC63JYjlFBwbBZS3jt3f1q6IGfkj3g+GnBt2Q==}
+ cpu: [x64]
+ os: [win32]
+
+ '@surma/rollup-plugin-off-main-thread@2.2.3':
+ resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0':
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0':
+ resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0':
+ resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0':
+ resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0':
+ resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0':
+ resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-preset@8.1.0':
+ resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/core@8.1.0':
+ resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
+ engines: {node: '>=14'}
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+ engines: {node: '>=14'}
+
+ '@svgr/plugin-jsx@8.1.0':
+ resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@testing-library/dom@10.4.1':
+ resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
+ engines: {node: '>=18'}
+
+ '@testing-library/jest-dom@6.8.0':
+ resolution: {integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==}
+ engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
+ '@testing-library/react@16.3.0':
+ resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@testing-library/dom': ^10.0.0
+ '@types/react': ^18.0.0 || ^19.0.0
+ '@types/react-dom': ^18.0.0 || ^19.0.0
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@testing-library/user-event@14.6.1':
+ resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ '@testing-library/dom': '>=7.21.4'
+
+ '@tootallnate/once@2.0.0':
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+
+ '@tootallnate/quickjs-emscripten@0.23.0':
+ resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
+
+ '@types/aria-query@5.0.4':
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
+ '@types/body-parser@1.19.6':
+ resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
+
+ '@types/caseless@0.12.5':
+ resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==}
+
+ '@types/chai@5.2.2':
+ resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
+
+ '@types/compression@1.8.1':
+ resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/cors@2.8.19':
+ resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==}
+
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+
+ '@types/estree@0.0.39':
+ resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/express-serve-static-core@4.19.6':
+ resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
+
+ '@types/express-serve-static-core@5.0.7':
+ resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==}
+
+ '@types/express@4.17.17':
+ resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==}
+
+ '@types/express@4.17.23':
+ resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==}
+
+ '@types/express@5.0.3':
+ resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
+
+ '@types/http-errors@2.0.5':
+ resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/long@4.0.2':
+ resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
+
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+ '@types/node@24.5.2':
+ resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==}
+
+ '@types/normalize-package-data@2.4.4':
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+
+ '@types/parse-json@4.0.2':
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+ '@types/qs@6.14.0':
+ resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/react-dom@19.1.9':
+ resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==}
+ peerDependencies:
+ '@types/react': ^19.0.0
+
+ '@types/react@19.1.13':
+ resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==}
+
+ '@types/request@2.48.13':
+ resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==}
+
+ '@types/resolve@1.17.1':
+ resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
+
+ '@types/send@0.17.5':
+ resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==}
+
+ '@types/serve-static@1.15.8':
+ resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==}
+
+ '@types/tough-cookie@4.0.5':
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
+ '@types/ws@8.18.1':
+ resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
+
+ '@types/yauzl@2.10.3':
+ resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+
+ '@typescript-eslint/eslint-plugin@8.44.0':
+ resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.44.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.44.0':
+ resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/project-service@8.44.0':
+ resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.44.0':
+ resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.44.0':
+ resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.44.0':
+ resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/types@8.44.0':
+ resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.44.0':
+ resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.44.0':
+ resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/visitor-keys@8.44.0':
+ resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@vitejs/plugin-react@4.7.0':
+ resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+
+ '@vitest/coverage-v8@3.2.4':
+ resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==}
+ peerDependencies:
+ '@vitest/browser': 3.2.4
+ vitest: 3.2.4
+ peerDependenciesMeta:
+ '@vitest/browser':
+ optional: true
+
+ '@vitest/expect@3.2.4':
+ resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
+
+ '@vitest/mocker@3.2.4':
+ resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@3.2.4':
+ resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
+
+ '@vitest/runner@3.2.4':
+ resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
+
+ '@vitest/snapshot@3.2.4':
+ resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
+
+ '@vitest/spy@3.2.4':
+ resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
+
+ '@vitest/utils@3.2.4':
+ resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
+
+ '@zkochan/js-yaml@0.0.6':
+ resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==}
+ hasBin: true
+
+ '@zkochan/rimraf@2.1.3':
+ resolution: {integrity: sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==}
+ engines: {node: '>=12.10'}
+
+ '@zkochan/which@2.0.3':
+ resolution: {integrity: sha512-C1ReN7vt2/2O0fyTsx5xnbQuxBrmG5NMSbcIkPKCCfCTJgpZBsuRYzFXHj3nVq8vTfK7vxHUmzfCpSHgO7j4rg==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ arrify@2.0.1:
+ resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
+ engines: {node: '>=8'}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ ast-types@0.13.4:
+ resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==}
+ engines: {node: '>=4'}
+
+ ast-v8-to-istanbul@0.3.5:
+ resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ async-retry@1.3.3:
+ resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ at-least-node@1.0.0:
+ resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+ engines: {node: '>= 4.0.0'}
+
+ atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ b4a@1.7.1:
+ resolution: {integrity: sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==}
+ peerDependencies:
+ react-native-b4a: '*'
+ peerDependenciesMeta:
+ react-native-b4a:
+ optional: true
+
+ babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+
+ babel-plugin-polyfill-corejs2@0.4.14:
+ resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-corejs3@0.13.0:
+ resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-regenerator@0.6.5:
+ resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ bare-events@2.6.1:
+ resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==}
+
+ bare-fs@4.4.4:
+ resolution: {integrity: sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==}
+ engines: {bare: '>=1.16.0'}
+ peerDependencies:
+ bare-buffer: '*'
+ peerDependenciesMeta:
+ bare-buffer:
+ optional: true
+
+ bare-os@3.6.2:
+ resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==}
+ engines: {bare: '>=1.14.0'}
+
+ bare-path@3.0.0:
+ resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==}
+
+ bare-stream@2.7.0:
+ resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==}
+ peerDependencies:
+ bare-buffer: '*'
+ bare-events: '*'
+ peerDependenciesMeta:
+ bare-buffer:
+ optional: true
+ bare-events:
+ optional: true
+
+ bare-url@2.2.2:
+ resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ baseline-browser-mapping@2.8.5:
+ resolution: {integrity: sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q==}
+ hasBin: true
+
+ basic-ftp@5.0.5:
+ resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
+ engines: {node: '>=10.0.0'}
+
+ bignumber.js@9.3.1:
+ resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ bole@5.0.21:
+ resolution: {integrity: sha512-sWYAQ4j0CuTEqvcSrai6+Helnrkhc9dkUU2WZFlUiDPj7+eLGVN1jODH0a0Xmdohynhvu83URRwWJzPHE0veRw==}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.26.2:
+ resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+
+ buffer-equal-constant-time@1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ builtin-modules@3.3.0:
+ resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+ engines: {node: '>=6'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ caniuse-lite@1.0.30001743:
+ resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==}
+
+ chai@5.3.3:
+ resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
+ engines: {node: '>=18'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ chromium-bidi@8.0.0:
+ resolution: {integrity: sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==}
+ peerDependencies:
+ devtools-protocol: '*'
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ cloudevents@6.0.4:
+ resolution: {integrity: sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==}
+ engines: {node: '>=12 <20.0.0'}
+
+ cloudevents@8.0.3:
+ resolution: {integrity: sha512-wTixKNjfLeyj9HQpESvLVVO4xgdqdvX4dTeg1IZ2SCunu/fxVzCamcIZneEyj31V82YolFCKwVeSkr8zResB0Q==}
+ engines: {node: '>=16 <=22'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ command-exists@1.2.9:
+ resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ common-tags@1.8.2:
+ resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+ engines: {node: '>=4.0.0'}
+
+ compressible@2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+
+ compression@1.8.1:
+ resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==}
+ engines: {node: '>= 0.8.0'}
+
+ comver-to-semver@1.0.0:
+ resolution: {integrity: sha512-gcGtbRxjwROQOdXLUWH1fQAXqThUVRZ219aAwgtX3KfYw429/Zv6EIJRf5TBSzWdAGwePmqH7w70WTaX4MDqag==}
+ engines: {node: '>=12.17'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ configstore@5.0.1:
+ resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
+ engines: {node: '>=8'}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ core-js-compat@3.45.1:
+ resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cosmiconfig@9.0.0:
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crypto-random-string@2.0.0:
+ resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
+ engines: {node: '>=8'}
+
+ css.escape@1.5.1:
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+
+ cssstyle@4.6.0:
+ resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==}
+ engines: {node: '>=18'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ data-uri-to-buffer@6.0.2:
+ resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==}
+ engines: {node: '>= 14'}
+
+ data-urls@5.0.0:
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+ engines: {node: '>=18'}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ dateformat@4.6.3:
+ resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ degenerator@5.0.1:
+ resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==}
+ engines: {node: '>= 14'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ devtools-protocol@0.0.1495869:
+ resolution: {integrity: sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==}
+
+ dom-accessibility-api@0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+
+ dom-accessibility-api@0.6.3:
+ resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
+ dotenv@16.0.3:
+ resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
+ engines: {node: '>=12'}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ duplexify@4.1.3:
+ resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ ecdsa-sig-formatter@1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ ejs@3.1.10:
+ resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ electron-to-chromium@1.5.221:
+ resolution: {integrity: sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ encode-registry@3.0.1:
+ resolution: {integrity: sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==}
+ engines: {node: '>=10'}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+ ent@2.2.2:
+ resolution: {integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==}
+ engines: {node: '>= 0.4'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-abstract@1.24.0:
+ resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.25.10:
+ resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escodegen@2.1.0:
+ resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+ engines: {node: '>=6.0'}
+ hasBin: true
+
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react-refresh@0.4.20:
+ resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==}
+ peerDependencies:
+ eslint: '>=8.40'
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.35.0:
+ resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@1.0.1:
+ resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+
+ expect-type@1.2.2:
+ resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
+ engines: {node: '>=12.0.0'}
+
+ express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ engines: {node: '>= 0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ extract-zip@2.0.1:
+ resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+ engines: {node: '>= 10.17.0'}
+ hasBin: true
+
+ fast-copy@3.0.2:
+ resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-fifo@1.3.2:
+ resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-redact@3.5.0:
+ resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==}
+ engines: {node: '>=6'}
+
+ fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
+ fast-text-encoding@1.0.6:
+ resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==}
+
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+ fast-xml-parser@4.5.3:
+ resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
+ hasBin: true
+
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+ fd-slicer@1.1.0:
+ resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ filelist@1.0.4:
+ resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+
+ find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
+ form-data@2.5.5:
+ resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==}
+ engines: {node: '>= 0.12'}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-extra@9.1.0:
+ resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+ engines: {node: '>=10'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ gaxios@4.3.3:
+ resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==}
+ engines: {node: '>=10'}
+
+ gaxios@6.7.1:
+ resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==}
+ engines: {node: '>=14'}
+
+ gcp-metadata@4.3.1:
+ resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==}
+ engines: {node: '>=10'}
+
+ gcp-metadata@6.1.1:
+ resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==}
+ engines: {node: '>=14'}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-own-enumerable-property-symbols@3.0.2:
+ resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.10.1:
+ resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==}
+
+ get-uri@6.0.5:
+ resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==}
+ engines: {node: '>= 14'}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ glob@11.0.3:
+ resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==}
+ engines: {node: 20 || >=22}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ google-auth-library@7.14.1:
+ resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==}
+ engines: {node: '>=10'}
+
+ google-auth-library@9.15.1:
+ resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
+ engines: {node: '>=14'}
+
+ google-gax@4.6.1:
+ resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==}
+ engines: {node: '>=14'}
+
+ google-logging-utils@0.0.2:
+ resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==}
+ engines: {node: '>=14'}
+
+ google-p12-pem@3.1.4:
+ resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==}
+ engines: {node: '>=10'}
+ deprecated: Package is no longer maintained
+ hasBin: true
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ gtoken@5.3.2:
+ resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==}
+ engines: {node: '>=10'}
+
+ gtoken@7.1.0:
+ resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==}
+ engines: {node: '>=14.0.0'}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hash-stream-validation@0.2.4:
+ resolution: {integrity: sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ help-me@5.0.0:
+ resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==}
+
+ hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+ hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+
+ html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+
+ html-entities@2.6.0:
+ resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
+
+ html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+ html-tags@3.3.1:
+ resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+ engines: {node: '>=8'}
+
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
+ http-proxy-agent@5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
+ human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ husky@9.1.7:
+ resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.7.0:
+ resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
+ engines: {node: '>=0.10.0'}
+
+ idb@7.1.1:
+ resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
+ ignore-by-default@1.0.1:
+ resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+
+ individual@3.0.0:
+ resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ ip-address@10.0.1:
+ resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==}
+ engines: {node: '>= 12'}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-generator-function@1.1.0:
+ resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-html@2.0.0:
+ resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==}
+ engines: {node: '>=8'}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-module@1.0.0:
+ resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-obj@1.0.1:
+ resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
+ engines: {node: '>=0.10.0'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-regexp@1.0.0:
+ resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
+ engines: {node: '>=0.10.0'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-typedarray@1.0.0:
+ resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+
+ istanbul-lib-source-maps@5.0.6:
+ resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
+ engines: {node: '>=10'}
+
+ istanbul-reports@3.2.0:
+ resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
+ engines: {node: '>=8'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jackspeak@4.1.1:
+ resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==}
+ engines: {node: 20 || >=22}
+
+ jake@10.9.4:
+ resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ jest-worker@26.6.2:
+ resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
+ engines: {node: '>= 10.13.0'}
+
+ joycon@3.1.1:
+ resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
+ engines: {node: '>=10'}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsdom@26.1.0:
+ resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^3.0.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-bigint@1.0.0:
+ resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-schema@0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json-stringify-safe@5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@6.2.0:
+ resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
+
+ jsonpointer@5.0.1:
+ resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
+ engines: {node: '>=0.10.0'}
+
+ jwa@2.0.1:
+ resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
+
+ jws@4.0.0:
+ resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.sortby@4.7.0:
+ resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ long@5.3.2:
+ resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ loupe@3.2.1:
+ resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@11.2.1:
+ resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==}
+ engines: {node: 20 || >=22}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
+ engines: {node: '>=12'}
+
+ lz-string@1.5.0:
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+ hasBin: true
+
+ magic-string@0.25.9:
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+
+ magic-string@0.30.19:
+ resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
+
+ magicast@0.3.5:
+ resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+ make-dir@3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+
+ make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+
+ map-age-cleaner@0.1.3:
+ resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
+ engines: {node: '>=6'}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ mem@8.1.1:
+ resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==}
+ engines: {node: '>=10'}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mime@3.0.0:
+ resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@3.1.0:
+ resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
+ engines: {node: '>=8'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minimatch@10.0.3:
+ resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
+ engines: {node: 20 || >=22}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ ndjson@2.0.0:
+ resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ negotiator@0.6.4:
+ resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
+ engines: {node: '>= 0.6'}
+
+ netmask@2.0.2:
+ resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
+ engines: {node: '>= 0.4.0'}
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-ensure@0.0.0:
+ resolution: {integrity: sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-forge@1.3.1:
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+ engines: {node: '>= 6.13.0'}
+
+ node-releases@2.0.21:
+ resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==}
+
+ nodemon@3.1.10:
+ resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ nwsapi@2.2.22:
+ resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ on-exit-leak-free@2.1.2:
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
+ engines: {node: '>=14.0.0'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ on-headers@1.1.0:
+ resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ openai@5.21.0:
+ resolution: {integrity: sha512-E9LuV51vgvwbahPJaZu2x4V6SWMq9g3X6Bj2/wnFiNfV7lmAxYVxPxcQNZqCWbAVMaEoers9HzIxpOp6Vvgn8w==}
+ hasBin: true
+ peerDependencies:
+ ws: ^8.18.0
+ zod: ^3.23.8
+ peerDependenciesMeta:
+ ws:
+ optional: true
+ zod:
+ optional: true
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-defer@1.0.0:
+ resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
+ engines: {node: '>=4'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-map-values@1.0.0:
+ resolution: {integrity: sha512-/n8QJM4Os3HLRMSuQWwAocsMExENSQwWTgRi8m3JVEOWQ/4gud14igBcnYvSGQTbiyZbuizxEmwf0w3ITn67gg==}
+ engines: {node: '>=14'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ pac-proxy-agent@7.2.0:
+ resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==}
+ engines: {node: '>= 14'}
+
+ pac-resolver@7.0.1:
+ resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==}
+ engines: {node: '>= 14'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-name@1.0.0:
+ resolution: {integrity: sha512-/dcAb5vMXH0f51yvMuSUqFpxUcA8JelbRmE5mW/p4CUJxrNgK24IkstnV7ENtg2IDGBOu6izKTG6eilbnbNKWQ==}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-scurry@2.0.0:
+ resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
+ engines: {node: 20 || >=22}
+
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ pathval@2.0.1:
+ resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
+ engines: {node: '>= 14.16'}
+
+ pdf-parse@1.1.1:
+ resolution: {integrity: sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==}
+ engines: {node: '>=6.8.1'}
+
+ pdfjs-dist@5.4.149:
+ resolution: {integrity: sha512-Xe8/1FMJEQPUVSti25AlDpwpUm2QAVmNOpFP0SIahaPIOKBKICaefbzogLdwey3XGGoaP4Lb9wqiw2e9Jqp0LA==}
+ engines: {node: '>=20.16.0 || >=22.3.0'}
+
+ pend@1.2.0:
+ resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ pino-abstract-transport@2.0.0:
+ resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==}
+
+ pino-pretty@13.1.1:
+ resolution: {integrity: sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA==}
+ hasBin: true
+
+ pino-std-serializers@7.0.0:
+ resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==}
+
+ pino@9.10.0:
+ resolution: {integrity: sha512-VOFxoNnxICtxaN8S3E73pR66c5MTFC+rwRcNRyHV/bV/c90dXvJqMfjkeRFsGBDXmlUN3LccJQPqGIufnaJePA==}
+ hasBin: true
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier@3.6.2:
+ resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ pretty-bytes@5.6.0:
+ resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
+ engines: {node: '>=6'}
+
+ pretty-bytes@6.1.1:
+ resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+
+ pretty-format@27.5.1:
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+ process-warning@5.0.0:
+ resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
+
+ process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+
+ progress@2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+
+ proto3-json-serializer@2.0.2:
+ resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
+ engines: {node: '>=14.0.0'}
+
+ protobufjs@7.5.4:
+ resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
+ engines: {node: '>=12.0.0'}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ proxy-agent@6.5.0:
+ resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==}
+ engines: {node: '>= 14'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ pstree.remy@1.1.8:
+ resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
+
+ pump@3.0.3:
+ resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
+
+ pumpify@2.0.1:
+ resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==}
+
+ punycode@1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ puppeteer-core@24.22.0:
+ resolution: {integrity: sha512-oUeWlIg0pMz8YM5pu0uqakM+cCyYyXkHBxx9di9OUELu9X9+AYrNGGRLK9tNME3WfN3JGGqQIH3b4/E9LGek/w==}
+ engines: {node: '>=18'}
+
+ puppeteer@24.22.0:
+ resolution: {integrity: sha512-QabGIvu7F0hAMiKGHZCIRHMb6UoH0QAJA2OaqxEU2tL5noXPrxUcotg2l3ttOA4p1PFnVIGkr6PXRAWlM2evVQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+
+ raw-body@3.0.1:
+ resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==}
+ engines: {node: '>= 0.10'}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+ react-refresh@0.17.0:
+ resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
+ engines: {node: '>=0.10.0'}
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+
+ read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+
+ read-yaml-file@2.1.0:
+ resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==}
+ engines: {node: '>=10.13'}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ real-require@0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+
+ redent@3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ regenerate-unicode-properties@10.2.2:
+ resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==}
+ engines: {node: '>=4'}
+
+ regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ regexpu-core@6.3.1:
+ resolution: {integrity: sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==}
+ engines: {node: '>=4'}
+
+ regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+ regjsparser@0.12.0:
+ resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
+ hasBin: true
+
+ rename-overwrite@5.0.4:
+ resolution: {integrity: sha512-BOR/6Zr3F0vmTzwvkiCZaPrzv1NJZQVRhrWA4w2IQtj33owmh5Y4LRajsR4QrqdIgLlAqOLEEc1PiUf15ku9hQ==}
+ engines: {node: '>=12.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ retry-request@4.2.2:
+ resolution: {integrity: sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==}
+ engines: {node: '>=8.10.0'}
+
+ retry-request@7.0.2:
+ resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==}
+ engines: {node: '>=14'}
+
+ retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfc4648@1.5.4:
+ resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rimraf@6.0.1:
+ resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
+ engines: {node: 20 || >=22}
+ hasBin: true
+
+ rollup-plugin-terser@7.0.2:
+ resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
+ deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
+ peerDependencies:
+ rollup: ^2.0.0
+
+ rollup-plugin-visualizer@5.14.0:
+ resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ rolldown: 1.x
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+
+ rollup@2.79.2:
+ resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ rollup@4.51.0:
+ resolution: {integrity: sha512-7cR0XWrdp/UAj2HMY/Y4QQEUjidn3l2AY1wSeZoFjMbD8aOMPoV9wgTFYbrJpPzzvejDEini1h3CiUP8wLzxQA==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rrweb-cssom@0.8.0:
+ resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-execa@0.1.2:
+ resolution: {integrity: sha512-vdTshSQ2JsRCgT8eKZWNJIL26C6bVqy1SOmuCMlKHegVeo8KYRobRrefOdUq9OozSPUUiSxrylteeRmLOMFfWg==}
+ engines: {node: '>=12'}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ secure-json-parse@4.0.0:
+ resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+
+ serialize-javascript@4.0.0:
+ resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
+
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ simple-update-notifier@2.0.0:
+ resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==}
+ engines: {node: '>=10'}
+
+ smart-buffer@4.2.0:
+ resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
+ engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ socks-proxy-agent@8.0.5:
+ resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==}
+ engines: {node: '>= 14'}
+
+ socks@2.8.7:
+ resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==}
+ engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
+
+ sonic-boom@4.2.0:
+ resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==}
+
+ sort-keys@4.2.0:
+ resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==}
+ engines: {node: '>=8'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
+ source-map@0.8.0-beta.0:
+ resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
+ engines: {node: '>= 8'}
+ deprecated: The work that was done in this beta branch won't be included in future versions
+
+ sourcemap-codec@1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ deprecated: Please use @jridgewell/sourcemap-codec instead
+
+ spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+ spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+ spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+ spdx-license-ids@3.0.22:
+ resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==}
+
+ split2@3.2.2:
+ resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
+ std-env@3.9.0:
+ resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ stream-events@1.0.5:
+ resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
+
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+
+ streamx@2.22.1:
+ resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ stringify-object@3.3.0:
+ resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
+ engines: {node: '>=4'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.2:
+ resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
+ engines: {node: '>=12'}
+
+ strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+
+ strip-comments-strings@1.2.0:
+ resolution: {integrity: sha512-zwF4bmnyEjZwRhaak9jUWNxc0DoeKBJ7lwSN/LEc8dQXZcUFG6auaaTQJokQWXopLdM3iTx01nQT8E4aL29DAQ==}
+
+ strip-comments@2.0.1:
+ resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==}
+ engines: {node: '>=10'}
+
+ strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ strip-json-comments@5.0.3:
+ resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==}
+ engines: {node: '>=14.16'}
+
+ strip-literal@3.0.0:
+ resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
+
+ strnum@1.1.2:
+ resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
+
+ stubs@3.0.0:
+ resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==}
+
+ stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+ tar-fs@3.1.1:
+ resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==}
+
+ tar-stream@3.1.7:
+ resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
+
+ teeny-request@7.2.0:
+ resolution: {integrity: sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw==}
+ engines: {node: '>=10'}
+
+ teeny-request@9.0.0:
+ resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==}
+ engines: {node: '>=14'}
+
+ temp-dir@2.0.0:
+ resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
+ engines: {node: '>=8'}
+
+ tempy@0.6.0:
+ resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==}
+ engines: {node: '>=10'}
+
+ terser@5.44.0:
+ resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ test-exclude@7.0.1:
+ resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
+ engines: {node: '>=18'}
+
+ text-decoder@1.2.3:
+ resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==}
+
+ thread-stream@3.1.0:
+ resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==}
+
+ through2@4.0.2:
+ resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tinypool@1.1.1:
+ resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@2.0.0:
+ resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@4.0.4:
+ resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==}
+ engines: {node: '>=14.0.0'}
+
+ tldts-core@6.1.86:
+ resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
+
+ tldts@6.1.86:
+ resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
+ hasBin: true
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ touch@3.1.1:
+ resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==}
+ hasBin: true
+
+ tough-cookie@5.1.2:
+ resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
+ engines: {node: '>=16'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ tr46@1.0.1:
+ resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
+
+ tr46@5.1.1:
+ resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
+ engines: {node: '>=18'}
+
+ ts-api-utils@2.1.0:
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.20.5:
+ resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ turbo-darwin-64@2.5.6:
+ resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==}
+ cpu: [x64]
+ os: [darwin]
+
+ turbo-darwin-arm64@2.5.6:
+ resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ turbo-linux-64@2.5.6:
+ resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==}
+ cpu: [x64]
+ os: [linux]
+
+ turbo-linux-arm64@2.5.6:
+ resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ turbo-windows-64@2.5.6:
+ resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==}
+ cpu: [x64]
+ os: [win32]
+
+ turbo-windows-arm64@2.5.6:
+ resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==}
+ cpu: [arm64]
+ os: [win32]
+
+ turbo@2.5.6:
+ resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.16.0:
+ resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
+ engines: {node: '>=10'}
+
+ type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+
+ type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ typed-query-selector@2.12.0:
+ resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==}
+
+ typedarray-to-buffer@3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+
+ typescript@5.9.2:
+ resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undefsafe@2.0.5:
+ resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
+
+ undici-types@7.12.0:
+ resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==}
+
+ unicode-canonical-property-names-ecmascript@2.0.1:
+ resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-ecmascript@2.0.0:
+ resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+ engines: {node: '>=4'}
+
+ unicode-match-property-value-ecmascript@2.2.1:
+ resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==}
+ engines: {node: '>=4'}
+
+ unicode-property-aliases-ecmascript@2.2.0:
+ resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
+ engines: {node: '>=4'}
+
+ unique-string@2.0.0:
+ resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
+ engines: {node: '>=8'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ upath@1.2.0:
+ resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
+ engines: {node: '>=4'}
+
+ update-browserslist-db@1.1.3:
+ resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ util@0.12.5:
+ resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+
+ validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vite-node@3.2.4:
+ resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+
+ vite-plugin-compression@0.5.1:
+ resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+ peerDependencies:
+ vite: '>=2.0.0'
+
+ vite-plugin-pwa@1.0.3:
+ resolution: {integrity: sha512-/OpqIpUldALGxcsEnv/ekQiQ5xHkQ53wcoN5ewX4jiIDNGs3W+eNcI1WYZeyOLmzoEjg09D7aX0O89YGjen1aw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@vite-pwa/assets-generator': ^1.0.0
+ vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+ workbox-build: ^7.3.0
+ workbox-window: ^7.3.0
+ peerDependenciesMeta:
+ '@vite-pwa/assets-generator':
+ optional: true
+
+ vite-plugin-svgr@4.5.0:
+ resolution: {integrity: sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==}
+ peerDependencies:
+ vite: '>=2.6.0'
+
+ vite@7.1.6:
+ resolution: {integrity: sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitest@3.2.4:
+ resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/debug': ^4.1.12
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@vitest/browser': 3.2.4
+ '@vitest/ui': 3.2.4
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/debug':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
+ webdriver-bidi-protocol@0.2.11:
+ resolution: {integrity: sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ webidl-conversions@4.0.2:
+ resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
+
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+
+ whatwg-url@14.2.0:
+ resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
+ engines: {node: '>=18'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ whatwg-url@7.1.0:
+ resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.19:
+ resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ workbox-background-sync@6.6.0:
+ resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==}
+
+ workbox-broadcast-update@6.6.0:
+ resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==}
+
+ workbox-build@6.6.0:
+ resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==}
+ engines: {node: '>=10.0.0'}
+
+ workbox-cacheable-response@6.6.0:
+ resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==}
+ deprecated: workbox-background-sync@6.6.0
+
+ workbox-core@6.6.0:
+ resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==}
+
+ workbox-expiration@6.6.0:
+ resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==}
+
+ workbox-google-analytics@6.6.0:
+ resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==}
+ deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained
+
+ workbox-navigation-preload@6.6.0:
+ resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==}
+
+ workbox-precaching@6.6.0:
+ resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==}
+
+ workbox-range-requests@6.6.0:
+ resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==}
+
+ workbox-recipes@6.6.0:
+ resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==}
+
+ workbox-routing@6.6.0:
+ resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==}
+
+ workbox-strategies@6.6.0:
+ resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==}
+
+ workbox-streams@6.6.0:
+ resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==}
+
+ workbox-sw@6.6.0:
+ resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==}
+
+ workbox-window@6.6.0:
+ resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@3.0.3:
+ resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+
+ write-file-atomic@5.0.1:
+ resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ write-yaml-file@5.0.0:
+ resolution: {integrity: sha512-FdNA4RyH1L43TlvGG8qOMIfcEczwA5ij+zLXUy3Z83CjxhLvcV7/Q/8pk22wnCgYw7PJhtK+7lhO+qqyT4NdvQ==}
+ engines: {node: '>=16.14'}
+
+ ws@8.18.3:
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ xdg-basedir@4.0.0:
+ resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
+ engines: {node: '>=8'}
+
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yauzl@2.10.0:
+ resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+snapshots:
+
+ '@adobe/css-tools@4.4.4': {}
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)':
+ dependencies:
+ ajv: 8.17.1
+ json-schema: 0.4.0
+ jsonpointer: 5.0.1
+ leven: 3.1.0
+
+ '@asamuzakjp/css-color@3.2.0':
+ dependencies:
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+ lru-cache: 10.4.3
+
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.27.1
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.28.4': {}
+
+ '@babel/core@7.28.4':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.3
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.4
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3(supports-color@5.5.0)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.28.3':
+ dependencies:
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.4
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.26.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-member-expression-to-functions': 7.27.1
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/traverse': 7.28.4
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ regexpu-core: 6.3.1
+ semver: 6.3.1
+
+ '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ debug: 4.4.3(supports-color@5.5.0)
+ lodash.debounce: 4.0.8
+ resolve: 1.22.10
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-member-expression-to-functions@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/helper-plugin-utils@7.27.1': {}
+
+ '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-wrap-function': 7.28.3
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-member-expression-to-functions': 7.27.1
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.27.1': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helper-wrap-function@7.28.3':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.4
+ '@babel/types': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.4
+
+ '@babel/parser@7.28.4':
+ dependencies:
+ '@babel/types': 7.28.4
+
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+
+ '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4)
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-globals': 7.28.0
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4)
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/template': 7.27.2
+
+ '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4)
+ '@babel/traverse': 7.28.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4)
+ '@babel/helper-plugin-utils': 7.27.1
+
+ '@babel/preset-env@7.28.3(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/compat-data': 7.28.4
+ '@babel/core': 7.28.4
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.4)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)
+ '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4)
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4)
+ '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.4)
+ '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4)
+ '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.4)
+ '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4)
+ '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.4)
+ '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.4)
+ '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4)
+ '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.4)
+ '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.4)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.4)
+ babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4)
+ babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4)
+ babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4)
+ core-js-compat: 3.45.1
+ semver: 6.3.1
+ transitivePeerDependencies:
- supports-color
- dev: false
- /@grpc/grpc-js@1.6.12:
- resolution: {integrity: sha512-JmvQ03OTSpVd9JTlj/K3IWHSz4Gk/JMLUTtW7Zb0KvO1LcOYGATh5cNuRYzCAeDR3O8wq+q8FZe97eO9MBrkUw==}
- engines: {node: ^8.13.0 || >=10.10.0}
+ '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.4)':
dependencies:
- '@grpc/proto-loader': 0.7.10
- '@types/node': 20.1.7
- dev: false
+ '@babel/core': 7.28.4
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/types': 7.28.4
+ esutils: 2.0.3
- /@grpc/proto-loader@0.6.13:
- resolution: {integrity: sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==}
- engines: {node: '>=6'}
- hasBin: true
+ '@babel/runtime@7.28.4': {}
+
+ '@babel/template@7.27.2':
dependencies:
- '@types/long': 4.0.2
- lodash.camelcase: 4.3.0
- long: 4.0.0
- protobufjs: 6.11.4
- yargs: 16.2.0
- dev: false
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
- /@grpc/proto-loader@0.7.10:
- resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==}
- engines: {node: '>=6'}
- hasBin: true
+ '@babel/traverse@7.28.4':
dependencies:
- lodash.camelcase: 4.3.0
- long: 5.2.3
- protobufjs: 7.2.5
- yargs: 17.7.2
- dev: false
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.3
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.4
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.4
+ debug: 4.4.3(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
- /@gwhitney/detect-indent@7.0.1:
- resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==}
- engines: {node: '>=12.20'}
- dev: true
+ '@babel/types@7.28.4':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.27.1
+
+ '@bcoe/v8-coverage@1.0.2': {}
- /@humanwhocodes/config-array@0.11.14:
- resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
- engines: {node: '>=10.10.0'}
+ '@csstools/color-helpers@5.1.0': {}
+
+ '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
dependencies:
- '@humanwhocodes/object-schema': 2.0.2
- debug: 4.3.4
- minimatch: 3.1.2
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/color-helpers': 5.1.0
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-tokenizer@3.0.4': {}
+
+ '@emotion/babel-plugin@11.13.5':
+ dependencies:
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/runtime': 7.28.4
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/serialize': 1.3.3
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
transitivePeerDependencies:
- supports-color
- /@humanwhocodes/module-importer@1.0.1:
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
+ '@emotion/cache@11.14.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+ '@emotion/sheet': 1.4.0
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.4.0
+ stylis: 4.2.0
- /@humanwhocodes/object-schema@2.0.2:
- resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
+ '@emotion/hash@0.9.2': {}
- /@img/sharp-darwin-arm64@0.33.2:
- resolution: {integrity: sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==}
- engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
+ '@emotion/memoize@0.9.0': {}
+
+ '@emotion/react@11.14.0(@types/react@19.1.13)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@emotion/babel-plugin': 11.13.5
+ '@emotion/cache': 11.14.0
+ '@emotion/serialize': 1.3.3
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1)
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.4.0
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.0.1
- dev: false
+ '@types/react': 19.1.13
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/serialize@1.3.3':
+ dependencies:
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/unitless': 0.10.0
+ '@emotion/utils': 1.4.2
+ csstype: 3.1.3
+
+ '@emotion/sheet@1.4.0': {}
+
+ '@emotion/unitless@0.10.0': {}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@emotion/utils@1.4.2': {}
+
+ '@emotion/weak-memoize@0.4.0': {}
+
+ '@esbuild/aix-ppc64@0.25.10':
optional: true
- /@img/sharp-darwin-x64@0.33.2:
- resolution: {integrity: sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==}
- engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.0.1
- dev: false
+ '@esbuild/android-arm64@0.25.10':
optional: true
- /@img/sharp-libvips-darwin-arm64@1.0.1:
- resolution: {integrity: sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==}
- engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: false
+ '@esbuild/android-arm@0.25.10':
optional: true
- /@img/sharp-libvips-darwin-x64@1.0.1:
- resolution: {integrity: sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==}
- engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: false
+ '@esbuild/android-x64@0.25.10':
optional: true
- /@img/sharp-libvips-linux-arm64@1.0.1:
- resolution: {integrity: sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==}
- engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
+ '@esbuild/darwin-arm64@0.25.10':
optional: true
- /@img/sharp-libvips-linux-arm@1.0.1:
- resolution: {integrity: sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==}
- engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: false
+ '@esbuild/darwin-x64@0.25.10':
optional: true
- /@img/sharp-libvips-linux-s390x@1.0.1:
- resolution: {integrity: sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==}
- engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- dev: false
+ '@esbuild/freebsd-arm64@0.25.10':
optional: true
- /@img/sharp-libvips-linux-x64@1.0.1:
- resolution: {integrity: sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==}
- engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
+ '@esbuild/freebsd-x64@0.25.10':
optional: true
- /@img/sharp-libvips-linuxmusl-arm64@1.0.1:
- resolution: {integrity: sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==}
- engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: false
+ '@esbuild/linux-arm64@0.25.10':
optional: true
- /@img/sharp-libvips-linuxmusl-x64@1.0.1:
- resolution: {integrity: sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==}
- engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: false
+ '@esbuild/linux-arm@0.25.10':
optional: true
- /@img/sharp-linux-arm64@0.33.2:
- resolution: {integrity: sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==}
- engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.0.1
- dev: false
+ '@esbuild/linux-ia32@0.25.10':
optional: true
- /@img/sharp-linux-arm@0.33.2:
- resolution: {integrity: sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==}
- engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.0.1
- dev: false
+ '@esbuild/linux-loong64@0.25.10':
optional: true
- /@img/sharp-linux-s390x@0.33.2:
- resolution: {integrity: sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==}
- engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [s390x]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.0.1
- dev: false
+ '@esbuild/linux-mips64el@0.25.10':
optional: true
- /@img/sharp-linux-x64@0.33.2:
- resolution: {integrity: sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==}
- engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.0.1
- dev: false
+ '@esbuild/linux-ppc64@0.25.10':
optional: true
- /@img/sharp-linuxmusl-arm64@0.33.2:
- resolution: {integrity: sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==}
- engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.0.1
- dev: false
+ '@esbuild/linux-riscv64@0.25.10':
optional: true
- /@img/sharp-linuxmusl-x64@0.33.2:
- resolution: {integrity: sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==}
- engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.0.1
- dev: false
+ '@esbuild/linux-s390x@0.25.10':
optional: true
- /@img/sharp-wasm32@0.33.2:
- resolution: {integrity: sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [wasm32]
- requiresBuild: true
- dependencies:
- '@emnapi/runtime': 0.45.0
- dev: false
+ '@esbuild/linux-x64@0.25.10':
optional: true
- /@img/sharp-win32-ia32@0.33.2:
- resolution: {integrity: sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: false
+ '@esbuild/netbsd-arm64@0.25.10':
optional: true
- /@img/sharp-win32-x64@0.33.2:
- resolution: {integrity: sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==}
- engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: false
+ '@esbuild/netbsd-x64@0.25.10':
optional: true
- /@istanbuljs/load-nyc-config@1.1.0:
- resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
- engines: {node: '>=8'}
- dependencies:
- camelcase: 5.3.1
- find-up: 4.1.0
- get-package-type: 0.1.0
- js-yaml: 3.14.1
- resolve-from: 5.0.0
- dev: true
+ '@esbuild/openbsd-arm64@0.25.10':
+ optional: true
- /@istanbuljs/schema@0.1.3:
- resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
- engines: {node: '>=8'}
- dev: true
+ '@esbuild/openbsd-x64@0.25.10':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.10':
+ optional: true
- /@jest/console@29.7.0:
- resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@esbuild/win32-arm64@0.25.10':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.10':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.10':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)':
dependencies:
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- chalk: 4.1.2
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
- dev: true
+ eslint: 9.35.0
+ eslint-visitor-keys: 3.4.3
- /@jest/core@29.7.0:
- resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.21.0':
dependencies:
- '@jest/console': 29.7.0
- '@jest/reporters': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- ci-info: 3.9.0
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@20.1.7)
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-resolve-dependencies: 29.7.0
- jest-runner: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- jest-validate: 29.7.0
- jest-watcher: 29.7.0
- micromatch: 4.0.5
- pretty-format: 29.7.0
- slash: 3.0.0
- strip-ansi: 6.0.1
+ '@eslint/object-schema': 2.1.6
+ debug: 4.4.3(supports-color@5.5.0)
+ minimatch: 3.1.2
transitivePeerDependencies:
- - babel-plugin-macros
- supports-color
- - ts-node
- dev: true
- /@jest/environment@29.7.0:
- resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@eslint/config-helpers@0.3.1': {}
+
+ '@eslint/core@0.15.2':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.1':
dependencies:
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- jest-mock: 29.7.0
- dev: true
+ ajv: 6.12.6
+ debug: 4.4.3(supports-color@5.5.0)
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.35.0': {}
- /@jest/expect-utils@29.7.0:
- resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@eslint/object-schema@2.1.6': {}
+
+ '@eslint/plugin-kit@0.3.5':
dependencies:
- jest-get-type: 29.6.3
- dev: true
+ '@eslint/core': 0.15.2
+ levn: 0.4.1
- /@jest/expect@29.7.0:
- resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@google-cloud/common@5.0.2':
dependencies:
- expect: 29.7.0
- jest-snapshot: 29.7.0
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 4.1.0
+ arrify: 2.0.1
+ duplexify: 4.1.3
+ extend: 3.0.2
+ google-auth-library: 9.15.1
+ html-entities: 2.6.0
+ retry-request: 7.0.2
+ teeny-request: 9.0.0
transitivePeerDependencies:
+ - encoding
- supports-color
- dev: true
-
- /@jest/fake-timers@29.7.0:
- resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/types': 29.6.3
- '@sinonjs/fake-timers': 10.3.0
- '@types/node': 20.1.7
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-util: 29.7.0
- dev: true
-
- /@jest/globals@29.7.0:
- resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/types': 29.6.3
- jest-mock: 29.7.0
+
+ '@google-cloud/functions-framework@3.2.0':
+ dependencies:
+ '@types/express': 4.17.17
+ body-parser: 1.20.3
+ cloudevents: 6.0.4
+ express: 4.21.2
+ minimist: 1.2.8
+ on-finished: 2.4.1
+ read-pkg-up: 7.0.1
+ semver: 7.7.2
transitivePeerDependencies:
- supports-color
- dev: true
- /@jest/reporters@29.7.0:
- resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
+ '@google-cloud/functions-framework@3.5.1':
dependencies:
- '@bcoe/v8-coverage': 0.2.3
- '@jest/console': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.20
- '@types/node': 20.1.7
- chalk: 4.1.2
- collect-v8-coverage: 1.0.2
- exit: 0.1.2
- glob: 7.2.3
- graceful-fs: 4.2.11
- istanbul-lib-coverage: 3.2.0
- istanbul-lib-instrument: 6.0.1
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 4.0.1
- istanbul-reports: 3.1.6
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- jest-worker: 29.7.0
- slash: 3.0.0
- string-length: 4.0.2
- strip-ansi: 6.0.1
- v8-to-istanbul: 9.1.3
+ '@types/express': 4.17.23
+ body-parser: 1.20.3
+ cloudevents: 8.0.3
+ express: 4.21.2
+ minimist: 1.2.8
+ on-finished: 2.4.1
+ read-pkg-up: 7.0.1
+ semver: 7.7.2
transitivePeerDependencies:
- supports-color
- dev: true
- /@jest/schemas@29.6.3:
- resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@google-cloud/paginator@3.0.7':
dependencies:
- '@sinclair/typebox': 0.27.8
- dev: true
+ arrify: 2.0.1
+ extend: 3.0.2
- /@jest/source-map@29.6.3:
- resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@google-cloud/paginator@5.0.2':
dependencies:
- '@jridgewell/trace-mapping': 0.3.20
- callsites: 3.1.0
- graceful-fs: 4.2.11
- dev: true
+ arrify: 2.0.1
+ extend: 3.0.2
+
+ '@google-cloud/projectify@2.1.1': {}
+
+ '@google-cloud/projectify@4.0.0': {}
+
+ '@google-cloud/promisify@2.0.4': {}
+
+ '@google-cloud/promisify@4.1.0': {}
+
+ '@google-cloud/storage@5.20.5':
+ dependencies:
+ '@google-cloud/paginator': 3.0.7
+ '@google-cloud/projectify': 2.1.1
+ '@google-cloud/promisify': 2.0.4
+ abort-controller: 3.0.0
+ arrify: 2.0.1
+ async-retry: 1.3.3
+ compressible: 2.0.18
+ configstore: 5.0.1
+ duplexify: 4.1.3
+ ent: 2.2.2
+ extend: 3.0.2
+ gaxios: 4.3.3
+ google-auth-library: 7.14.1
+ hash-stream-validation: 0.2.4
+ mime: 3.0.0
+ mime-types: 2.1.35
+ p-limit: 3.1.0
+ pumpify: 2.0.1
+ retry-request: 4.2.2
+ stream-events: 1.0.5
+ teeny-request: 7.2.0
+ uuid: 8.3.2
+ xdg-basedir: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
- /@jest/test-result@29.7.0:
- resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@google-cloud/storage@7.17.1':
dependencies:
- '@jest/console': 29.7.0
- '@jest/types': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.5
- collect-v8-coverage: 1.0.2
- dev: true
+ '@google-cloud/paginator': 5.0.2
+ '@google-cloud/projectify': 4.0.0
+ '@google-cloud/promisify': 2.0.4
+ abort-controller: 3.0.0
+ async-retry: 1.3.3
+ duplexify: 4.1.3
+ fast-xml-parser: 4.5.3
+ gaxios: 6.7.1
+ google-auth-library: 9.15.1
+ html-entities: 2.6.0
+ mime: 3.0.0
+ p-limit: 3.1.0
+ retry-request: 7.0.2
+ teeny-request: 9.0.0
+ uuid: 8.3.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
- /@jest/test-sequencer@29.7.0:
- resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@google-cloud/translate@8.5.1':
dependencies:
- '@jest/test-result': 29.7.0
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- slash: 3.0.0
- dev: true
-
- /@jest/transform@29.7.0:
- resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@babel/core': 7.23.2
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.20
- babel-plugin-istanbul: 6.1.1
- chalk: 4.1.2
- convert-source-map: 2.0.0
- fast-json-stable-stringify: 2.1.0
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- micromatch: 4.0.5
- pirates: 4.0.6
- slash: 3.0.0
- write-file-atomic: 4.0.2
+ '@google-cloud/common': 5.0.2
+ '@google-cloud/promisify': 4.1.0
+ arrify: 2.0.1
+ extend: 3.0.2
+ google-gax: 4.6.1
+ is-html: 2.0.0
transitivePeerDependencies:
+ - encoding
- supports-color
- dev: true
- /@jest/types@29.6.3:
- resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@grpc/grpc-js@1.14.0':
dependencies:
- '@jest/schemas': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.5
- '@types/istanbul-reports': 3.0.3
- '@types/node': 20.1.7
- '@types/yargs': 17.0.29
- chalk: 4.1.2
- dev: true
+ '@grpc/proto-loader': 0.8.0
+ '@js-sdsl/ordered-map': 4.4.2
- /@jridgewell/gen-mapping@0.3.3:
- resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
- engines: {node: '>=6.0.0'}
+ '@grpc/proto-loader@0.7.15':
dependencies:
- '@jridgewell/set-array': 1.1.2
- '@jridgewell/sourcemap-codec': 1.4.15
- '@jridgewell/trace-mapping': 0.3.18
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
- /@jridgewell/resolve-uri@3.1.0:
- resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
- engines: {node: '>=6.0.0'}
+ '@grpc/proto-loader@0.8.0':
+ dependencies:
+ lodash.camelcase: 4.3.0
+ long: 5.3.2
+ protobufjs: 7.5.4
+ yargs: 17.7.2
- /@jridgewell/resolve-uri@3.1.1:
- resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
- engines: {node: '>=6.0.0'}
+ '@gwhitney/detect-indent@7.0.1': {}
- /@jridgewell/set-array@1.1.2:
- resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
- engines: {node: '>=6.0.0'}
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@isaacs/balanced-match@4.0.1': {}
+
+ '@isaacs/brace-expansion@5.0.0':
+ dependencies:
+ '@isaacs/balanced-match': 4.0.1
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.2
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@istanbuljs/schema@0.1.3': {}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@js-sdsl/ordered-map@4.4.2': {}
+
+ '@modelcontextprotocol/sdk@0.7.0':
+ dependencies:
+ content-type: 1.0.5
+ raw-body: 3.0.1
+ zod: 3.25.76
+
+ '@napi-rs/canvas-android-arm64@0.1.80':
+ optional: true
+
+ '@napi-rs/canvas-darwin-arm64@0.1.80':
+ optional: true
+
+ '@napi-rs/canvas-darwin-x64@0.1.80':
+ optional: true
+
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80':
+ optional: true
- /@jridgewell/source-map@0.3.5:
- resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==}
- dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.20
- dev: false
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.80':
+ optional: true
- /@jridgewell/sourcemap-codec@1.4.14:
- resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ '@napi-rs/canvas-linux-arm64-musl@0.1.80':
+ optional: true
- /@jridgewell/sourcemap-codec@1.4.15:
- resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.80':
+ optional: true
- /@jridgewell/trace-mapping@0.3.18:
- resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.0
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@napi-rs/canvas-linux-x64-gnu@0.1.80':
+ optional: true
- /@jridgewell/trace-mapping@0.3.20:
- resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.1
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@napi-rs/canvas-linux-x64-musl@0.1.80':
+ optional: true
- /@jridgewell/trace-mapping@0.3.9:
- resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
- dependencies:
- '@jridgewell/resolve-uri': 3.1.1
- '@jridgewell/sourcemap-codec': 1.4.15
- dev: true
+ '@napi-rs/canvas-win32-x64-msvc@0.1.80':
+ optional: true
- /@nicolo-ribaudo/semver-v6@6.3.3:
- resolution: {integrity: sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==}
- hasBin: true
- dev: false
+ '@napi-rs/canvas@0.1.80':
+ optionalDependencies:
+ '@napi-rs/canvas-android-arm64': 0.1.80
+ '@napi-rs/canvas-darwin-arm64': 0.1.80
+ '@napi-rs/canvas-darwin-x64': 0.1.80
+ '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.80
+ '@napi-rs/canvas-linux-arm64-gnu': 0.1.80
+ '@napi-rs/canvas-linux-arm64-musl': 0.1.80
+ '@napi-rs/canvas-linux-riscv64-gnu': 0.1.80
+ '@napi-rs/canvas-linux-x64-gnu': 0.1.80
+ '@napi-rs/canvas-linux-x64-musl': 0.1.80
+ '@napi-rs/canvas-win32-x64-msvc': 0.1.80
+ optional: true
- /@nodelib/fs.scandir@2.1.5:
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
+ '@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0
- /@nodelib/fs.stat@2.0.5:
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
+ '@nodelib/fs.stat@2.0.5': {}
- /@nodelib/fs.walk@1.2.8:
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
+ '@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.15.0
+ fastq: 1.19.1
- /@pnpm/constants@7.1.1:
- resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==}
- engines: {node: '>=16.14'}
- dev: true
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
- /@pnpm/crypto.base32-hash@2.0.0:
- resolution: {integrity: sha512-3ttOeHBpmWRbgJrpDQ8Nwd3W8s8iuiP5YZM0JRyKWaMtX8lu9d7/AKyxPmhYsMJuN+q/1dwHa7QFeDZJ53b0oA==}
- engines: {node: '>=16.14'}
+ '@pnpm/constants@7.1.1': {}
+
+ '@pnpm/crypto.base32-hash@2.0.0':
dependencies:
- rfc4648: 1.5.2
- dev: true
+ rfc4648: 1.5.4
- /@pnpm/dependency-path@2.1.4:
- resolution: {integrity: sha512-QdT1Q3A2tx2TnGJZjso6W/LkJE+hnvcj3O6eN9NT46ckVmYEI2/6cYmRJY8PGrem/X222b7BeE4I8bnLDWZaWQ==}
- engines: {node: '>=16.14'}
+ '@pnpm/dependency-path@2.1.8':
dependencies:
'@pnpm/crypto.base32-hash': 2.0.0
- '@pnpm/types': 9.3.0
+ '@pnpm/types': 9.4.2
encode-registry: 3.0.1
- semver: 7.5.4
- dev: true
+ semver: 7.7.2
- /@pnpm/error@5.0.2:
- resolution: {integrity: sha512-0TEm+tWNYm+9uh6DSKyRbv8pv/6b4NL0PastLvMxIoqZbBZ5Zj1cYi332R9xsSUi31ZOsu2wpgn/bC7DA9hrjg==}
- engines: {node: '>=16.14'}
+ '@pnpm/error@5.0.3':
dependencies:
'@pnpm/constants': 7.1.1
- dev: true
- /@pnpm/exec@2.0.0:
- resolution: {integrity: sha512-b5ALfWEOFQprWKntN7MF8XWCyslBk2c8u20GEDcDDQOs6c0HyHlWxX5lig8riQKdS000U6YyS4L4b32NOleXAQ==}
- engines: {node: '>=10'}
+ '@pnpm/exec@2.0.0':
dependencies:
'@pnpm/self-installer': 2.2.1
command-exists: 1.2.9
- cross-spawn: 7.0.3
- dev: true
+ cross-spawn: 7.0.6
- /@pnpm/exportable-manifest@5.0.8:
- resolution: {integrity: sha512-UcG8r7p03eh6vUrsjHCr1FXuM+3mwDdPZaYoWpTipQ4qZUF4JmlMUYdwNKhXWCiKe2IUvDIC0NOpIhpxBKKPeg==}
- engines: {node: '>=16.14'}
+ '@pnpm/exportable-manifest@5.0.12':
dependencies:
- '@pnpm/error': 5.0.2
- '@pnpm/read-project-manifest': 5.0.7
- '@pnpm/types': 9.3.0
+ '@pnpm/error': 5.0.3
+ '@pnpm/read-project-manifest': 5.0.11
+ '@pnpm/types': 9.4.2
p-map-values: 1.0.0
- ramda: /@pnpm/ramda@0.28.1
- dev: true
+ ramda: '@pnpm/ramda@0.28.1'
- /@pnpm/find-workspace-dir@6.0.2:
- resolution: {integrity: sha512-JSrpQUFCs4vY1D5tOmj7qBb+oE2j/lO6341giEdUpvYf3FijY8CY13l8rPjfHV2y3m//utzl0An+q+qx14S6Nw==}
- engines: {node: '>=16.14'}
+ '@pnpm/find-workspace-dir@6.0.3':
dependencies:
- '@pnpm/error': 5.0.2
+ '@pnpm/error': 5.0.3
find-up: 5.0.0
- dev: true
- /@pnpm/git-utils@1.0.0:
- resolution: {integrity: sha512-lUI+XrzOJN4zdPGOGnFUrmtXAXpXi8wD8OI0nWOZmlh+raqbLzC3VkXu1zgaduOK6YonOcnQW88O+ojav1rAdA==}
- engines: {node: '>=16.14'}
+ '@pnpm/git-utils@1.0.0':
dependencies:
- execa: /safe-execa@0.1.2
- dev: true
+ execa: safe-execa@0.1.2
- /@pnpm/graceful-fs@3.2.0:
- resolution: {integrity: sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA==}
- engines: {node: '>=16.14'}
+ '@pnpm/graceful-fs@3.2.0':
dependencies:
graceful-fs: 4.2.11
- dev: true
- /@pnpm/lockfile-file@8.1.3(@pnpm/logger@5.0.0):
- resolution: {integrity: sha512-t1qzYJcm/JAfKW1MdLhswM0+fSvy9/pRSXNQhxADCGor29zvBxieb/8xhDweIW5acH0T0TbS3Hgo0Iu/Ui2JuQ==}
- engines: {node: '>=16.14'}
- peerDependencies:
- '@pnpm/logger': ^5.0.0
+ '@pnpm/lockfile-file@8.1.8(@pnpm/logger@5.2.0)':
dependencies:
'@pnpm/constants': 7.1.1
- '@pnpm/dependency-path': 2.1.4
- '@pnpm/error': 5.0.2
+ '@pnpm/dependency-path': 2.1.8
+ '@pnpm/error': 5.0.3
'@pnpm/git-utils': 1.0.0
- '@pnpm/lockfile-types': 5.1.2
- '@pnpm/logger': 5.0.0
- '@pnpm/merge-lockfile-changes': 5.0.4
- '@pnpm/types': 9.3.0
+ '@pnpm/lockfile-types': 5.1.5
+ '@pnpm/logger': 5.2.0
+ '@pnpm/merge-lockfile-changes': 5.0.7
+ '@pnpm/types': 9.4.2
'@pnpm/util.lex-comparator': 1.0.0
'@zkochan/rimraf': 2.1.3
comver-to-semver: 1.0.0
- js-yaml: /@zkochan/js-yaml@0.0.6
+ js-yaml: '@zkochan/js-yaml@0.0.6'
normalize-path: 3.0.0
- ramda: /@pnpm/ramda@0.28.1
- semver: 7.5.4
+ ramda: '@pnpm/ramda@0.28.1'
+ semver: 7.7.2
sort-keys: 4.2.0
strip-bom: 4.0.0
write-file-atomic: 5.0.1
- dev: true
- /@pnpm/lockfile-types@5.1.2:
- resolution: {integrity: sha512-yPghe5atvPxn9xrltX+BOLnJF4mFzYN2SsCUq8otn7F7NekNrxwkedTKRIMcaOg0cAzxka7+fPWaB3svRtPk5g==}
- engines: {node: '>=16.14'}
+ '@pnpm/lockfile-types@5.1.5':
dependencies:
- '@pnpm/types': 9.3.0
- dev: true
+ '@pnpm/types': 9.4.2
- /@pnpm/logger@5.0.0:
- resolution: {integrity: sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw==}
- engines: {node: '>=12.17'}
+ '@pnpm/logger@5.2.0':
dependencies:
- bole: 5.0.9
+ bole: 5.0.21
ndjson: 2.0.0
- dev: true
- /@pnpm/make-dedicated-lockfile@0.5.10:
- resolution: {integrity: sha512-O4Np846ufuK+NaI5YToH23oBEAvfiSw6WY0Pd5H9qovtc1nGBSFjezjtjYu8+UMZpYw2BRMnHJWPNJG3zfGI8A==}
- engines: {node: '>=16.14'}
- hasBin: true
+ '@pnpm/make-dedicated-lockfile@0.5.15':
dependencies:
- '@pnpm/error': 5.0.2
+ '@pnpm/error': 5.0.3
'@pnpm/exec': 2.0.0
- '@pnpm/exportable-manifest': 5.0.8
- '@pnpm/find-workspace-dir': 6.0.2
- '@pnpm/lockfile-file': 8.1.3(@pnpm/logger@5.0.0)
- '@pnpm/logger': 5.0.0
- '@pnpm/prune-lockfile': 5.0.6
- '@pnpm/read-project-manifest': 5.0.7
- '@pnpm/types': 9.3.0
- ramda: /@pnpm/ramda@0.28.1
- rename-overwrite: 4.0.3
- dev: true
-
- /@pnpm/merge-lockfile-changes@5.0.4:
- resolution: {integrity: sha512-hM95tVX8sGF6zmVB1xVmSYINqnqrRvy1UZSTFWgGgf20wyfLsoHsSYsl4l0/vhkK00D0jMH4ZjlbzF/DEC72aQ==}
- engines: {node: '>=16.14'}
- dependencies:
- '@pnpm/lockfile-types': 5.1.2
+ '@pnpm/exportable-manifest': 5.0.12
+ '@pnpm/find-workspace-dir': 6.0.3
+ '@pnpm/lockfile-file': 8.1.8(@pnpm/logger@5.2.0)
+ '@pnpm/logger': 5.2.0
+ '@pnpm/prune-lockfile': 5.0.10
+ '@pnpm/read-project-manifest': 5.0.11
+ '@pnpm/types': 9.4.2
+ ramda: '@pnpm/ramda@0.28.1'
+ rename-overwrite: 5.0.4
+
+ '@pnpm/merge-lockfile-changes@5.0.7':
+ dependencies:
+ '@pnpm/lockfile-types': 5.1.5
comver-to-semver: 1.0.0
- ramda: /@pnpm/ramda@0.28.1
- semver: 7.5.4
- dev: true
+ ramda: '@pnpm/ramda@0.28.1'
+ semver: 7.7.2
- /@pnpm/prune-lockfile@5.0.6:
- resolution: {integrity: sha512-8sTXK0P+Zch6QVM6s17DdjiC+dQTJFn8Icc/CU4qOdDuITXVkrteRMrZ+SwKz4m/l19oYYL4dGniHPQDek93+w==}
- engines: {node: '>=16.14'}
+ '@pnpm/prune-lockfile@5.0.10':
dependencies:
'@pnpm/constants': 7.1.1
- '@pnpm/dependency-path': 2.1.4
- '@pnpm/lockfile-types': 5.1.2
- '@pnpm/types': 9.3.0
- ramda: /@pnpm/ramda@0.28.1
- dev: true
+ '@pnpm/dependency-path': 2.1.8
+ '@pnpm/lockfile-types': 5.1.5
+ '@pnpm/types': 9.4.2
+ ramda: '@pnpm/ramda@0.28.1'
- /@pnpm/ramda@0.28.1:
- resolution: {integrity: sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw==}
- dev: true
+ '@pnpm/ramda@0.28.1': {}
- /@pnpm/read-project-manifest@5.0.7:
- resolution: {integrity: sha512-zq9XlZCbWmpjeNaU6faV51ehD4Rk6nTMv+jWkOGPSAwIG8uBh1NBxOYKx4R9Ixu7x8zNUUdfxOo89c6Ds5cY1w==}
- engines: {node: '>=16.14'}
+ '@pnpm/read-project-manifest@5.0.11':
dependencies:
'@gwhitney/detect-indent': 7.0.1
- '@pnpm/error': 5.0.2
+ '@pnpm/error': 5.0.3
'@pnpm/graceful-fs': 3.2.0
'@pnpm/text.comments-parser': 2.0.0
- '@pnpm/types': 9.3.0
- '@pnpm/write-project-manifest': 5.0.3
+ '@pnpm/types': 9.4.2
+ '@pnpm/write-project-manifest': 5.0.6
fast-deep-equal: 3.1.3
is-windows: 1.0.2
json5: 2.2.3
@@ -2794,1393 +6131,808 @@ packages:
read-yaml-file: 2.1.0
sort-keys: 4.2.0
strip-bom: 4.0.0
- dev: true
- /@pnpm/self-installer@2.2.1:
- resolution: {integrity: sha512-aefLe96wAWghkx6q1PwbVS1Iz1iGE+HKwkTmtzWLFXeGhbknaIdG2voMwaBGIYGCSxm8sDKR1uLO4aRRAYuc+Q==}
- engines: {node: '>=4'}
- hasBin: true
- dev: true
+ '@pnpm/self-installer@2.2.1': {}
- /@pnpm/text.comments-parser@2.0.0:
- resolution: {integrity: sha512-DRWtTmmxQQtuWHf1xPt9bqzCSq8d0MQF5x1kdpCDMLd7xk3nP4To2/OGkPrb8MKbrWsgCNDwXyKCFlEKrAg7fg==}
- engines: {node: '>=16.14'}
+ '@pnpm/text.comments-parser@2.0.0':
dependencies:
strip-comments-strings: 1.2.0
- dev: true
- /@pnpm/types@9.3.0:
- resolution: {integrity: sha512-BUm6KWNyiQ575D+zi4OkGWImHv0gM6LQYUY/qK/7j9uxmZ66topXQlZSoFX8rR/FcpIRUTrT325iqFqMHoJnww==}
- engines: {node: '>=16.14'}
- dev: true
+ '@pnpm/types@9.4.2': {}
- /@pnpm/util.lex-comparator@1.0.0:
- resolution: {integrity: sha512-3aBQPHntVgk5AweBWZn+1I/fqZ9krK/w01197aYVkAJQGftb+BVWgEepxY5GChjSW12j52XX+CmfynYZ/p0DFQ==}
- engines: {node: '>=12.22.0'}
- dev: true
+ '@pnpm/util.lex-comparator@1.0.0': {}
- /@pnpm/write-project-manifest@5.0.3:
- resolution: {integrity: sha512-B2tH3v0ecp8H3Wg52R3/0hHvsvAdYfmoXn/gMAEjmXhIR8yIAOe9R/YWSMUBDXs8WUH119wB6H3BEJyX8bpznQ==}
- engines: {node: '>=16.14'}
+ '@pnpm/write-project-manifest@5.0.6':
dependencies:
'@pnpm/text.comments-parser': 2.0.0
- '@pnpm/types': 9.3.0
+ '@pnpm/types': 9.4.2
json5: 2.2.3
write-file-atomic: 5.0.1
write-yaml-file: 5.0.0
- dev: true
- /@protobufjs/aspromise@1.1.2:
- resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
- dev: false
+ '@protobufjs/aspromise@1.1.2': {}
- /@protobufjs/base64@1.1.2:
- resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
- dev: false
+ '@protobufjs/base64@1.1.2': {}
- /@protobufjs/codegen@2.0.4:
- resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
- dev: false
+ '@protobufjs/codegen@2.0.4': {}
- /@protobufjs/eventemitter@1.1.0:
- resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
- dev: false
+ '@protobufjs/eventemitter@1.1.0': {}
- /@protobufjs/fetch@1.1.0:
- resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+ '@protobufjs/fetch@1.1.0':
dependencies:
'@protobufjs/aspromise': 1.1.2
'@protobufjs/inquire': 1.1.0
- dev: false
- /@protobufjs/float@1.0.2:
- resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
- dev: false
+ '@protobufjs/float@1.0.2': {}
- /@protobufjs/inquire@1.1.0:
- resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
- dev: false
+ '@protobufjs/inquire@1.1.0': {}
- /@protobufjs/path@1.1.2:
- resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
- dev: false
+ '@protobufjs/path@1.1.2': {}
- /@protobufjs/pool@1.1.0:
- resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
- dev: false
+ '@protobufjs/pool@1.1.0': {}
- /@protobufjs/utf8@1.1.0:
- resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
- dev: false
+ '@protobufjs/utf8@1.1.0': {}
- /@puppeteer/browsers@1.4.6(typescript@5.2.2):
- resolution: {integrity: sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==}
- engines: {node: '>=16.3.0'}
- hasBin: true
- peerDependencies:
- typescript: '>= 4.7.4'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@puppeteer/browsers@2.10.10':
dependencies:
- debug: 4.3.4
+ debug: 4.4.3(supports-color@5.5.0)
extract-zip: 2.0.1
progress: 2.0.3
- proxy-agent: 6.3.0
- tar-fs: 3.0.4
- typescript: 5.2.2
- unbzip2-stream: 1.4.3
- yargs: 17.7.1
+ proxy-agent: 6.5.0
+ semver: 7.7.2
+ tar-fs: 3.1.1
+ yargs: 17.7.2
transitivePeerDependencies:
+ - bare-buffer
+ - react-native-b4a
- supports-color
- dev: false
- /@rollup/plugin-babel@5.3.1(@babel/core@7.23.2)(rollup@2.79.1):
- resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
- engines: {node: '>= 10.0.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- '@types/babel__core': ^7.1.9
- rollup: ^1.20.0||^2.0.0
- peerDependenciesMeta:
- '@types/babel__core':
- optional: true
+ '@rolldown/pluginutils@1.0.0-beta.27': {}
+
+ '@rollup/plugin-babel@5.3.1(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@2.79.2)':
dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-module-imports': 7.22.15
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- rollup: 2.79.1
- dev: false
+ '@babel/core': 7.28.4
+ '@babel/helper-module-imports': 7.27.1
+ '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
+ rollup: 2.79.2
+ optionalDependencies:
+ '@types/babel__core': 7.20.5
+ transitivePeerDependencies:
+ - supports-color
- /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1):
- resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==}
- engines: {node: '>= 10.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
+ '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)':
dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
+ '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
'@types/resolve': 1.17.1
builtin-modules: 3.3.0
deepmerge: 4.3.1
is-module: 1.0.0
- resolve: 1.22.8
- rollup: 2.79.1
- dev: false
+ resolve: 1.22.10
+ rollup: 2.79.2
- /@rollup/plugin-replace@2.4.2(rollup@2.79.1):
- resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==}
- peerDependencies:
- rollup: ^1.20.0 || ^2.0.0
+ '@rollup/plugin-replace@2.4.2(rollup@2.79.2)':
dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
+ '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
magic-string: 0.25.9
- rollup: 2.79.1
- dev: false
-
- /@rollup/plugin-replace@5.0.2(rollup@3.26.2):
- resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
- peerDependenciesMeta:
- rollup:
- optional: true
- dependencies:
- '@rollup/pluginutils': 5.0.2(rollup@3.26.2)
- magic-string: 0.27.0
- rollup: 3.26.2
- dev: false
+ rollup: 2.79.2
- /@rollup/pluginutils@3.1.0(rollup@2.79.1):
- resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
- engines: {node: '>= 8.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
+ '@rollup/pluginutils@3.1.0(rollup@2.79.2)':
dependencies:
'@types/estree': 0.0.39
estree-walker: 1.0.1
picomatch: 2.3.1
- rollup: 2.79.1
- dev: false
-
- /@rollup/pluginutils@5.0.2(rollup@2.79.1):
- resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
- peerDependenciesMeta:
- rollup:
- optional: true
- dependencies:
- '@types/estree': 1.0.1
- estree-walker: 2.0.2
- picomatch: 2.3.1
- rollup: 2.79.1
- dev: false
+ rollup: 2.79.2
- /@rollup/pluginutils@5.0.2(rollup@3.26.2):
- resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0
- peerDependenciesMeta:
- rollup:
- optional: true
+ '@rollup/pluginutils@5.3.0(rollup@2.79.2)':
dependencies:
- '@types/estree': 1.0.1
+ '@types/estree': 1.0.8
estree-walker: 2.0.2
- picomatch: 2.3.1
- rollup: 3.26.2
- dev: false
-
- /@sinclair/typebox@0.27.8:
- resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
- dev: true
-
- /@sinonjs/commons@3.0.0:
- resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==}
- dependencies:
- type-detect: 4.0.8
- dev: true
-
- /@sinonjs/fake-timers@10.3.0:
- resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
- dependencies:
- '@sinonjs/commons': 3.0.0
- dev: true
-
- /@slack/logger@3.0.0:
- resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==}
- engines: {node: '>= 12.13.0', npm: '>= 6.12.0'}
- dependencies:
- '@types/node': 20.8.7
- dev: false
-
- /@slack/types@2.9.0:
- resolution: {integrity: sha512-YfZGo0xVOmI7CHhiwCmEC33HzjQl1lakNmyo5GPGb4KHKEaUoY7zenAdKsYCJqYwdaM9OL+hqYt/tZ2zgvVc7g==}
- engines: {node: '>= 12.13.0', npm: '>= 6.12.0'}
- dev: false
-
- /@slack/web-api@6.9.0:
- resolution: {integrity: sha512-RME5/F+jvQmZHkoP+ogrDbixq1Ms1mBmylzuWq4sf3f7GCpMPWoiZ+WqWk+sism3vrlveKWIgO9R4Qg9fiRyoQ==}
- engines: {node: '>= 12.13.0', npm: '>= 6.12.0'}
- dependencies:
- '@slack/logger': 3.0.0
- '@slack/types': 2.9.0
- '@types/is-stream': 1.1.0
- '@types/node': 20.8.7
- axios: 0.27.2
- eventemitter3: 3.1.2
- form-data: 2.5.1
- is-electron: 2.2.2
- is-stream: 1.1.0
- p-queue: 6.6.2
- p-retry: 4.6.2
- transitivePeerDependencies:
- - debug
- dev: false
-
- /@surma/rollup-plugin-off-main-thread@2.2.3:
- resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
- dependencies:
- ejs: 3.1.9
- json5: 2.2.3
- magic-string: 0.25.9
- string.prototype.matchall: 4.0.10
- dev: false
+ picomatch: 4.0.3
+ optionalDependencies:
+ rollup: 2.79.2
- /@svgr/babel-plugin-add-jsx-attribute@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-android-arm-eabi@4.51.0':
+ optional: true
- /@svgr/babel-plugin-remove-jsx-attribute@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-android-arm64@4.51.0':
+ optional: true
- /@svgr/babel-plugin-remove-jsx-empty-expression@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-darwin-arm64@4.51.0':
+ optional: true
- /@svgr/babel-plugin-replace-jsx-attribute-value@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-darwin-x64@4.51.0':
+ optional: true
- /@svgr/babel-plugin-svg-dynamic-title@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-freebsd-arm64@4.51.0':
+ optional: true
- /@svgr/babel-plugin-svg-em-dimensions@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-freebsd-x64@4.51.0':
+ optional: true
- /@svgr/babel-plugin-transform-react-native-svg@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-linux-arm-gnueabihf@4.51.0':
+ optional: true
- /@svgr/babel-plugin-transform-svg-component@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==}
- engines: {node: '>=12'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- dev: false
+ '@rollup/rollup-linux-arm-musleabihf@4.51.0':
+ optional: true
- /@svgr/babel-preset@7.0.0(@babel/core@7.22.8):
- resolution: {integrity: sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==}
- engines: {node: '>=14'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.22.8
- '@svgr/babel-plugin-add-jsx-attribute': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-remove-jsx-attribute': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-remove-jsx-empty-expression': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-replace-jsx-attribute-value': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-svg-dynamic-title': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-svg-em-dimensions': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-transform-react-native-svg': 7.0.0(@babel/core@7.22.8)
- '@svgr/babel-plugin-transform-svg-component': 7.0.0(@babel/core@7.22.8)
- dev: false
-
- /@svgr/core@7.0.0:
- resolution: {integrity: sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==}
- engines: {node: '>=14'}
- dependencies:
- '@babel/core': 7.22.8
- '@svgr/babel-preset': 7.0.0(@babel/core@7.22.8)
- camelcase: 6.3.0
- cosmiconfig: 8.2.0
- transitivePeerDependencies:
- - supports-color
- dev: false
+ '@rollup/rollup-linux-arm64-gnu@4.51.0':
+ optional: true
- /@svgr/hast-util-to-babel-ast@7.0.0:
- resolution: {integrity: sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==}
- engines: {node: '>=14'}
- dependencies:
- '@babel/types': 7.22.5
- entities: 4.5.0
- dev: false
+ '@rollup/rollup-linux-arm64-musl@4.51.0':
+ optional: true
- /@svgr/plugin-jsx@7.0.0:
- resolution: {integrity: sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==}
- engines: {node: '>=14'}
- dependencies:
- '@babel/core': 7.22.8
- '@svgr/babel-preset': 7.0.0(@babel/core@7.22.8)
- '@svgr/hast-util-to-babel-ast': 7.0.0
- svg-parser: 2.0.4
- transitivePeerDependencies:
- - supports-color
- dev: false
+ '@rollup/rollup-linux-loong64-gnu@4.51.0':
+ optional: true
- /@swc/core-darwin-arm64@1.3.32:
- resolution: {integrity: sha512-o19bhlxuUgjUElm6i+QhXgZ0vD6BebiB/gQpK3en5aAwhOvinwr4sah3GqFXsQzz/prKVDuMkj9SW6F/Ug5hgg==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-linux-ppc64-gnu@4.51.0':
optional: true
- /@swc/core-darwin-x64@1.3.32:
- resolution: {integrity: sha512-hVEGd+v5Afh+YekGADOGKwhuS4/AXk91nLuk7pmhWkk8ceQ1cfmah90kXjIXUlCe2G172MLRfHNWlZxr29E/Og==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-linux-riscv64-gnu@4.51.0':
optional: true
- /@swc/core-linux-arm-gnueabihf@1.3.32:
- resolution: {integrity: sha512-5X01WqI9EbJ69oHAOGlI08YqvEIXMfT/mCJ1UWDQBb21xWRE2W1yFAAeuqOLtiagLrXjPv/UKQ0S2gyWQR5AXQ==}
- engines: {node: '>=10'}
- cpu: [arm]
- os: [linux]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-linux-riscv64-musl@4.51.0':
optional: true
- /@swc/core-linux-arm64-gnu@1.3.32:
- resolution: {integrity: sha512-PTJ6oPiutkNBg+m22bUUPa4tNuMmsgpSnsnv2wnWVOgK0lhvQT6bAPTUXDq/8peVAgR/SlpP2Ht8TRRqYMRjRQ==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-linux-s390x-gnu@4.51.0':
optional: true
- /@swc/core-linux-arm64-musl@1.3.32:
- resolution: {integrity: sha512-lG0VOuYNPWOCJ99Aza69cTljjeft/wuRQeYFF8d+1xCQS/OT7gnbgi7BOz39uSHIPTBqfzdIsuvzdKlp9QydrQ==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-linux-x64-gnu@4.51.0':
optional: true
- /@swc/core-linux-x64-gnu@1.3.32:
- resolution: {integrity: sha512-ecqtSWX4NBrs7Ji2VX3fDWeqUfrbLlYqBuufAziCM27xMxwlAVgmyGQk4FYgoQ3SAUAu3XFH87+3Q7uWm2X7xg==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-linux-x64-musl@4.51.0':
optional: true
- /@swc/core-linux-x64-musl@1.3.32:
- resolution: {integrity: sha512-rl3dMcUuENVkpk5NGW/LXovjK0+JFm4GWPjy4NM3Q5cPvhBpGwSeLZlR+zAw9K0fdGoIXiayRTTfENrQwwsH+g==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-openharmony-arm64@4.51.0':
optional: true
- /@swc/core-win32-arm64-msvc@1.3.32:
- resolution: {integrity: sha512-VlybAZp8DcS66CH1LDnfp9zdwbPlnGXREtHDMHaBfK9+80AWVTg+zn0tCYz+HfcrRONqxbudwOUIPj+dwl/8jw==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-win32-arm64-msvc@4.51.0':
optional: true
- /@swc/core-win32-ia32-msvc@1.3.32:
- resolution: {integrity: sha512-MEUMdpUFIQ+RD+K/iHhHKfu0TFNj9VXwIxT5hmPeqyboKo095CoFEFBJ0sHG04IGlnu8T9i+uE2Pi18qUEbFug==}
- engines: {node: '>=10'}
- cpu: [ia32]
- os: [win32]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-win32-ia32-msvc@4.51.0':
optional: true
- /@swc/core-win32-x64-msvc@1.3.32:
- resolution: {integrity: sha512-DPMoneNFQco7SqmVVOUv1Vn53YmoImEfrAPMY9KrqQzgfzqNTuL2JvfxUqfAxwQ6pEKYAdyKJvZ483rIhgG9XQ==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
+ '@rollup/rollup-win32-x64-msvc@4.51.0':
optional: true
- /@swc/core@1.3.32:
- resolution: {integrity: sha512-Yx/n1j+uUkcqlJAW8IRg8Qymgkdow6NHJZPFShiR0YiaYq2sXY+JHmvh16O6GkL91Y+gTlDUS7uVgDz50czJUQ==}
- engines: {node: '>=10'}
- requiresBuild: true
- optionalDependencies:
- '@swc/core-darwin-arm64': 1.3.32
- '@swc/core-darwin-x64': 1.3.32
- '@swc/core-linux-arm-gnueabihf': 1.3.32
- '@swc/core-linux-arm64-gnu': 1.3.32
- '@swc/core-linux-arm64-musl': 1.3.32
- '@swc/core-linux-x64-gnu': 1.3.32
- '@swc/core-linux-x64-musl': 1.3.32
- '@swc/core-win32-arm64-msvc': 1.3.32
- '@swc/core-win32-ia32-msvc': 1.3.32
- '@swc/core-win32-x64-msvc': 1.3.32
- dev: true
-
- /@tootallnate/once@2.0.0:
- resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
- engines: {node: '>= 10'}
- dev: false
+ '@surma/rollup-plugin-off-main-thread@2.2.3':
+ dependencies:
+ ejs: 3.1.10
+ json5: 2.2.3
+ magic-string: 0.25.9
+ string.prototype.matchall: 4.0.12
- /@tootallnate/quickjs-emscripten@0.23.0:
- resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
- dev: false
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
- /@tsconfig/node10@1.0.9:
- resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
- dev: true
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
- /@tsconfig/node12@1.0.11:
- resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
- dev: true
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
- /@tsconfig/node14@1.0.3:
- resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
- dev: true
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
- /@tsconfig/node16@1.0.4:
- resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
- dev: true
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
- /@tsconfig/node18@2.0.1:
- resolution: {integrity: sha512-UqdfvuJK0SArA2CxhKWwwAWfnVSXiYe63bVpMutc27vpngCntGUZQETO24pEJ46zU6XM+7SpqYoMgcO3bM11Ew==}
- dev: true
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.4)':
+ dependencies:
+ '@babel/core': 7.28.4
- /@types/babel__core@7.20.3:
- resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==}
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.4)':
dependencies:
- '@babel/parser': 7.23.0
- '@babel/types': 7.23.0
- '@types/babel__generator': 7.6.6
- '@types/babel__template': 7.4.3
- '@types/babel__traverse': 7.20.3
- dev: true
+ '@babel/core': 7.28.4
- /@types/babel__generator@7.6.6:
- resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==}
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.4)':
dependencies:
- '@babel/types': 7.23.0
- dev: true
+ '@babel/core': 7.28.4
- /@types/babel__template@7.4.3:
- resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==}
+ '@svgr/babel-preset@8.1.0(@babel/core@7.28.4)':
dependencies:
- '@babel/parser': 7.23.0
- '@babel/types': 7.23.0
- dev: true
+ '@babel/core': 7.28.4
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.4)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.4)
- /@types/babel__traverse@7.20.3:
- resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==}
+ '@svgr/core@8.1.0(typescript@5.9.2)':
dependencies:
- '@babel/types': 7.23.0
- dev: true
+ '@babel/core': 7.28.4
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@5.9.2)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
- /@types/body-parser@1.19.4:
- resolution: {integrity: sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==}
+ '@svgr/hast-util-to-babel-ast@8.0.0':
dependencies:
- '@types/connect': 3.4.37
- '@types/node': 20.1.7
+ '@babel/types': 7.28.4
+ entities: 4.5.0
- /@types/chai-subset@1.3.3:
- resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==}
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.2))':
dependencies:
- '@types/chai': 4.3.5
- dev: true
+ '@babel/core': 7.28.4
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.28.4)
+ '@svgr/core': 8.1.0(typescript@5.9.2)
+ '@svgr/hast-util-to-babel-ast': 8.0.0
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
- /@types/chai@4.3.5:
- resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==}
- dev: true
+ '@testing-library/dom@10.4.1':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/runtime': 7.28.4
+ '@types/aria-query': 5.0.4
+ aria-query: 5.3.0
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ picocolors: 1.1.1
+ pretty-format: 27.5.1
- /@types/compression@1.7.2:
- resolution: {integrity: sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==}
+ '@testing-library/jest-dom@6.8.0':
dependencies:
- '@types/express': 4.17.20
- dev: true
+ '@adobe/css-tools': 4.4.4
+ aria-query: 5.3.2
+ css.escape: 1.5.1
+ dom-accessibility-api: 0.6.3
+ picocolors: 1.1.1
+ redent: 3.0.0
- /@types/connect@3.4.37:
- resolution: {integrity: sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==}
+ '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@types/node': 20.8.7
+ '@babel/runtime': 7.28.4
+ '@testing-library/dom': 10.4.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 19.1.13
+ '@types/react-dom': 19.1.9(@types/react@19.1.13)
- /@types/cors@2.8.15:
- resolution: {integrity: sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==}
+ '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)':
dependencies:
- '@types/node': 20.8.7
- dev: true
+ '@testing-library/dom': 10.4.1
- /@types/estree@0.0.39:
- resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
- dev: false
+ '@tootallnate/once@2.0.0': {}
- /@types/estree@1.0.1:
- resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
- dev: false
+ '@tootallnate/quickjs-emscripten@0.23.0': {}
- /@types/express-serve-static-core@4.17.38:
- resolution: {integrity: sha512-hXOtc0tuDHZPFwwhuBJXPbjemWtXnJjbvuuyNH2Y5Z6in+iXc63c4eXYDc7GGGqHy+iwYqAJMdaItqdnbcBKmg==}
- dependencies:
- '@types/node': 20.1.7
- '@types/qs': 6.9.9
- '@types/range-parser': 1.2.6
- '@types/send': 0.17.3
+ '@types/aria-query@5.0.4': {}
- /@types/express@4.17.17:
- resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==}
+ '@types/babel__core@7.20.5':
dependencies:
- '@types/body-parser': 1.19.4
- '@types/express-serve-static-core': 4.17.38
- '@types/qs': 6.9.9
- '@types/serve-static': 1.15.4
- dev: false
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
- /@types/express@4.17.20:
- resolution: {integrity: sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==}
+ '@types/babel__generator@7.27.0':
dependencies:
- '@types/body-parser': 1.19.4
- '@types/express-serve-static-core': 4.17.38
- '@types/qs': 6.9.9
- '@types/serve-static': 1.15.4
+ '@babel/types': 7.28.4
- /@types/graceful-fs@4.1.8:
- resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==}
+ '@types/babel__template@7.4.4':
dependencies:
- '@types/node': 20.1.7
- dev: true
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
- /@types/http-errors@2.0.3:
- resolution: {integrity: sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==}
+ '@types/babel__traverse@7.28.0':
+ dependencies:
+ '@babel/types': 7.28.4
- /@types/is-stream@1.1.0:
- resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==}
+ '@types/body-parser@1.19.6':
dependencies:
- '@types/node': 20.8.7
- dev: false
+ '@types/connect': 3.4.38
+ '@types/node': 24.5.2
- /@types/istanbul-lib-coverage@2.0.4:
- resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
- dev: true
+ '@types/caseless@0.12.5': {}
- /@types/istanbul-lib-coverage@2.0.5:
- resolution: {integrity: sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==}
- dev: true
+ '@types/chai@5.2.2':
+ dependencies:
+ '@types/deep-eql': 4.0.2
- /@types/istanbul-lib-report@3.0.2:
- resolution: {integrity: sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==}
+ '@types/compression@1.8.1':
dependencies:
- '@types/istanbul-lib-coverage': 2.0.5
- dev: true
+ '@types/express': 5.0.3
+ '@types/node': 24.5.2
- /@types/istanbul-reports@3.0.3:
- resolution: {integrity: sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==}
+ '@types/connect@3.4.38':
dependencies:
- '@types/istanbul-lib-report': 3.0.2
- dev: true
+ '@types/node': 24.5.2
- /@types/jest@29.5.6:
- resolution: {integrity: sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==}
+ '@types/cors@2.8.19':
dependencies:
- expect: 29.7.0
- pretty-format: 29.7.0
- dev: true
+ '@types/node': 24.5.2
- /@types/json-schema@7.0.14:
- resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==}
- dev: false
+ '@types/deep-eql@4.0.2': {}
- /@types/long@4.0.2:
- resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
- dev: false
+ '@types/estree@0.0.39': {}
- /@types/mime@1.3.4:
- resolution: {integrity: sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==}
+ '@types/estree@1.0.8': {}
- /@types/mime@3.0.3:
- resolution: {integrity: sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==}
+ '@types/express-serve-static-core@4.19.6':
+ dependencies:
+ '@types/node': 24.5.2
+ '@types/qs': 6.14.0
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.5
- /@types/node-fetch@2.6.7:
- resolution: {integrity: sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==}
+ '@types/express-serve-static-core@5.0.7':
dependencies:
- '@types/node': 20.1.7
- form-data: 4.0.0
- dev: true
+ '@types/node': 24.5.2
+ '@types/qs': 6.14.0
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.5
- /@types/node@18.16.1:
- resolution: {integrity: sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==}
+ '@types/express@4.17.17':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 4.19.6
+ '@types/qs': 6.14.0
+ '@types/serve-static': 1.15.8
- /@types/node@20.1.7:
- resolution: {integrity: sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==}
+ '@types/express@4.17.23':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 4.19.6
+ '@types/qs': 6.14.0
+ '@types/serve-static': 1.15.8
- /@types/node@20.8.7:
- resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==}
+ '@types/express@5.0.3':
dependencies:
- undici-types: 5.25.3
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 5.0.7
+ '@types/serve-static': 1.15.8
- /@types/normalize-package-data@2.4.3:
- resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==}
- dev: false
+ '@types/http-errors@2.0.5': {}
- /@types/parse-json@4.0.0:
- resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
- dev: false
+ '@types/json-schema@7.0.15': {}
- /@types/pdf-parse@1.1.1:
- resolution: {integrity: sha512-lDBKAslCwvfK2uvS1Uk+UCpGvw+JRy5vnBFANPKFSY92n/iEnunXi0KVBjPJXhsM4jtdcPnS7tuZ0zjA9x6piQ==}
- dev: true
+ '@types/long@4.0.2': {}
- /@types/prop-types@15.7.5:
- resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
+ '@types/mime@1.3.5': {}
- /@types/qs@6.9.9:
- resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==}
+ '@types/node@24.5.2':
+ dependencies:
+ undici-types: 7.12.0
- /@types/range-parser@1.2.6:
- resolution: {integrity: sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==}
+ '@types/normalize-package-data@2.4.4': {}
- /@types/react-dom@18.2.1:
- resolution: {integrity: sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w==}
- dependencies:
- '@types/react': 18.2.0
- dev: true
+ '@types/parse-json@4.0.2': {}
- /@types/react@18.2.0:
- resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==}
- dependencies:
- '@types/prop-types': 15.7.5
- '@types/scheduler': 0.16.3
- csstype: 3.1.2
+ '@types/qs@6.14.0': {}
- /@types/resolve@1.17.1:
- resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
- dependencies:
- '@types/node': 20.8.7
- dev: false
+ '@types/range-parser@1.2.7': {}
- /@types/retry@0.12.0:
- resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
- dev: false
+ '@types/react-dom@19.1.9(@types/react@19.1.13)':
+ dependencies:
+ '@types/react': 19.1.13
- /@types/scheduler@0.16.3:
- resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
+ '@types/react@19.1.13':
+ dependencies:
+ csstype: 3.1.3
- /@types/semver@7.5.4:
- resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==}
- dev: false
+ '@types/request@2.48.13':
+ dependencies:
+ '@types/caseless': 0.12.5
+ '@types/node': 24.5.2
+ '@types/tough-cookie': 4.0.5
+ form-data: 2.5.5
- /@types/send@0.17.3:
- resolution: {integrity: sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==}
+ '@types/resolve@1.17.1':
dependencies:
- '@types/mime': 1.3.4
- '@types/node': 20.1.7
+ '@types/node': 24.5.2
- /@types/serve-static@1.15.4:
- resolution: {integrity: sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==}
+ '@types/send@0.17.5':
dependencies:
- '@types/http-errors': 2.0.3
- '@types/mime': 3.0.3
- '@types/node': 20.1.7
+ '@types/mime': 1.3.5
+ '@types/node': 24.5.2
- /@types/stack-utils@2.0.2:
- resolution: {integrity: sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==}
- dev: true
+ '@types/serve-static@1.15.8':
+ dependencies:
+ '@types/http-errors': 2.0.5
+ '@types/node': 24.5.2
+ '@types/send': 0.17.5
- /@types/trusted-types@2.0.5:
- resolution: {integrity: sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==}
- dev: false
+ '@types/tough-cookie@4.0.5': {}
- /@types/yargs-parser@21.0.2:
- resolution: {integrity: sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==}
- dev: true
+ '@types/trusted-types@2.0.7': {}
- /@types/yargs@17.0.29:
- resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==}
+ '@types/ws@8.18.1':
dependencies:
- '@types/yargs-parser': 21.0.2
- dev: true
+ '@types/node': 24.5.2
- /@types/yauzl@2.10.2:
- resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==}
- requiresBuild: true
+ '@types/yauzl@2.10.3':
dependencies:
- '@types/node': 20.1.7
- dev: false
+ '@types/node': 24.5.2
optional: true
- /@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.56.0)(typescript@5.2.2):
- resolution: {integrity: sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.35.0)(typescript@5.9.2))(eslint@9.35.0)(typescript@5.9.2)':
dependencies:
- '@eslint-community/regexpp': 4.9.1
- '@typescript-eslint/parser': 6.8.0(eslint@8.56.0)(typescript@5.2.2)
- '@typescript-eslint/scope-manager': 6.8.0
- '@typescript-eslint/type-utils': 6.8.0(eslint@8.56.0)(typescript@5.2.2)
- '@typescript-eslint/utils': 6.8.0(eslint@8.56.0)(typescript@5.2.2)
- '@typescript-eslint/visitor-keys': 6.8.0
- debug: 4.3.4
- eslint: 8.56.0
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.44.0(eslint@9.35.0)(typescript@5.9.2)
+ '@typescript-eslint/scope-manager': 8.44.0
+ '@typescript-eslint/type-utils': 8.44.0(eslint@9.35.0)(typescript@5.9.2)
+ '@typescript-eslint/utils': 8.44.0(eslint@9.35.0)(typescript@5.9.2)
+ '@typescript-eslint/visitor-keys': 8.44.0
+ eslint: 9.35.0
graphemer: 1.4.0
- ignore: 5.2.4
+ ignore: 7.0.5
natural-compare: 1.4.0
- semver: 7.5.4
- ts-api-utils: 1.0.3(typescript@5.2.2)
- typescript: 5.2.2
+ ts-api-utils: 2.1.0(typescript@5.9.2)
+ typescript: 5.9.2
transitivePeerDependencies:
- supports-color
- dev: false
- /@typescript-eslint/parser@6.8.0(eslint@8.56.0)(typescript@5.2.2):
- resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@typescript-eslint/parser@8.44.0(eslint@9.35.0)(typescript@5.9.2)':
dependencies:
- '@typescript-eslint/scope-manager': 6.8.0
- '@typescript-eslint/types': 6.8.0
- '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2)
- '@typescript-eslint/visitor-keys': 6.8.0
- debug: 4.3.4
- eslint: 8.56.0
- typescript: 5.2.2
+ '@typescript-eslint/scope-manager': 8.44.0
+ '@typescript-eslint/types': 8.44.0
+ '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
+ '@typescript-eslint/visitor-keys': 8.44.0
+ debug: 4.4.3(supports-color@5.5.0)
+ eslint: 9.35.0
+ typescript: 5.9.2
transitivePeerDependencies:
- supports-color
- dev: false
- /@typescript-eslint/scope-manager@6.8.0:
- resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==}
- engines: {node: ^16.0.0 || >=18.0.0}
+ '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)':
dependencies:
- '@typescript-eslint/types': 6.8.0
- '@typescript-eslint/visitor-keys': 6.8.0
- dev: false
+ '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2)
+ '@typescript-eslint/types': 8.44.0
+ debug: 4.4.3(supports-color@5.5.0)
+ typescript: 5.9.2
+ transitivePeerDependencies:
+ - supports-color
- /@typescript-eslint/type-utils@6.8.0(eslint@8.56.0)(typescript@5.2.2):
- resolution: {integrity: sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@typescript-eslint/scope-manager@8.44.0':
+ dependencies:
+ '@typescript-eslint/types': 8.44.0
+ '@typescript-eslint/visitor-keys': 8.44.0
+
+ '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)':
+ dependencies:
+ typescript: 5.9.2
+
+ '@typescript-eslint/type-utils@8.44.0(eslint@9.35.0)(typescript@5.9.2)':
dependencies:
- '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2)
- '@typescript-eslint/utils': 6.8.0(eslint@8.56.0)(typescript@5.2.2)
- debug: 4.3.4
- eslint: 8.56.0
- ts-api-utils: 1.0.3(typescript@5.2.2)
- typescript: 5.2.2
+ '@typescript-eslint/types': 8.44.0
+ '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
+ '@typescript-eslint/utils': 8.44.0(eslint@9.35.0)(typescript@5.9.2)
+ debug: 4.4.3(supports-color@5.5.0)
+ eslint: 9.35.0
+ ts-api-utils: 2.1.0(typescript@5.9.2)
+ typescript: 5.9.2
transitivePeerDependencies:
- supports-color
- dev: false
- /@typescript-eslint/types@6.8.0:
- resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dev: false
+ '@typescript-eslint/types@8.44.0': {}
- /@typescript-eslint/typescript-estree@6.8.0(typescript@5.2.2):
- resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)':
dependencies:
- '@typescript-eslint/types': 6.8.0
- '@typescript-eslint/visitor-keys': 6.8.0
- debug: 4.3.4
- globby: 11.1.0
+ '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2)
+ '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2)
+ '@typescript-eslint/types': 8.44.0
+ '@typescript-eslint/visitor-keys': 8.44.0
+ debug: 4.4.3(supports-color@5.5.0)
+ fast-glob: 3.3.3
is-glob: 4.0.3
- semver: 7.5.4
- ts-api-utils: 1.0.3(typescript@5.2.2)
- typescript: 5.2.2
+ minimatch: 9.0.5
+ semver: 7.7.2
+ ts-api-utils: 2.1.0(typescript@5.9.2)
+ typescript: 5.9.2
transitivePeerDependencies:
- supports-color
- dev: false
-
- /@typescript-eslint/utils@6.8.0(eslint@8.56.0)(typescript@5.2.2):
- resolution: {integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@types/json-schema': 7.0.14
- '@types/semver': 7.5.4
- '@typescript-eslint/scope-manager': 6.8.0
- '@typescript-eslint/types': 6.8.0
- '@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2)
- eslint: 8.56.0
- semver: 7.5.4
+
+ '@typescript-eslint/utils@8.44.0(eslint@9.35.0)(typescript@5.9.2)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0)
+ '@typescript-eslint/scope-manager': 8.44.0
+ '@typescript-eslint/types': 8.44.0
+ '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
+ eslint: 9.35.0
+ typescript: 5.9.2
transitivePeerDependencies:
- supports-color
- - typescript
- dev: false
- /@typescript-eslint/visitor-keys@6.8.0:
- resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==}
- engines: {node: ^16.0.0 || >=18.0.0}
+ '@typescript-eslint/visitor-keys@8.44.0':
dependencies:
- '@typescript-eslint/types': 6.8.0
- eslint-visitor-keys: 3.4.3
- dev: false
+ '@typescript-eslint/types': 8.44.0
+ eslint-visitor-keys: 4.2.1
- /@ungap/structured-clone@1.2.0:
- resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ '@vitejs/plugin-react@4.7.0(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))':
+ dependencies:
+ '@babel/core': 7.28.4
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4)
+ '@rolldown/pluginutils': 1.0.0-beta.27
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.17.0
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
+ transitivePeerDependencies:
+ - supports-color
- /@vitejs/plugin-react@4.0.0(vite@4.3.5):
- resolution: {integrity: sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- vite: ^4.2.0
+ '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@24.5.2)(jsdom@26.1.0)(terser@5.44.0)(tsx@4.20.5))':
dependencies:
- '@babel/core': 7.22.8
- '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.8)
- '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.8)
- react-refresh: 0.14.0
- vite: 4.3.5(@types/node@18.16.1)
+ '@ampproject/remapping': 2.3.0
+ '@bcoe/v8-coverage': 1.0.2
+ ast-v8-to-istanbul: 0.3.5
+ debug: 4.4.3(supports-color@5.5.0)
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 5.0.6
+ istanbul-reports: 3.2.0
+ magic-string: 0.30.19
+ magicast: 0.3.5
+ std-env: 3.9.0
+ test-exclude: 7.0.1
+ tinyrainbow: 2.0.0
+ vitest: 3.2.4(@types/node@24.5.2)(jsdom@26.1.0)(terser@5.44.0)(tsx@4.20.5)
transitivePeerDependencies:
- supports-color
- dev: false
- /@vitest/coverage-c8@0.31.1(vitest@0.31.1):
- resolution: {integrity: sha512-6TkjQpmgYez7e3dbAUoYdRXxWN81BojCmUILJwgCy39uZFG33DsQ0rSRSZC9beAEdCZTpxR63nOvd9hxDQcJ0g==}
- peerDependencies:
- vitest: '>=0.30.0 <1'
+ '@vitest/expect@3.2.4':
dependencies:
- '@ampproject/remapping': 2.2.1
- c8: 7.14.0
- magic-string: 0.30.1
- picocolors: 1.0.0
- std-env: 3.3.3
- vitest: 0.31.1
- dev: true
+ '@types/chai': 5.2.2
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
+ chai: 5.3.3
+ tinyrainbow: 2.0.0
- /@vitest/expect@0.31.1:
- resolution: {integrity: sha512-BV1LyNvhnX+eNYzJxlHIGPWZpwJFZaCcOIzp2CNG0P+bbetenTupk6EO0LANm4QFt0TTit+yqx7Rxd1qxi/SQA==}
+ '@vitest/mocker@3.2.4(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))':
dependencies:
- '@vitest/spy': 0.31.1
- '@vitest/utils': 0.31.1
- chai: 4.3.7
- dev: true
+ '@vitest/spy': 3.2.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.19
+ optionalDependencies:
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
- /@vitest/runner@0.31.1:
- resolution: {integrity: sha512-imWuc82ngOtxdCUpXwtEzZIuc1KMr+VlQ3Ondph45VhWoQWit5yvG/fFcldbnCi8DUuFi+NmNx5ehMUw/cGLUw==}
+ '@vitest/pretty-format@3.2.4':
dependencies:
- '@vitest/utils': 0.31.1
- concordance: 5.0.4
- p-limit: 4.0.0
- pathe: 1.1.1
- dev: true
+ tinyrainbow: 2.0.0
- /@vitest/snapshot@0.31.1:
- resolution: {integrity: sha512-L3w5uU9bMe6asrNzJ8WZzN+jUTX4KSgCinEJPXyny0o90fG4FPQMV0OWsq7vrCWfQlAilMjDnOF9nP8lidsJ+g==}
+ '@vitest/runner@3.2.4':
dependencies:
- magic-string: 0.30.1
- pathe: 1.1.1
- pretty-format: 27.5.1
- dev: true
+ '@vitest/utils': 3.2.4
+ pathe: 2.0.3
+ strip-literal: 3.0.0
- /@vitest/spy@0.31.1:
- resolution: {integrity: sha512-1cTpt2m9mdo3hRLDyCG2hDQvRrePTDgEJBFQQNz1ydHHZy03EiA6EpFxY+7ODaY7vMRCie+WlFZBZ0/dQWyssQ==}
+ '@vitest/snapshot@3.2.4':
dependencies:
- tinyspy: 2.1.1
- dev: true
+ '@vitest/pretty-format': 3.2.4
+ magic-string: 0.30.19
+ pathe: 2.0.3
- /@vitest/utils@0.31.1:
- resolution: {integrity: sha512-yFyRD5ilwojsZfo3E0BnH72pSVSuLg2356cN1tCEe/0RtDzxTPYwOomIC+eQbot7m6DRy4tPZw+09mB7NkbMmA==}
+ '@vitest/spy@3.2.4':
dependencies:
- concordance: 5.0.4
- loupe: 2.3.6
- pretty-format: 27.5.1
- dev: true
+ tinyspy: 4.0.4
- /@zkochan/js-yaml@0.0.6:
- resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==}
- hasBin: true
+ '@vitest/utils@3.2.4':
+ dependencies:
+ '@vitest/pretty-format': 3.2.4
+ loupe: 3.2.1
+ tinyrainbow: 2.0.0
+
+ '@zkochan/js-yaml@0.0.6':
dependencies:
argparse: 2.0.1
- dev: true
- /@zkochan/rimraf@2.1.3:
- resolution: {integrity: sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A==}
- engines: {node: '>=12.10'}
+ '@zkochan/rimraf@2.1.3':
dependencies:
rimraf: 3.0.2
- dev: true
- /@zkochan/which@2.0.3:
- resolution: {integrity: sha512-C1ReN7vt2/2O0fyTsx5xnbQuxBrmG5NMSbcIkPKCCfCTJgpZBsuRYzFXHj3nVq8vTfK7vxHUmzfCpSHgO7j4rg==}
- engines: {node: '>= 8'}
- hasBin: true
+ '@zkochan/which@2.0.3':
dependencies:
isexe: 2.0.0
- dev: true
- /abbrev@1.1.1:
- resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
- dev: true
-
- /abort-controller@3.0.0:
- resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
- engines: {node: '>=6.5'}
+ abort-controller@3.0.0:
dependencies:
event-target-shim: 5.0.1
- dev: false
- /accepts@1.3.8:
- resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
- engines: {node: '>= 0.6'}
+ accepts@1.3.8:
dependencies:
mime-types: 2.1.35
negotiator: 0.6.3
- dev: false
- /acorn-jsx@5.3.2(acorn@8.10.0):
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ acorn-jsx@5.3.2(acorn@8.15.0):
dependencies:
- acorn: 8.10.0
+ acorn: 8.15.0
- /acorn-walk@8.2.0:
- resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
- engines: {node: '>=0.4.0'}
- dev: true
-
- /acorn@8.10.0:
- resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
- engines: {node: '>=0.4.0'}
- hasBin: true
+ acorn@8.15.0: {}
- /agent-base@6.0.2:
- resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
- engines: {node: '>= 6.0.0'}
+ agent-base@6.0.2:
dependencies:
- debug: 4.3.4
+ debug: 4.4.3(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
- dev: false
- /agent-base@7.1.0:
- resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
- engines: {node: '>= 14'}
- dependencies:
- debug: 4.3.4
- transitivePeerDependencies:
- - supports-color
- dev: false
+ agent-base@7.1.4: {}
- /ajv-formats@2.1.1(ajv@8.12.0):
- resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
- peerDependencies:
- ajv: ^8.0.0
- peerDependenciesMeta:
- ajv:
- optional: true
- dependencies:
- ajv: 8.12.0
- dev: false
+ ajv-formats@2.1.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
- /ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
fast-json-stable-stringify: 2.1.0
json-schema-traverse: 0.4.1
uri-js: 4.4.1
- /ajv@8.12.0:
- resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ ajv@8.17.1:
dependencies:
fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- uri-js: 4.4.1
- dev: false
- /ansi-escapes@4.3.2:
- resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
- engines: {node: '>=8'}
- dependencies:
- type-fest: 0.21.3
- dev: true
-
- /ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
+ ansi-regex@5.0.1: {}
- /ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
- dependencies:
- color-convert: 1.9.3
+ ansi-regex@6.2.2: {}
- /ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
+ ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
- /ansi-styles@5.2.0:
- resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
- engines: {node: '>=10'}
- dev: true
+ ansi-styles@5.2.0: {}
- /any-promise@1.3.0:
- resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
- dev: true
+ ansi-styles@6.2.3: {}
- /anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
+ anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
- dev: true
- /arg@4.1.3:
- resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
- dev: true
+ argparse@2.0.1: {}
- /argparse@1.0.10:
- resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ aria-query@5.3.0:
dependencies:
- sprintf-js: 1.0.3
- dev: true
-
- /argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dequal: 2.0.3
- /args@5.0.3:
- resolution: {integrity: sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==}
- engines: {node: '>= 6.0.0'}
- dependencies:
- camelcase: 5.0.0
- chalk: 2.4.2
- leven: 2.1.0
- mri: 1.1.4
+ aria-query@5.3.2: {}
- /array-buffer-byte-length@1.0.0:
- resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+ array-buffer-byte-length@1.0.2:
dependencies:
- call-bind: 1.0.2
- is-array-buffer: 3.0.2
- dev: false
-
- /array-flatten@1.1.1:
- resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
- dev: false
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
- /array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
+ array-flatten@1.1.1: {}
- /arraybuffer.prototype.slice@1.0.2:
- resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
- engines: {node: '>= 0.4'}
+ arraybuffer.prototype.slice@1.0.4:
dependencies:
- array-buffer-byte-length: 1.0.0
- call-bind: 1.0.2
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.22.2
- get-intrinsic: 1.2.1
- is-array-buffer: 3.0.2
- is-shared-array-buffer: 1.0.2
- dev: false
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
- /arrify@2.0.1:
- resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
- engines: {node: '>=8'}
- dev: false
+ arrify@2.0.1: {}
- /assertion-error@1.1.0:
- resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
- dev: true
+ assertion-error@2.0.1: {}
- /ast-types@0.13.4:
- resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==}
- engines: {node: '>=4'}
+ ast-types@0.13.4:
dependencies:
- tslib: 2.6.2
- dev: false
+ tslib: 2.8.1
- /async-retry@1.3.3:
- resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
+ ast-v8-to-istanbul@0.3.5:
dependencies:
- retry: 0.13.1
- dev: false
-
- /async@3.2.4:
- resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
- dev: false
+ '@jridgewell/trace-mapping': 0.3.31
+ estree-walker: 3.0.3
+ js-tokens: 9.0.1
- /asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-
- /at-least-node@1.0.0:
- resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
- engines: {node: '>= 4.0.0'}
- dev: false
+ async-function@1.0.0: {}
- /atomic-sleep@1.0.0:
- resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
- engines: {node: '>=8.0.0'}
+ async-retry@1.3.3:
+ dependencies:
+ retry: 0.13.1
- /available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
- engines: {node: '>= 0.4'}
- dev: false
+ async@3.2.6: {}
- /axios@0.27.2:
- resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
- dependencies:
- follow-redirects: 1.15.3
- form-data: 4.0.0
- transitivePeerDependencies:
- - debug
- dev: false
+ asynckit@0.4.0: {}
- /b4a@1.6.4:
- resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==}
- dev: false
+ at-least-node@1.0.0: {}
- /babel-jest@29.7.0(@babel/core@7.23.2):
- resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@babel/core': ^7.8.0
- dependencies:
- '@babel/core': 7.23.2
- '@jest/transform': 29.7.0
- '@types/babel__core': 7.20.3
- babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.23.2)
- chalk: 4.1.2
- graceful-fs: 4.2.11
- slash: 3.0.0
- transitivePeerDependencies:
- - supports-color
- dev: true
+ atomic-sleep@1.0.0: {}
- /babel-plugin-istanbul@6.1.1:
- resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
- engines: {node: '>=8'}
+ available-typed-arrays@1.0.7:
dependencies:
- '@babel/helper-plugin-utils': 7.22.5
- '@istanbuljs/load-nyc-config': 1.1.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-instrument: 5.2.1
- test-exclude: 6.0.0
- transitivePeerDependencies:
- - supports-color
- dev: true
+ possible-typed-array-names: 1.1.0
- /babel-plugin-jest-hoist@29.6.3:
- resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@babel/template': 7.22.15
- '@babel/types': 7.23.0
- '@types/babel__core': 7.20.3
- '@types/babel__traverse': 7.20.3
- dev: true
+ b4a@1.7.1: {}
- /babel-plugin-macros@3.1.0:
- resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
- engines: {node: '>=10', npm: '>=6'}
+ babel-plugin-macros@3.1.0:
dependencies:
- '@babel/runtime': 7.22.6
+ '@babel/runtime': 7.28.4
cosmiconfig: 7.1.0
- resolve: 1.22.2
- dev: false
+ resolve: 1.22.10
- /babel-plugin-polyfill-corejs2@0.4.6(@babel/core@7.23.2):
- resolution: {integrity: sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.4):
dependencies:
- '@babel/compat-data': 7.23.2
- '@babel/core': 7.23.2
- '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2)
+ '@babel/compat-data': 7.28.4
+ '@babel/core': 7.28.4
+ '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4)
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- dev: false
- /babel-plugin-polyfill-corejs3@0.8.5(@babel/core@7.23.2):
- resolution: {integrity: sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.4):
dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2)
- core-js-compat: 3.33.0
+ '@babel/core': 7.28.4
+ '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4)
+ core-js-compat: 3.45.1
transitivePeerDependencies:
- supports-color
- dev: false
- /babel-plugin-polyfill-regenerator@0.5.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.4):
dependencies:
- '@babel/core': 7.23.2
- '@babel/helper-define-polyfill-provider': 0.4.3(@babel/core@7.23.2)
+ '@babel/core': 7.28.4
+ '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4)
transitivePeerDependencies:
- supports-color
- dev: false
- /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2):
- resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
- peerDependencies:
- '@babel/core': ^7.0.0
+ balanced-match@1.0.2: {}
+
+ bare-events@2.6.1:
+ optional: true
+
+ bare-fs@4.4.4:
dependencies:
- '@babel/core': 7.23.2
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.2)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2)
- dev: true
-
- /babel-preset-jest@29.6.3(@babel/core@7.23.2):
- resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@babel/core': ^7.0.0
+ bare-events: 2.6.1
+ bare-path: 3.0.0
+ bare-stream: 2.7.0(bare-events@2.6.1)
+ bare-url: 2.2.2
+ fast-fifo: 1.3.2
+ transitivePeerDependencies:
+ - react-native-b4a
+ optional: true
+
+ bare-os@3.6.2:
+ optional: true
+
+ bare-path@3.0.0:
dependencies:
- '@babel/core': 7.23.2
- babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2)
- dev: true
+ bare-os: 3.6.2
+ optional: true
- /balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ bare-stream@2.7.0(bare-events@2.6.1):
+ dependencies:
+ streamx: 2.22.1
+ optionalDependencies:
+ bare-events: 2.6.1
+ transitivePeerDependencies:
+ - react-native-b4a
+ optional: true
- /base64-js@1.5.1:
- resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
- dev: false
+ bare-url@2.2.2:
+ dependencies:
+ bare-path: 3.0.0
+ optional: true
- /basic-ftp@5.0.3:
- resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==}
- engines: {node: '>=10.0.0'}
- dev: false
+ base64-js@1.5.1: {}
- /bignumber.js@9.1.1:
- resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==}
- dev: false
+ baseline-browser-mapping@2.8.5: {}
- /binary-extensions@2.2.0:
- resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
- engines: {node: '>=8'}
- dev: true
+ basic-ftp@5.0.5: {}
- /blueimp-md5@2.19.0:
- resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==}
- dev: true
+ bignumber.js@9.3.1: {}
- /body-parser@1.20.1:
- resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- dependencies:
- bytes: 3.1.2
- content-type: 1.0.5
- debug: 2.6.9
- depd: 2.0.0
- destroy: 1.2.0
- http-errors: 2.0.0
- iconv-lite: 0.4.24
- on-finished: 2.4.1
- qs: 6.11.0
- raw-body: 2.5.1
- type-is: 1.6.18
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
- dev: false
+ binary-extensions@2.3.0: {}
- /body-parser@1.20.2:
- resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ body-parser@1.20.3:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
@@ -4190,214 +6942,93 @@ packages:
http-errors: 2.0.0
iconv-lite: 0.4.24
on-finished: 2.4.1
- qs: 6.11.0
+ qs: 6.13.0
raw-body: 2.5.2
type-is: 1.6.18
unpipe: 1.0.0
transitivePeerDependencies:
- supports-color
- dev: false
- /bole@5.0.9:
- resolution: {integrity: sha512-35GeBG6T7GW9VmLDF2IoKAtFCqMjmmq1uICbsICI0pID7ZAyUKlf7dg1wpXmn9GcMKHtg0S19CPMU5yfY3tv+g==}
+ bole@5.0.21:
dependencies:
fast-safe-stringify: 2.1.1
individual: 3.0.0
- dev: true
- /brace-expansion@1.1.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
- /brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ brace-expansion@2.0.2:
dependencies:
balanced-match: 1.0.2
- dev: false
-
- /braces@3.0.2:
- resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
- engines: {node: '>=8'}
- dependencies:
- fill-range: 7.0.1
- /browserslist@4.21.9:
- resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
- dependencies:
- caniuse-lite: 1.0.30001513
- electron-to-chromium: 1.4.454
- node-releases: 2.0.13
- update-browserslist-db: 1.0.11(browserslist@4.21.9)
- dev: false
-
- /browserslist@4.22.1:
- resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
+ braces@3.0.3:
dependencies:
- caniuse-lite: 1.0.30001551
- electron-to-chromium: 1.4.559
- node-releases: 2.0.13
- update-browserslist-db: 1.0.13(browserslist@4.22.1)
+ fill-range: 7.1.1
- /bs-logger@0.2.6:
- resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
- engines: {node: '>= 6'}
+ browserslist@4.26.2:
dependencies:
- fast-json-stable-stringify: 2.1.0
- dev: true
+ baseline-browser-mapping: 2.8.5
+ caniuse-lite: 1.0.30001743
+ electron-to-chromium: 1.5.221
+ node-releases: 2.0.21
+ update-browserslist-db: 1.1.3(browserslist@4.26.2)
- /bser@2.1.1:
- resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
- dependencies:
- node-int64: 0.4.0
- dev: true
+ buffer-crc32@0.2.13: {}
- /buffer-crc32@0.2.13:
- resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
- dev: false
+ buffer-equal-constant-time@1.0.1: {}
- /buffer-equal-constant-time@1.0.1:
- resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
- dev: false
+ buffer-from@1.1.2: {}
- /buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ builtin-modules@3.3.0: {}
- /buffer@5.7.1:
- resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
- dev: false
+ bytes@3.1.2: {}
- /builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
- dev: false
+ cac@6.7.14: {}
- /bundle-require@4.0.1(esbuild@0.17.19):
- resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- peerDependencies:
- esbuild: '>=0.17'
+ call-bind-apply-helpers@1.0.2:
dependencies:
- esbuild: 0.17.19
- load-tsconfig: 0.2.5
- dev: true
-
- /bytes@3.0.0:
- resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
- engines: {node: '>= 0.8'}
- dev: false
-
- /bytes@3.1.2:
- resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
- engines: {node: '>= 0.8'}
- dev: false
+ es-errors: 1.3.0
+ function-bind: 1.1.2
- /c8@7.14.0:
- resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==}
- engines: {node: '>=10.12.0'}
- hasBin: true
+ call-bind@1.0.8:
dependencies:
- '@bcoe/v8-coverage': 0.2.3
- '@istanbuljs/schema': 0.1.3
- find-up: 5.0.0
- foreground-child: 2.0.0
- istanbul-lib-coverage: 3.2.0
- istanbul-lib-report: 3.0.0
- istanbul-reports: 3.1.5
- rimraf: 3.0.2
- test-exclude: 6.0.0
- v8-to-istanbul: 9.1.0
- yargs: 16.2.0
- yargs-parser: 20.2.9
- dev: true
-
- /cac@6.7.14:
- resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
- engines: {node: '>=8'}
- dev: true
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
- /call-bind@1.0.2:
- resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+ call-bound@1.0.4:
dependencies:
- function-bind: 1.1.2
- get-intrinsic: 1.2.1
- dev: false
-
- /callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
-
- /camelcase@5.0.0:
- resolution: {integrity: sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==}
- engines: {node: '>=6'}
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
- /camelcase@5.3.1:
- resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
- engines: {node: '>=6'}
- dev: true
-
- /camelcase@6.3.0:
- resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
- engines: {node: '>=10'}
+ callsites@3.1.0: {}
- /caniuse-lite@1.0.30001513:
- resolution: {integrity: sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==}
- dev: false
+ camelcase@6.3.0: {}
- /caniuse-lite@1.0.30001551:
- resolution: {integrity: sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==}
+ caniuse-lite@1.0.30001743: {}
- /chai@4.3.7:
- resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==}
- engines: {node: '>=4'}
- dependencies:
- assertion-error: 1.1.0
- check-error: 1.0.2
- deep-eql: 4.1.3
- get-func-name: 2.0.0
- loupe: 2.3.6
- pathval: 1.1.1
- type-detect: 4.0.8
- dev: true
-
- /chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
+ chai@5.3.3:
dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.2.1
+ pathval: 2.0.1
- /chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
+ chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- /char-regex@1.0.2:
- resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
- engines: {node: '>=10'}
- dev: true
-
- /check-error@1.0.2:
- resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==}
- dev: true
+ check-error@2.1.1: {}
- /chokidar@3.5.3:
- resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
- engines: {node: '>= 8.10.0'}
+ chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
- braces: 3.0.2
+ braces: 3.0.3
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
@@ -4405,167 +7036,75 @@ packages:
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.3
- dev: true
-
- /chromium-bidi@0.4.16(devtools-protocol@0.0.1147663):
- resolution: {integrity: sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==}
- peerDependencies:
- devtools-protocol: '*'
- dependencies:
- devtools-protocol: 0.0.1147663
- mitt: 3.0.0
- dev: false
-
- /ci-info@3.9.0:
- resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
- engines: {node: '>=8'}
- dev: true
-
- /cjs-module-lexer@1.2.3:
- resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==}
- dev: true
- /cliui@7.0.4:
- resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+ chromium-bidi@8.0.0(devtools-protocol@0.0.1495869):
dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
+ devtools-protocol: 0.0.1495869
+ mitt: 3.0.1
+ zod: 3.25.76
- /cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
+ cliui@8.0.1:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
- /cloudevents@6.0.4:
- resolution: {integrity: sha512-Vay81bTsutFkZxHnM2K0rev95d0x7aTZ3G+Bmm8/GnIzsVtGfeBkLcXFD4czZ08RoOn6POKl+rIXaBS+Xn+jIA==}
- engines: {node: '>=12 <20.0.0'}
+ cloudevents@6.0.4:
dependencies:
- ajv: 8.12.0
- ajv-formats: 2.1.1(ajv@8.12.0)
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
process: 0.11.10
util: 0.12.5
uuid: 8.3.2
- dev: false
-
- /co@4.6.0:
- resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
- engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
- dev: true
- /collect-v8-coverage@1.0.2:
- resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
- dev: true
-
- /color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
- dependencies:
- color-name: 1.1.3
-
- /color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
+ cloudevents@8.0.3:
dependencies:
- color-name: 1.1.4
-
- /color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
- /color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ json-bigint: 1.0.0
+ process: 0.11.10
+ util: 0.12.5
+ uuid: 8.3.2
- /color-string@1.9.1:
- resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- simple-swizzle: 0.2.2
- dev: false
- /color@4.2.3:
- resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
- engines: {node: '>=12.5.0'}
- dependencies:
- color-convert: 2.0.1
- color-string: 1.9.1
- dev: false
+ color-name@1.1.4: {}
- /colorette@2.0.20:
- resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+ colorette@2.0.20: {}
- /combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
+ combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
- /command-exists@1.2.9:
- resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==}
- dev: true
-
- /commander@2.20.3:
- resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
- dev: false
+ command-exists@1.2.9: {}
- /commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
- dev: true
+ commander@2.20.3: {}
- /common-tags@1.8.2:
- resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
- engines: {node: '>=4.0.0'}
- dev: false
+ common-tags@1.8.2: {}
- /compressible@2.0.18:
- resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
- engines: {node: '>= 0.6'}
+ compressible@2.0.18:
dependencies:
- mime-db: 1.52.0
- dev: false
+ mime-db: 1.54.0
- /compression@1.7.4:
- resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
- engines: {node: '>= 0.8.0'}
+ compression@1.8.1:
dependencies:
- accepts: 1.3.8
- bytes: 3.0.0
+ bytes: 3.1.2
compressible: 2.0.18
debug: 2.6.9
- on-headers: 1.0.2
- safe-buffer: 5.1.2
+ negotiator: 0.6.4
+ on-headers: 1.1.0
+ safe-buffer: 5.2.1
vary: 1.1.2
transitivePeerDependencies:
- supports-color
- dev: false
-
- /comver-to-semver@1.0.0:
- resolution: {integrity: sha512-gcGtbRxjwROQOdXLUWH1fQAXqThUVRZ219aAwgtX3KfYw429/Zv6EIJRf5TBSzWdAGwePmqH7w70WTaX4MDqag==}
- engines: {node: '>=12.17'}
- dev: true
- /concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ comver-to-semver@1.0.0: {}
- /concordance@5.0.4:
- resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==}
- engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'}
- dependencies:
- date-time: 3.1.0
- esutils: 2.0.3
- fast-diff: 1.3.0
- js-string-escape: 1.0.1
- lodash: 4.17.21
- md5-hex: 3.0.1
- semver: 7.5.4
- well-known-symbols: 2.0.0
- dev: true
+ concat-map@0.0.1: {}
- /configstore@5.0.1:
- resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
- engines: {node: '>=8'}
+ configstore@5.0.1:
dependencies:
dot-prop: 5.3.0
graceful-fs: 4.2.11
@@ -4573,621 +7112,444 @@ packages:
unique-string: 2.0.0
write-file-atomic: 3.0.3
xdg-basedir: 4.0.0
- dev: false
- /content-disposition@0.5.4:
- resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
- engines: {node: '>= 0.6'}
+ content-disposition@0.5.4:
dependencies:
safe-buffer: 5.2.1
- dev: false
- /content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
- dev: false
+ content-type@1.0.5: {}
- /convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+ convert-source-map@1.9.0: {}
- /convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ convert-source-map@2.0.0: {}
- /cookie-signature@1.0.6:
- resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
- dev: false
+ cookie-signature@1.0.6: {}
- /cookie@0.5.0:
- resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
- engines: {node: '>= 0.6'}
- dev: false
+ cookie@0.7.1: {}
- /core-js-compat@3.33.0:
- resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==}
+ core-js-compat@3.45.1:
dependencies:
- browserslist: 4.22.1
- dev: false
+ browserslist: 4.26.2
- /cors@2.8.5:
- resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
- engines: {node: '>= 0.10'}
+ cors@2.8.5:
dependencies:
object-assign: 4.1.1
vary: 1.1.2
- dev: false
- /cosmiconfig@7.1.0:
- resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
- engines: {node: '>=10'}
+ cosmiconfig@7.1.0:
dependencies:
- '@types/parse-json': 4.0.0
- import-fresh: 3.3.0
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.1
parse-json: 5.2.0
path-type: 4.0.0
yaml: 1.10.2
- dev: false
- /cosmiconfig@8.2.0:
- resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==}
- engines: {node: '>=14'}
+ cosmiconfig@8.3.6(typescript@5.9.2):
dependencies:
- import-fresh: 3.3.0
+ import-fresh: 3.3.1
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
- dev: false
-
- /create-jest@29.7.0(@types/node@20.1.7):
- resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@20.1.7)
- jest-util: 29.7.0
- prompts: 2.4.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
- dev: true
-
- /create-require@1.1.1:
- resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
- dev: true
+ optionalDependencies:
+ typescript: 5.9.2
- /cross-fetch@4.0.0:
- resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
+ cosmiconfig@9.0.0(typescript@5.9.2):
dependencies:
- node-fetch: 2.7.0
- transitivePeerDependencies:
- - encoding
- dev: false
+ env-paths: 2.2.1
+ import-fresh: 3.3.1
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.9.2
- /cross-spawn@7.0.3:
- resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
- engines: {node: '>= 8'}
+ cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
- /crypto-random-string@2.0.0:
- resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
- engines: {node: '>=8'}
- dev: false
+ crypto-random-string@2.0.0: {}
- /csstype@3.1.2:
- resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
+ css.escape@1.5.1: {}
- /data-uri-to-buffer@6.0.1:
- resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==}
- engines: {node: '>= 14'}
- dev: false
+ cssstyle@4.6.0:
+ dependencies:
+ '@asamuzakjp/css-color': 3.2.0
+ rrweb-cssom: 0.8.0
- /date-time@3.1.0:
- resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==}
- engines: {node: '>=6'}
+ csstype@3.1.3: {}
+
+ data-uri-to-buffer@6.0.2: {}
+
+ data-urls@5.0.0:
dependencies:
- time-zone: 1.0.0
- dev: true
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
- /dateformat@4.6.3:
- resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
- /debug@2.6.9:
- resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ dateformat@4.6.3: {}
+
+ debug@2.6.9:
dependencies:
ms: 2.0.0
- dev: false
- /debug@3.2.7(supports-color@5.5.0):
- resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ debug@3.2.7:
dependencies:
ms: 2.1.3
- supports-color: 5.5.0
- /debug@4.3.4:
- resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ debug@4.4.3(supports-color@5.5.0):
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
+ optionalDependencies:
+ supports-color: 5.5.0
- /dedent@1.5.1:
- resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
- dev: true
+ decimal.js@10.6.0: {}
- /deep-eql@4.1.3:
- resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
- engines: {node: '>=6'}
- dependencies:
- type-detect: 4.0.8
- dev: true
+ deep-eql@5.0.2: {}
- /deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ deep-is@0.1.4: {}
- /deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
+ deepmerge@4.3.1: {}
- /define-data-property@1.1.1:
- resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
- engines: {node: '>= 0.4'}
+ define-data-property@1.1.4:
dependencies:
- get-intrinsic: 1.2.1
- gopd: 1.0.1
- has-property-descriptors: 1.0.0
- dev: false
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
- /define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
+ define-lazy-prop@2.0.0: {}
+
+ define-properties@1.2.1:
dependencies:
- define-data-property: 1.1.1
- has-property-descriptors: 1.0.0
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
object-keys: 1.1.1
- dev: false
- /degenerator@5.0.1:
- resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==}
- engines: {node: '>= 14'}
+ degenerator@5.0.1:
dependencies:
ast-types: 0.13.4
escodegen: 2.1.0
esprima: 4.0.1
- dev: false
- /delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
-
- /depd@2.0.0:
- resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
- engines: {node: '>= 0.8'}
- dev: false
-
- /destroy@1.2.0:
- resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- dev: false
+ delayed-stream@1.0.0: {}
- /detect-libc@2.0.2:
- resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
- engines: {node: '>=8'}
- dev: false
+ depd@2.0.0: {}
- /detect-newline@3.1.0:
- resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
- engines: {node: '>=8'}
- dev: true
+ dequal@2.0.3: {}
- /devtools-protocol@0.0.1147663:
- resolution: {integrity: sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==}
- dev: false
+ destroy@1.2.0: {}
- /diff-sequences@29.6.3:
- resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dev: true
+ devtools-protocol@0.0.1495869: {}
- /diff@4.0.2:
- resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
- engines: {node: '>=0.3.1'}
- dev: true
+ dom-accessibility-api@0.5.16: {}
- /dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
- dependencies:
- path-type: 4.0.0
+ dom-accessibility-api@0.6.3: {}
- /doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
+ dot-case@3.0.4:
dependencies:
- esutils: 2.0.3
+ no-case: 3.0.4
+ tslib: 2.8.1
- /dot-prop@5.3.0:
- resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
- engines: {node: '>=8'}
+ dot-prop@5.3.0:
dependencies:
is-obj: 2.0.0
- dev: false
- /dotenv@16.0.3:
- resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
- engines: {node: '>=12'}
- dev: false
+ dotenv@16.0.3: {}
+
+ dotenv@16.6.1: {}
- /duplexify@4.1.2:
- resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==}
+ dunder-proto@1.0.1:
dependencies:
- end-of-stream: 1.4.4
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ duplexify@4.1.3:
+ dependencies:
+ end-of-stream: 1.4.5
inherits: 2.0.4
readable-stream: 3.6.2
- stream-shift: 1.0.1
+ stream-shift: 1.0.3
- /ecdsa-sig-formatter@1.0.11:
- resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+ eastasianwidth@0.2.0: {}
+
+ ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer: 5.2.1
- dev: false
- /ee-first@1.1.1:
- resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- dev: false
+ ee-first@1.1.1: {}
- /ejs@3.1.9:
- resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
- engines: {node: '>=0.10.0'}
- hasBin: true
+ ejs@3.1.10:
dependencies:
- jake: 10.8.7
- dev: false
-
- /electron-to-chromium@1.4.454:
- resolution: {integrity: sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==}
- dev: false
+ jake: 10.9.4
- /electron-to-chromium@1.4.559:
- resolution: {integrity: sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==}
+ electron-to-chromium@1.5.221: {}
- /emittery@0.13.1:
- resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
- engines: {node: '>=12'}
- dev: true
+ emoji-regex@8.0.0: {}
- /emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ emoji-regex@9.2.2: {}
- /encode-registry@3.0.1:
- resolution: {integrity: sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw==}
- engines: {node: '>=10'}
+ encode-registry@3.0.1:
dependencies:
mem: 8.1.1
- dev: true
- /encodeurl@1.0.2:
- resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
- engines: {node: '>= 0.8'}
- dev: false
+ encodeurl@1.0.2: {}
- /end-of-stream@1.4.4:
- resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ encodeurl@2.0.0: {}
+
+ end-of-stream@1.4.5:
dependencies:
once: 1.4.0
- /ent@2.2.0:
- resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==}
- dev: false
+ ent@2.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ punycode: 1.4.1
+ safe-regex-test: 1.1.0
+
+ entities@4.5.0: {}
- /entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
- dev: false
+ entities@6.0.1: {}
+
+ env-paths@2.2.1: {}
- /error-ex@1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ error-ex@1.3.4:
dependencies:
is-arrayish: 0.2.1
- /es-abstract@1.22.2:
- resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==}
- engines: {node: '>= 0.4'}
- dependencies:
- array-buffer-byte-length: 1.0.0
- arraybuffer.prototype.slice: 1.0.2
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
- es-to-primitive: 1.2.1
- function.prototype.name: 1.1.6
- get-intrinsic: 1.2.1
- get-symbol-description: 1.0.0
- globalthis: 1.0.3
- gopd: 1.0.1
- has: 1.0.4
- has-property-descriptors: 1.0.0
- has-proto: 1.0.1
- has-symbols: 1.0.3
- internal-slot: 1.0.5
- is-array-buffer: 3.0.2
+ es-abstract@1.24.0:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
is-callable: 1.2.7
- is-negative-zero: 2.0.2
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- is-string: 1.0.7
- is-typed-array: 1.1.12
- is-weakref: 1.0.2
- object-inspect: 1.13.0
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
object-keys: 1.1.1
- object.assign: 4.1.4
- regexp.prototype.flags: 1.5.1
- safe-array-concat: 1.0.1
- safe-regex-test: 1.0.0
- string.prototype.trim: 1.2.8
- string.prototype.trimend: 1.0.7
- string.prototype.trimstart: 1.0.7
- typed-array-buffer: 1.0.0
- typed-array-byte-length: 1.0.0
- typed-array-byte-offset: 1.0.0
- typed-array-length: 1.0.4
- unbox-primitive: 1.0.2
- which-typed-array: 1.1.11
- dev: false
-
- /es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.4
- has-tostringtag: 1.0.0
- dev: false
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.19
- /es-to-primitive@1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
- dependencies:
- is-callable: 1.2.7
- is-date-object: 1.0.5
- is-symbol: 1.0.4
- dev: false
+ es-define-property@1.0.1: {}
- /esbuild@0.17.19:
- resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
- engines: {node: '>=12'}
- hasBin: true
- requiresBuild: true
- optionalDependencies:
- '@esbuild/android-arm': 0.17.19
- '@esbuild/android-arm64': 0.17.19
- '@esbuild/android-x64': 0.17.19
- '@esbuild/darwin-arm64': 0.17.19
- '@esbuild/darwin-x64': 0.17.19
- '@esbuild/freebsd-arm64': 0.17.19
- '@esbuild/freebsd-x64': 0.17.19
- '@esbuild/linux-arm': 0.17.19
- '@esbuild/linux-arm64': 0.17.19
- '@esbuild/linux-ia32': 0.17.19
- '@esbuild/linux-loong64': 0.17.19
- '@esbuild/linux-mips64el': 0.17.19
- '@esbuild/linux-ppc64': 0.17.19
- '@esbuild/linux-riscv64': 0.17.19
- '@esbuild/linux-s390x': 0.17.19
- '@esbuild/linux-x64': 0.17.19
- '@esbuild/netbsd-x64': 0.17.19
- '@esbuild/openbsd-x64': 0.17.19
- '@esbuild/sunos-x64': 0.17.19
- '@esbuild/win32-arm64': 0.17.19
- '@esbuild/win32-ia32': 0.17.19
- '@esbuild/win32-x64': 0.17.19
-
- /escalade@3.1.1:
- resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
- engines: {node: '>=6'}
+ es-errors@1.3.0: {}
- /escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
- dev: false
+ es-module-lexer@1.7.0: {}
- /escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
- /escape-string-regexp@2.0.0:
- resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
- engines: {node: '>=8'}
- dev: true
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
- /escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
- /escodegen@2.1.0:
- resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
- engines: {node: '>=6.0'}
- hasBin: true
+ esbuild@0.25.10:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.10
+ '@esbuild/android-arm': 0.25.10
+ '@esbuild/android-arm64': 0.25.10
+ '@esbuild/android-x64': 0.25.10
+ '@esbuild/darwin-arm64': 0.25.10
+ '@esbuild/darwin-x64': 0.25.10
+ '@esbuild/freebsd-arm64': 0.25.10
+ '@esbuild/freebsd-x64': 0.25.10
+ '@esbuild/linux-arm': 0.25.10
+ '@esbuild/linux-arm64': 0.25.10
+ '@esbuild/linux-ia32': 0.25.10
+ '@esbuild/linux-loong64': 0.25.10
+ '@esbuild/linux-mips64el': 0.25.10
+ '@esbuild/linux-ppc64': 0.25.10
+ '@esbuild/linux-riscv64': 0.25.10
+ '@esbuild/linux-s390x': 0.25.10
+ '@esbuild/linux-x64': 0.25.10
+ '@esbuild/netbsd-arm64': 0.25.10
+ '@esbuild/netbsd-x64': 0.25.10
+ '@esbuild/openbsd-arm64': 0.25.10
+ '@esbuild/openbsd-x64': 0.25.10
+ '@esbuild/openharmony-arm64': 0.25.10
+ '@esbuild/sunos-x64': 0.25.10
+ '@esbuild/win32-arm64': 0.25.10
+ '@esbuild/win32-ia32': 0.25.10
+ '@esbuild/win32-x64': 0.25.10
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escodegen@2.1.0:
dependencies:
esprima: 4.0.1
estraverse: 5.3.0
esutils: 2.0.3
optionalDependencies:
source-map: 0.6.1
- dev: false
-
- /eslint-config-prettier@9.0.0(eslint@8.56.0):
- resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==}
- hasBin: true
- peerDependencies:
- eslint: '>=7.0.0'
- dependencies:
- eslint: 8.56.0
- dev: false
- /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0):
- resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
- engines: {node: '>=10'}
- peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ eslint-plugin-react-hooks@5.2.0(eslint@9.35.0):
dependencies:
- eslint: 8.56.0
- dev: true
+ eslint: 9.35.0
- /eslint-plugin-react-refresh@0.3.4(eslint@8.56.0):
- resolution: {integrity: sha512-E0ViBglxSQAERBp6eTj5fPgtCRtDonnbCFiVQBhf4Dto2blJRxg1dFUMdMh7N6ljTI4UwPhHwYDQ3Dyo4m6bwA==}
- peerDependencies:
- eslint: '>=7'
+ eslint-plugin-react-refresh@0.4.20(eslint@9.35.0):
dependencies:
- eslint: 8.56.0
- dev: true
+ eslint: 9.35.0
- /eslint-scope@7.2.2:
- resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-scope@8.4.0:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
- /eslint-visitor-keys@3.4.3:
- resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-visitor-keys@3.4.3: {}
- /eslint@8.56.0:
- resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- hasBin: true
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint@9.35.0:
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
- '@eslint-community/regexpp': 4.9.1
- '@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.56.0
- '@humanwhocodes/config-array': 0.11.14
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0)
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.21.0
+ '@eslint/config-helpers': 0.3.1
+ '@eslint/core': 0.15.2
+ '@eslint/eslintrc': 3.3.1
+ '@eslint/js': 9.35.0
+ '@eslint/plugin-kit': 0.3.5
+ '@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
- '@nodelib/fs.walk': 1.2.8
- '@ungap/structured-clone': 1.2.0
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
- cross-spawn: 7.0.3
- debug: 4.3.4
- doctrine: 3.0.0
+ cross-spawn: 7.0.6
+ debug: 4.4.3(supports-color@5.5.0)
escape-string-regexp: 4.0.0
- eslint-scope: 7.2.2
- eslint-visitor-keys: 3.4.3
- espree: 9.6.1
- esquery: 1.5.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
- file-entry-cache: 6.0.1
+ file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
- globals: 13.23.0
- graphemer: 1.4.0
- ignore: 5.2.4
+ ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
- is-path-inside: 3.0.3
- js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
- optionator: 0.9.3
- strip-ansi: 6.0.1
- text-table: 0.2.0
+ optionator: 0.9.4
transitivePeerDependencies:
- supports-color
- /espree@9.6.1:
- resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ espree@10.4.0:
dependencies:
- acorn: 8.10.0
- acorn-jsx: 5.3.2(acorn@8.10.0)
- eslint-visitor-keys: 3.4.3
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 4.2.1
- /esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
- hasBin: true
+ esprima@4.0.1: {}
- /esquery@1.5.0:
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
- engines: {node: '>=0.10'}
+ esquery@1.6.0:
dependencies:
estraverse: 5.3.0
- /esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
+ esrecurse@4.3.0:
dependencies:
estraverse: 5.3.0
- /estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
-
- /estree-walker@1.0.1:
- resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
- dev: false
+ estraverse@5.3.0: {}
- /estree-walker@2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- dev: false
+ estree-walker@1.0.1: {}
- /esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
+ estree-walker@2.0.2: {}
- /etag@1.8.1:
- resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
- engines: {node: '>= 0.6'}
- dev: false
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
- /event-target-shim@5.0.1:
- resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
- engines: {node: '>=6'}
- dev: false
+ esutils@2.0.3: {}
- /eventemitter3@3.1.2:
- resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==}
- dev: false
+ etag@1.8.1: {}
- /eventemitter3@4.0.7:
- resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
- dev: false
+ event-target-shim@5.0.1: {}
- /execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
+ execa@5.1.1:
dependencies:
- cross-spawn: 7.0.3
+ cross-spawn: 7.0.6
get-stream: 6.0.1
human-signals: 2.1.0
is-stream: 2.0.1
@@ -5196,54 +7558,37 @@ packages:
onetime: 5.1.2
signal-exit: 3.0.7
strip-final-newline: 2.0.0
- dev: true
- /exit@0.1.2:
- resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
- engines: {node: '>= 0.8.0'}
- dev: true
-
- /expect@29.7.0:
- resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/expect-utils': 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- dev: true
+ expect-type@1.2.2: {}
- /express@4.18.2:
- resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
- engines: {node: '>= 0.10.0'}
+ express@4.21.2:
dependencies:
accepts: 1.3.8
array-flatten: 1.1.1
- body-parser: 1.20.1
+ body-parser: 1.20.3
content-disposition: 0.5.4
content-type: 1.0.5
- cookie: 0.5.0
+ cookie: 0.7.1
cookie-signature: 1.0.6
debug: 2.6.9
depd: 2.0.0
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
- finalhandler: 1.2.0
+ finalhandler: 1.3.1
fresh: 0.5.2
http-errors: 2.0.0
- merge-descriptors: 1.0.1
+ merge-descriptors: 1.0.3
methods: 1.1.2
on-finished: 2.4.1
parseurl: 1.3.3
- path-to-regexp: 0.1.7
+ path-to-regexp: 0.1.12
proxy-addr: 2.0.7
- qs: 6.11.0
+ qs: 6.13.0
range-parser: 1.2.1
safe-buffer: 5.2.1
- send: 0.18.0
- serve-static: 1.15.0
+ send: 0.19.0
+ serve-static: 1.16.2
setprototypeof: 1.2.0
statuses: 2.0.1
type-is: 1.6.18
@@ -5251,122 +7596,77 @@ packages:
vary: 1.1.2
transitivePeerDependencies:
- supports-color
- dev: false
- /extend@3.0.2:
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- dev: false
+ extend@3.0.2: {}
- /extract-zip@2.0.1:
- resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
- engines: {node: '>= 10.17.0'}
- hasBin: true
+ extract-zip@2.0.1:
dependencies:
- debug: 4.3.4
+ debug: 4.4.3(supports-color@5.5.0)
get-stream: 5.2.0
yauzl: 2.10.0
optionalDependencies:
- '@types/yauzl': 2.10.2
+ '@types/yauzl': 2.10.3
transitivePeerDependencies:
- supports-color
- dev: false
-
- /fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- /fast-diff@1.3.0:
- resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
- dev: true
+ fast-copy@3.0.2: {}
- /fast-fifo@1.3.2:
- resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
- dev: false
+ fast-deep-equal@3.1.3: {}
- /fast-glob@3.3.0:
- resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==}
- engines: {node: '>=8.6.0'}
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.5
- dev: false
+ fast-fifo@1.3.2: {}
- /fast-glob@3.3.1:
- resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
- engines: {node: '>=8.6.0'}
+ fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.5
+ micromatch: 4.0.8
- /fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ fast-json-stable-stringify@2.1.0: {}
- /fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ fast-levenshtein@2.0.6: {}
- /fast-redact@3.2.0:
- resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==}
- engines: {node: '>=6'}
- dev: false
+ fast-redact@3.5.0: {}
- /fast-redact@3.3.0:
- resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==}
- engines: {node: '>=6'}
- dev: true
+ fast-safe-stringify@2.1.1: {}
- /fast-safe-stringify@2.1.1:
- resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+ fast-text-encoding@1.0.6: {}
- /fast-text-encoding@1.0.6:
- resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==}
- dev: false
+ fast-uri@3.1.0: {}
- /fastq@1.15.0:
- resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ fast-xml-parser@4.5.3:
dependencies:
- reusify: 1.0.4
+ strnum: 1.1.2
- /fb-watchman@2.0.2:
- resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ fastq@1.19.1:
dependencies:
- bser: 2.1.1
- dev: true
+ reusify: 1.1.0
- /fd-slicer@1.1.0:
- resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ fd-slicer@1.1.0:
dependencies:
pend: 1.2.0
- dev: false
- /file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ file-entry-cache@8.0.0:
dependencies:
- flat-cache: 3.1.1
+ flat-cache: 4.0.1
- /filelist@1.0.4:
- resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+ filelist@1.0.4:
dependencies:
minimatch: 5.1.6
- dev: false
- /fill-range@7.0.1:
- resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
- engines: {node: '>=8'}
+ fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
- /finalhandler@1.2.0:
- resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
- engines: {node: '>= 0.8'}
+ finalhandler@1.3.1:
dependencies:
debug: 2.6.9
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
parseurl: 1.3.3
@@ -5374,147 +7674,80 @@ packages:
unpipe: 1.0.0
transitivePeerDependencies:
- supports-color
- dev: false
- /find-root@1.1.0:
- resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
- dev: false
+ find-root@1.1.0: {}
- /find-up@4.1.0:
- resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
- engines: {node: '>=8'}
+ find-up@4.1.0:
dependencies:
locate-path: 5.0.0
path-exists: 4.0.0
- /find-up@5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
+ find-up@5.0.0:
dependencies:
locate-path: 6.0.0
path-exists: 4.0.0
- /flat-cache@3.1.1:
- resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==}
- engines: {node: '>=12.0.0'}
- dependencies:
- flatted: 3.2.9
- keyv: 4.5.4
- rimraf: 3.0.2
-
- /flatted@3.2.9:
- resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
-
- /follow-redirects@1.15.3:
- resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
- engines: {node: '>=4.0'}
- peerDependencies:
- debug: '*'
- peerDependenciesMeta:
- debug:
- optional: true
- dev: false
-
- /for-each@0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ flat-cache@4.0.1:
dependencies:
- is-callable: 1.2.7
- dev: false
+ flatted: 3.3.3
+ keyv: 4.5.4
- /foreground-child@2.0.0:
- resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==}
- engines: {node: '>=8.0.0'}
+ flatted@3.3.3: {}
+
+ for-each@0.3.5:
dependencies:
- cross-spawn: 7.0.3
- signal-exit: 3.0.7
- dev: true
+ is-callable: 1.2.7
- /form-data@2.5.1:
- resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==}
- engines: {node: '>= 0.12'}
+ foreground-child@3.3.1:
dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
- dev: false
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
- /form-data@4.0.0:
- resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
- engines: {node: '>= 6'}
+ form-data@2.5.5:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
mime-types: 2.1.35
+ safe-buffer: 5.2.1
- /forwarded@0.2.0:
- resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
- engines: {node: '>= 0.6'}
- dev: false
-
- /fresh@0.5.2:
- resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
- engines: {node: '>= 0.6'}
- dev: false
+ forwarded@0.2.0: {}
- /fs-extra@10.1.0:
- resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
- engines: {node: '>=12'}
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.0
- dev: true
+ fresh@0.5.2: {}
- /fs-extra@8.1.0:
- resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
- engines: {node: '>=6 <7 || >=8'}
+ fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
- jsonfile: 4.0.0
- universalify: 0.1.2
- dev: false
+ jsonfile: 6.2.0
+ universalify: 2.0.1
- /fs-extra@9.1.0:
- resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
- engines: {node: '>=10'}
+ fs-extra@9.1.0:
dependencies:
at-least-node: 1.0.0
graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.0
- dev: false
+ jsonfile: 6.2.0
+ universalify: 2.0.1
- /fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ fs.realpath@1.0.0: {}
- /fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
- requiresBuild: true
+ fsevents@2.3.3:
optional: true
- /function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- dev: false
+ function-bind@1.1.2: {}
- /function.prototype.name@1.1.6:
- resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
- engines: {node: '>= 0.4'}
+ function.prototype.name@1.1.8:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.8
+ call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.22.2
functions-have-names: 1.2.3
- dev: false
+ hasown: 2.0.2
+ is-callable: 1.2.7
- /functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: false
+ functions-have-names@1.2.3: {}
- /gaxios@4.3.3:
- resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==}
- engines: {node: '>=10'}
+ gaxios@4.3.3:
dependencies:
abort-controller: 3.0.0
extend: 3.0.2
@@ -5524,106 +7757,110 @@ packages:
transitivePeerDependencies:
- encoding
- supports-color
- dev: false
- /gcp-metadata@4.3.1:
- resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==}
- engines: {node: '>=10'}
+ gaxios@6.7.1:
+ dependencies:
+ extend: 3.0.2
+ https-proxy-agent: 7.0.6
+ is-stream: 2.0.1
+ node-fetch: 2.7.0
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ gcp-metadata@4.3.1:
dependencies:
gaxios: 4.3.3
json-bigint: 1.0.0
transitivePeerDependencies:
- encoding
- supports-color
- dev: false
- /gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
+ gcp-metadata@6.1.1:
+ dependencies:
+ gaxios: 6.7.1
+ google-logging-utils: 0.0.2
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
- /get-caller-file@2.0.5:
- resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
- engines: {node: 6.* || 8.* || >= 10.*}
+ gensync@1.0.0-beta.2: {}
- /get-func-name@2.0.0:
- resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==}
- dev: true
+ get-caller-file@2.0.5: {}
- /get-intrinsic@1.2.1:
- resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ get-intrinsic@1.3.0:
dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
function-bind: 1.1.2
- has: 1.0.4
- has-proto: 1.0.1
- has-symbols: 1.0.3
- dev: false
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
- /get-own-enumerable-property-symbols@3.0.2:
- resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
- dev: false
+ get-own-enumerable-property-symbols@3.0.2: {}
- /get-package-type@0.1.0:
- resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
- engines: {node: '>=8.0.0'}
- dev: true
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
- /get-stream@5.2.0:
- resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
- engines: {node: '>=8'}
+ get-stream@5.2.0:
dependencies:
- pump: 3.0.0
- dev: false
+ pump: 3.0.3
- /get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
- engines: {node: '>=10'}
- dev: true
+ get-stream@6.0.1: {}
- /get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
+ get-symbol-description@1.1.0:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- dev: false
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
- /get-uri@6.0.2:
- resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==}
- engines: {node: '>= 14'}
+ get-tsconfig@4.10.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ get-uri@6.0.5:
dependencies:
- basic-ftp: 5.0.3
- data-uri-to-buffer: 6.0.1
- debug: 4.3.4
- fs-extra: 8.1.0
+ basic-ftp: 5.0.5
+ data-uri-to-buffer: 6.0.2
+ debug: 4.4.3(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
- dev: false
- /glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
+ glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
- /glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
+ glob-parent@6.0.2:
dependencies:
is-glob: 4.0.3
- /glob@7.1.6:
- resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
+ glob@10.4.5:
dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- dev: true
+ foreground-child: 3.3.1
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
- /glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ glob@11.0.3:
+ dependencies:
+ foreground-child: 3.3.1
+ jackspeak: 4.1.1
+ minimatch: 10.0.3
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 2.0.0
+
+ glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
@@ -5632,37 +7869,14 @@ packages:
once: 1.4.0
path-is-absolute: 1.0.1
- /globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
-
- /globals@13.23.0:
- resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==}
- engines: {node: '>=8'}
- dependencies:
- type-fest: 0.20.2
+ globals@14.0.0: {}
- /globalthis@1.0.3:
- resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
- engines: {node: '>= 0.4'}
+ globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
- dev: false
-
- /globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
- dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.1
- ignore: 5.2.4
- merge2: 1.4.1
- slash: 3.0.0
+ gopd: 1.2.0
- /google-auth-library@7.14.1:
- resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==}
- engines: {node: '>=10'}
+ google-auth-library@7.14.1:
dependencies:
arrify: 2.0.1
base64-js: 1.5.1
@@ -5676,54 +7890,50 @@ packages:
transitivePeerDependencies:
- encoding
- supports-color
- dev: false
- /google-gax@2.30.5:
- resolution: {integrity: sha512-Jey13YrAN2hfpozHzbtrwEfEHdStJh1GwaQ2+Akh1k0Tv/EuNVSuBtHZoKSBm5wBMvNsxTsEIZ/152NrYyZgxQ==}
- engines: {node: '>=10'}
- hasBin: true
+ google-auth-library@9.15.1:
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 6.7.1
+ gcp-metadata: 6.1.1
+ gtoken: 7.1.0
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ google-gax@4.6.1:
dependencies:
- '@grpc/grpc-js': 1.6.12
- '@grpc/proto-loader': 0.6.13
+ '@grpc/grpc-js': 1.14.0
+ '@grpc/proto-loader': 0.7.15
'@types/long': 4.0.2
abort-controller: 3.0.0
- duplexify: 4.1.2
- fast-text-encoding: 1.0.6
- google-auth-library: 7.14.1
- is-stream-ended: 0.1.4
+ duplexify: 4.1.3
+ google-auth-library: 9.15.1
node-fetch: 2.7.0
object-hash: 3.0.0
- proto3-json-serializer: 0.1.9
- protobufjs: 6.11.3
- retry-request: 4.2.2
+ proto3-json-serializer: 2.0.2
+ protobufjs: 7.5.4
+ retry-request: 7.0.2
+ uuid: 9.0.1
transitivePeerDependencies:
- encoding
- supports-color
- dev: false
- /google-p12-pem@3.1.4:
- resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==}
- engines: {node: '>=10'}
- hasBin: true
+ google-logging-utils@0.0.2: {}
+
+ google-p12-pem@3.1.4:
dependencies:
node-forge: 1.3.1
- dev: false
- /gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
- dependencies:
- get-intrinsic: 1.2.1
- dev: false
+ gopd@1.2.0: {}
- /graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ graceful-fs@4.2.11: {}
- /graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ graphemer@1.4.0: {}
- /gtoken@5.3.2:
- resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==}
- engines: {node: '>=10'}
+ gtoken@5.3.2:
dependencies:
gaxios: 4.3.3
google-p12-pem: 3.1.4
@@ -5731,1903 +7941,871 @@ packages:
transitivePeerDependencies:
- encoding
- supports-color
- dev: false
- /has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- dev: false
+ gtoken@7.1.0:
+ dependencies:
+ gaxios: 6.7.1
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ has-bigints@1.1.0: {}
- /has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
+ has-flag@3.0.0: {}
- /has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
+ has-flag@4.0.0: {}
- /has-property-descriptors@1.0.0:
- resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+ has-property-descriptors@1.0.2:
dependencies:
- get-intrinsic: 1.2.1
- dev: false
+ es-define-property: 1.0.1
- /has-proto@1.0.1:
- resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
- engines: {node: '>= 0.4'}
- dev: false
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
- /has-symbols@1.0.3:
- resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
- engines: {node: '>= 0.4'}
- dev: false
+ has-symbols@1.1.0: {}
- /has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
+ has-tostringtag@1.0.2:
dependencies:
- has-symbols: 1.0.3
- dev: false
+ has-symbols: 1.1.0
- /has@1.0.4:
- resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
- engines: {node: '>= 0.4.0'}
+ hash-stream-validation@0.2.4: {}
- /hash-stream-validation@0.2.4:
- resolution: {integrity: sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==}
- dev: false
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
- /hoist-non-react-statics@3.3.2:
- resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ help-me@5.0.0: {}
+
+ hoist-non-react-statics@3.3.2:
dependencies:
react-is: 16.13.1
- dev: false
- /hosted-git-info@2.8.9:
- resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
- dev: false
+ hosted-git-info@2.8.9: {}
- /html-escaper@2.0.2:
- resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
- dev: true
+ html-encoding-sniffer@4.0.0:
+ dependencies:
+ whatwg-encoding: 3.1.1
- /html-tags@3.3.1:
- resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
- engines: {node: '>=8'}
- dev: false
+ html-entities@2.6.0: {}
- /http-errors@2.0.0:
- resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
- engines: {node: '>= 0.8'}
+ html-escaper@2.0.2: {}
+
+ html-tags@3.3.1: {}
+
+ http-errors@2.0.0:
dependencies:
depd: 2.0.0
inherits: 2.0.4
setprototypeof: 1.2.0
statuses: 2.0.1
toidentifier: 1.0.1
- dev: false
- /http-proxy-agent@5.0.0:
- resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
- engines: {node: '>= 6'}
+ http-proxy-agent@5.0.0:
dependencies:
'@tootallnate/once': 2.0.0
agent-base: 6.0.2
- debug: 4.3.4
+ debug: 4.4.3(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
- dev: false
- /http-proxy-agent@7.0.0:
- resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==}
- engines: {node: '>= 14'}
+ http-proxy-agent@7.0.2:
dependencies:
- agent-base: 7.1.0
- debug: 4.3.4
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
- dev: false
- /https-proxy-agent@5.0.1:
- resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
- engines: {node: '>= 6'}
+ https-proxy-agent@5.0.1:
dependencies:
agent-base: 6.0.2
- debug: 4.3.4
+ debug: 4.4.3(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
- dev: false
- /https-proxy-agent@7.0.2:
- resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==}
- engines: {node: '>= 14'}
+ https-proxy-agent@7.0.6:
dependencies:
- agent-base: 7.1.0
- debug: 4.3.4
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
- dev: false
- /human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
- dev: true
+ human-signals@2.1.0: {}
- /husky@8.0.3:
- resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
- engines: {node: '>=14'}
- hasBin: true
- dev: true
+ husky@9.1.7: {}
- /iconv-lite@0.4.24:
- resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
- engines: {node: '>=0.10.0'}
+ iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
- dev: false
-
- /idb@7.1.1:
- resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
- dev: false
-
- /ieee754@1.2.1:
- resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
- dev: false
-
- /ignore-by-default@1.0.1:
- resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
- dev: true
-
- /ignore@5.2.4:
- resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
- engines: {node: '>= 4'}
-
- /import-fresh@3.3.0:
- resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
- engines: {node: '>=6'}
- dependencies:
- parent-module: 1.0.1
- resolve-from: 4.0.0
-
- /import-local@3.1.0:
- resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
- engines: {node: '>=8'}
- hasBin: true
- dependencies:
- pkg-dir: 4.2.0
- resolve-cwd: 3.0.0
- dev: true
-
- /imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
-
- /individual@3.0.0:
- resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==}
- dev: true
-
- /inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
-
- /inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- /internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.4
- side-channel: 1.0.4
- dev: false
-
- /ip@1.1.8:
- resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==}
- dev: false
-
- /ip@2.0.0:
- resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
- dev: false
-
- /ipaddr.js@1.9.1:
- resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
- engines: {node: '>= 0.10'}
- dev: false
-
- /is-arguments@1.1.1:
- resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: false
-
- /is-array-buffer@3.0.2:
- resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
- dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.12
- dev: false
- /is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-
- /is-arrayish@0.3.2:
- resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
- dev: false
-
- /is-bigint@1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
- dependencies:
- has-bigints: 1.0.2
- dev: false
-
- /is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
- dependencies:
- binary-extensions: 2.2.0
- dev: true
-
- /is-boolean-object@1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: false
-
- /is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
- dev: false
-
- /is-core-module@2.12.1:
- resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
- dependencies:
- has: 1.0.4
- dev: false
-
- /is-core-module@2.13.0:
- resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
- dependencies:
- has: 1.0.4
-
- /is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: false
-
- /is-electron@2.2.2:
- resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==}
- dev: false
-
- /is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- /is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- /is-generator-fn@2.1.0:
- resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
- engines: {node: '>=6'}
- dev: true
-
- /is-generator-function@1.0.10:
- resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
- engines: {node: '>= 0.4'}
+ iconv-lite@0.6.3:
dependencies:
- has-tostringtag: 1.0.0
- dev: false
-
- /is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
- dependencies:
- is-extglob: 2.1.1
-
- /is-html@2.0.0:
- resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==}
- engines: {node: '>=8'}
- dependencies:
- html-tags: 3.3.1
- dev: false
-
- /is-module@1.0.0:
- resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
- dev: false
-
- /is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
- dev: false
+ safer-buffer: 2.1.2
- /is-number-object@1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
+ iconv-lite@0.7.0:
dependencies:
- has-tostringtag: 1.0.0
- dev: false
-
- /is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
- /is-obj@1.0.1:
- resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
- engines: {node: '>=0.10.0'}
- dev: false
-
- /is-obj@2.0.0:
- resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
- engines: {node: '>=8'}
- dev: false
-
- /is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
+ safer-buffer: 2.1.2
- /is-plain-obj@2.1.0:
- resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
- engines: {node: '>=8'}
- dev: true
+ idb@7.1.1: {}
- /is-regex@1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- has-tostringtag: 1.0.0
- dev: false
+ ignore-by-default@1.0.1: {}
- /is-regexp@1.0.0:
- resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
- engines: {node: '>=0.10.0'}
- dev: false
+ ignore@5.3.2: {}
- /is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+ ignore@7.0.5: {}
+
+ import-fresh@3.3.1:
dependencies:
- call-bind: 1.0.2
- dev: false
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
- /is-stream-ended@0.1.4:
- resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==}
- dev: false
+ imurmurhash@0.1.4: {}
- /is-stream@1.1.0:
- resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
- engines: {node: '>=0.10.0'}
- dev: false
+ indent-string@4.0.0: {}
- /is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
+ individual@3.0.0: {}
- /is-string@1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
+ inflight@1.0.6:
dependencies:
- has-tostringtag: 1.0.0
- dev: false
+ once: 1.4.0
+ wrappy: 1.0.2
- /is-symbol@1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: false
+ inherits@2.0.4: {}
- /is-typed-array@1.1.12:
- resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
- engines: {node: '>= 0.4'}
+ internal-slot@1.1.0:
dependencies:
- which-typed-array: 1.1.11
- dev: false
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
- /is-typedarray@1.0.0:
- resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
- dev: false
+ ip-address@10.0.1: {}
+
+ ipaddr.js@1.9.1: {}
- /is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ is-arguments@1.2.0:
dependencies:
- call-bind: 1.0.2
- dev: false
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- /is-windows@1.0.2:
- resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
- engines: {node: '>=0.10.0'}
- dev: true
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
- /isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- dev: false
+ is-arrayish@0.2.1: {}
- /isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
- /istanbul-lib-coverage@3.2.0:
- resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
- engines: {node: '>=8'}
- dev: true
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
- /istanbul-lib-instrument@5.2.1:
- resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
- engines: {node: '>=8'}
+ is-binary-path@2.1.0:
dependencies:
- '@babel/core': 7.23.2
- '@babel/parser': 7.23.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.0
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: true
+ binary-extensions: 2.3.0
- /istanbul-lib-instrument@6.0.1:
- resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==}
- engines: {node: '>=10'}
+ is-boolean-object@1.2.2:
dependencies:
- '@babel/core': 7.23.2
- '@babel/parser': 7.23.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.0
- semver: 7.5.4
- transitivePeerDependencies:
- - supports-color
- dev: true
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- /istanbul-lib-report@3.0.0:
- resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
- engines: {node: '>=8'}
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
dependencies:
- istanbul-lib-coverage: 3.2.0
- make-dir: 3.1.0
- supports-color: 7.2.0
- dev: true
+ hasown: 2.0.2
- /istanbul-lib-report@3.0.1:
- resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
- engines: {node: '>=10'}
+ is-data-view@1.0.2:
dependencies:
- istanbul-lib-coverage: 3.2.0
- make-dir: 4.0.0
- supports-color: 7.2.0
- dev: true
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
- /istanbul-lib-source-maps@4.0.1:
- resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
- engines: {node: '>=10'}
+ is-date-object@1.1.0:
dependencies:
- debug: 4.3.4
- istanbul-lib-coverage: 3.2.0
- source-map: 0.6.1
- transitivePeerDependencies:
- - supports-color
- dev: true
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- /istanbul-reports@3.1.5:
- resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
- engines: {node: '>=8'}
+ is-docker@2.2.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.0
- dev: true
+ call-bound: 1.0.4
- /istanbul-reports@3.1.6:
- resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==}
- engines: {node: '>=8'}
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-generator-function@1.1.0:
dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.1
- dev: true
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
- /jake@10.8.7:
- resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
- engines: {node: '>=10'}
- hasBin: true
+ is-glob@4.0.3:
dependencies:
- async: 3.2.4
- chalk: 4.1.2
- filelist: 1.0.4
- minimatch: 3.1.2
- dev: false
+ is-extglob: 2.1.1
- /jest-changed-files@29.7.0:
- resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-html@2.0.0:
dependencies:
- execa: 5.1.1
- jest-util: 29.7.0
- p-limit: 3.1.0
- dev: true
+ html-tags: 3.3.1
+
+ is-map@2.0.3: {}
+
+ is-module@1.0.0: {}
- /jest-circus@29.7.0:
- resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- chalk: 4.1.2
- co: 4.6.0
- dedent: 1.5.1
- is-generator-fn: 2.1.0
- jest-each: 29.7.0
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- p-limit: 3.1.0
- pretty-format: 29.7.0
- pure-rand: 6.0.4
- slash: 3.0.0
- stack-utils: 2.0.6
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
- dev: true
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- /jest-cli@29.7.0(@types/node@20.1.7):
- resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
+ is-number@7.0.0: {}
+
+ is-obj@1.0.1: {}
+
+ is-obj@2.0.0: {}
+
+ is-plain-obj@2.1.0: {}
+
+ is-potential-custom-element-name@1.0.1: {}
+
+ is-regex@1.2.1:
dependencies:
- '@jest/core': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- chalk: 4.1.2
- create-jest: 29.7.0(@types/node@20.1.7)
- exit: 0.1.2
- import-local: 3.1.0
- jest-config: 29.7.0(@types/node@20.1.7)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- yargs: 17.7.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
- dev: true
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
- /jest-config@29.7.0(@types/node@20.1.7):
- resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@types/node': '*'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- '@types/node':
- optional: true
- ts-node:
- optional: true
+ is-regexp@1.0.0: {}
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
dependencies:
- '@babel/core': 7.23.2
- '@jest/test-sequencer': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- babel-jest: 29.7.0(@babel/core@7.23.2)
- chalk: 4.1.2
- ci-info: 3.9.0
- deepmerge: 4.3.1
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-circus: 29.7.0
- jest-environment-node: 29.7.0
- jest-get-type: 29.6.3
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-runner: 29.7.0
- jest-util: 29.7.0
- jest-validate: 29.7.0
- micromatch: 4.0.5
- parse-json: 5.2.0
- pretty-format: 29.7.0
- slash: 3.0.0
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
- dev: true
+ call-bound: 1.0.4
- /jest-diff@29.7.0:
- resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-stream@2.0.1: {}
+
+ is-string@1.1.1:
dependencies:
- chalk: 4.1.2
- diff-sequences: 29.6.3
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
- dev: true
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
- /jest-docblock@29.7.0:
- resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-symbol@1.1.1:
dependencies:
- detect-newline: 3.1.0
- dev: true
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
- /jest-each@29.7.0:
- resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-typed-array@1.1.15:
dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- jest-get-type: 29.6.3
- jest-util: 29.7.0
- pretty-format: 29.7.0
- dev: true
-
- /jest-environment-node@29.7.0:
- resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- jest-mock: 29.7.0
- jest-util: 29.7.0
- dev: true
-
- /jest-get-type@29.6.3:
- resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dev: true
-
- /jest-haste-map@29.7.0:
- resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/types': 29.6.3
- '@types/graceful-fs': 4.1.8
- '@types/node': 20.1.7
- anymatch: 3.1.3
- fb-watchman: 2.0.2
- graceful-fs: 4.2.11
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- jest-worker: 29.7.0
- micromatch: 4.0.5
- walker: 1.0.8
- optionalDependencies:
- fsevents: 2.3.3
- dev: true
+ which-typed-array: 1.1.19
+
+ is-typedarray@1.0.0: {}
- /jest-leak-detector@29.7.0:
- resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
dependencies:
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
- dev: true
+ call-bound: 1.0.4
- /jest-matcher-utils@29.7.0:
- resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ is-weakset@2.0.4:
dependencies:
- chalk: 4.1.2
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
- dev: true
-
- /jest-message-util@29.7.0:
- resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@babel/code-frame': 7.22.13
- '@jest/types': 29.6.3
- '@types/stack-utils': 2.0.2
- chalk: 4.1.2
- graceful-fs: 4.2.11
- micromatch: 4.0.5
- pretty-format: 29.7.0
- slash: 3.0.0
- stack-utils: 2.0.6
- dev: true
-
- /jest-mock@29.7.0:
- resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- jest-util: 29.7.0
- dev: true
-
- /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
- resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
- engines: {node: '>=6'}
- peerDependencies:
- jest-resolve: '*'
- peerDependenciesMeta:
- jest-resolve:
- optional: true
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-windows@1.0.2: {}
+
+ is-wsl@2.2.0:
dependencies:
- jest-resolve: 29.7.0
- dev: true
+ is-docker: 2.2.1
- /jest-regex-util@29.6.3:
- resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dev: true
+ isarray@2.0.5: {}
- /jest-resolve-dependencies@29.7.0:
- resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ isexe@2.0.0: {}
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-report@3.0.1:
dependencies:
- jest-regex-util: 29.6.3
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
- dev: true
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
- /jest-resolve@29.7.0:
- resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ istanbul-lib-source-maps@5.0.6:
dependencies:
- chalk: 4.1.2
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- resolve: 1.22.8
- resolve.exports: 2.0.2
- slash: 3.0.0
- dev: true
-
- /jest-runner@29.7.0:
- resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/console': 29.7.0
- '@jest/environment': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- chalk: 4.1.2
- emittery: 0.13.1
- graceful-fs: 4.2.11
- jest-docblock: 29.7.0
- jest-environment-node: 29.7.0
- jest-haste-map: 29.7.0
- jest-leak-detector: 29.7.0
- jest-message-util: 29.7.0
- jest-resolve: 29.7.0
- jest-runtime: 29.7.0
- jest-util: 29.7.0
- jest-watcher: 29.7.0
- jest-worker: 29.7.0
- p-limit: 3.1.0
- source-map-support: 0.5.13
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /jest-runtime@29.7.0:
- resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/globals': 29.7.0
- '@jest/source-map': 29.6.3
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- chalk: 4.1.2
- cjs-module-lexer: 1.2.3
- collect-v8-coverage: 1.0.2
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
- strip-bom: 4.0.0
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /jest-snapshot@29.7.0:
- resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@babel/core': 7.23.2
- '@babel/generator': 7.23.0
- '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2)
- '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2)
- '@babel/types': 7.23.0
- '@jest/expect-utils': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2)
- chalk: 4.1.2
- expect: 29.7.0
- graceful-fs: 4.2.11
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- natural-compare: 1.4.0
- pretty-format: 29.7.0
- semver: 7.5.4
+ '@jridgewell/trace-mapping': 0.3.31
+ debug: 4.4.3(supports-color@5.5.0)
+ istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
- dev: true
- /jest-util@29.7.0:
- resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ istanbul-reports@3.2.0:
dependencies:
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- chalk: 4.1.2
- ci-info: 3.9.0
- graceful-fs: 4.2.11
- picomatch: 2.3.1
- dev: true
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
- /jest-validate@29.7.0:
- resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jackspeak@3.4.3:
dependencies:
- '@jest/types': 29.6.3
- camelcase: 6.3.0
- chalk: 4.1.2
- jest-get-type: 29.6.3
- leven: 3.1.0
- pretty-format: 29.7.0
- dev: true
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
- /jest-watcher@29.7.0:
- resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jackspeak@4.1.1:
dependencies:
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 20.1.7
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- emittery: 0.13.1
- jest-util: 29.7.0
- string-length: 4.0.2
- dev: true
+ '@isaacs/cliui': 8.0.2
- /jest-worker@26.6.2:
- resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
- engines: {node: '>= 10.13.0'}
+ jake@10.9.4:
dependencies:
- '@types/node': 20.8.7
- merge-stream: 2.0.0
- supports-color: 7.2.0
- dev: false
+ async: 3.2.6
+ filelist: 1.0.4
+ picocolors: 1.1.1
- /jest-worker@29.7.0:
- resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ jest-worker@26.6.2:
dependencies:
- '@types/node': 20.1.7
- jest-util: 29.7.0
+ '@types/node': 24.5.2
merge-stream: 2.0.0
- supports-color: 8.1.1
- dev: true
-
- /jest@29.7.0(@types/node@20.1.7):
- resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
- dependencies:
- '@jest/core': 29.7.0
- '@jest/types': 29.6.3
- import-local: 3.1.0
- jest-cli: 29.7.0(@types/node@20.1.7)
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
- dev: true
-
- /joycon@3.1.1:
- resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
- engines: {node: '>=10'}
+ supports-color: 7.2.0
- /js-string-escape@1.0.1:
- resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==}
- engines: {node: '>= 0.8'}
- dev: true
+ joycon@3.1.1: {}
- /js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-tokens@4.0.0: {}
- /js-yaml@3.14.1:
- resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
- hasBin: true
- dependencies:
- argparse: 1.0.10
- esprima: 4.0.1
- dev: true
+ js-tokens@9.0.1: {}
- /js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
- hasBin: true
+ js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
- /jsesc@0.5.0:
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
- hasBin: true
- dev: false
-
- /jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
+ jsdom@26.1.0:
+ dependencies:
+ cssstyle: 4.6.0
+ data-urls: 5.0.0
+ decimal.js: 10.6.0
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.22
+ parse5: 7.3.0
+ rrweb-cssom: 0.8.0
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 5.1.2
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
+ ws: 8.18.3
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
- /json-bigint@1.0.0:
- resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
- dependencies:
- bignumber.js: 9.1.1
- dev: false
+ jsesc@3.0.2: {}
- /json-buffer@3.0.1:
- resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ jsesc@3.1.0: {}
- /json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ json-bigint@1.0.0:
+ dependencies:
+ bignumber.js: 9.3.1
- /json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ json-buffer@3.0.1: {}
- /json-schema-traverse@1.0.0:
- resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
- dev: false
+ json-parse-even-better-errors@2.3.1: {}
- /json-schema@0.4.0:
- resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
- dev: false
+ json-schema-traverse@0.4.1: {}
- /json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ json-schema-traverse@1.0.0: {}
- /json-stringify-safe@5.0.1:
- resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
- dev: true
+ json-schema@0.4.0: {}
- /json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
+ json-stable-stringify-without-jsonify@1.0.1: {}
- /jsonc-parser@3.2.0:
- resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
- dev: true
+ json-stringify-safe@5.0.1: {}
- /jsonfile@4.0.0:
- resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
- optionalDependencies:
- graceful-fs: 4.2.11
- dev: false
+ json5@2.2.3: {}
- /jsonfile@6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ jsonfile@6.2.0:
dependencies:
- universalify: 2.0.0
+ universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
- /jsonpointer@5.0.1:
- resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
- engines: {node: '>=0.10.0'}
- dev: false
+ jsonpointer@5.0.1: {}
- /jwa@2.0.0:
- resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==}
+ jwa@2.0.1:
dependencies:
buffer-equal-constant-time: 1.0.1
ecdsa-sig-formatter: 1.0.11
safe-buffer: 5.2.1
- dev: false
- /jws@4.0.0:
- resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
+ jws@4.0.0:
dependencies:
- jwa: 2.0.0
+ jwa: 2.0.1
safe-buffer: 5.2.1
- dev: false
- /keyv@4.5.4:
- resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
- /kleur@3.0.3:
- resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
- engines: {node: '>=6'}
- dev: true
-
- /leven@2.1.0:
- resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==}
- engines: {node: '>=0.10.0'}
-
- /leven@3.1.0:
- resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
- engines: {node: '>=6'}
+ leven@3.1.0: {}
- /levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
+ levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
- /lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
- dev: true
-
- /lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
-
- /load-tsconfig@0.2.5:
- resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dev: true
+ lines-and-columns@1.2.4: {}
- /local-pkg@0.4.3:
- resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
- engines: {node: '>=14'}
- dev: true
-
- /locate-path@5.0.0:
- resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
- engines: {node: '>=8'}
+ locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
- /locate-path@6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
+ locate-path@6.0.0:
dependencies:
p-locate: 5.0.0
- /lodash.camelcase@4.3.0:
- resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
- dev: false
-
- /lodash.clonedeep@4.5.0:
- resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
- dev: true
-
- /lodash.debounce@4.0.8:
- resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
- dev: false
+ lodash.camelcase@4.3.0: {}
- /lodash.memoize@4.1.2:
- resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
- dev: true
+ lodash.clonedeep@4.5.0: {}
- /lodash.merge@4.6.2:
- resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ lodash.debounce@4.0.8: {}
- /lodash.sortby@4.7.0:
- resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
+ lodash.merge@4.6.2: {}
- /lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ lodash.sortby@4.7.0: {}
- /long@4.0.0:
- resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==}
- dev: false
+ lodash@4.17.21: {}
- /long@5.2.3:
- resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
- dev: false
+ long@5.3.2: {}
- /loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
+ loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
- dev: false
- /loupe@2.3.6:
- resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==}
+ loupe@3.2.1: {}
+
+ lower-case@2.0.2:
dependencies:
- get-func-name: 2.0.0
- dev: true
+ tslib: 2.8.1
- /lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ lru-cache@10.4.3: {}
+
+ lru-cache@11.2.1: {}
+
+ lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
- /lru-cache@6.0.0:
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
- engines: {node: '>=10'}
+ lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
- /lru-cache@7.18.3:
- resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
- engines: {node: '>=12'}
- dev: false
+ lru-cache@7.18.3: {}
- /magic-string@0.25.9:
- resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+ lz-string@1.5.0: {}
+
+ magic-string@0.25.9:
dependencies:
sourcemap-codec: 1.4.8
- dev: false
- /magic-string@0.27.0:
- resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
- engines: {node: '>=12'}
+ magic-string@0.30.19:
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
- dev: false
+ '@jridgewell/sourcemap-codec': 1.5.5
- /magic-string@0.30.1:
- resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==}
- engines: {node: '>=12'}
+ magicast@0.3.5:
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
- dev: true
+ '@babel/parser': 7.28.4
+ '@babel/types': 7.28.4
+ source-map-js: 1.2.1
- /make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
+ make-dir@3.1.0:
dependencies:
semver: 6.3.1
- /make-dir@4.0.0:
- resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
- engines: {node: '>=10'}
- dependencies:
- semver: 7.5.4
- dev: true
-
- /make-error@1.3.6:
- resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
- dev: true
-
- /makeerror@1.0.12:
- resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ make-dir@4.0.0:
dependencies:
- tmpl: 1.0.5
- dev: true
+ semver: 7.7.2
- /map-age-cleaner@0.1.3:
- resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
- engines: {node: '>=6'}
+ map-age-cleaner@0.1.3:
dependencies:
p-defer: 1.0.0
- dev: true
-
- /md5-hex@3.0.1:
- resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==}
- engines: {node: '>=8'}
- dependencies:
- blueimp-md5: 2.19.0
- dev: true
- /media-typer@0.3.0:
- resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
- engines: {node: '>= 0.6'}
- dev: false
+ math-intrinsics@1.1.0: {}
- /mem@8.1.1:
- resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==}
- engines: {node: '>=10'}
+ media-typer@0.3.0: {}
+
+ mem@8.1.1:
dependencies:
map-age-cleaner: 0.1.3
mimic-fn: 3.1.0
- dev: true
- /merge-descriptors@1.0.1:
- resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
- dev: false
+ merge-descriptors@1.0.3: {}
- /merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ merge-stream@2.0.0: {}
- /merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
+ merge2@1.4.1: {}
- /methods@1.1.2:
- resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
- engines: {node: '>= 0.6'}
- dev: false
+ methods@1.1.2: {}
- /micromatch@4.0.5:
- resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
- engines: {node: '>=8.6'}
+ micromatch@4.0.8:
dependencies:
- braces: 3.0.2
+ braces: 3.0.3
picomatch: 2.3.1
- /mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
+ mime-db@1.52.0: {}
- /mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
+ mime-db@1.54.0: {}
+
+ mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
- /mime@1.6.0:
- resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
- engines: {node: '>=4'}
- hasBin: true
- dev: false
+ mime@1.6.0: {}
- /mime@3.0.0:
- resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- dev: false
+ mime@3.0.0: {}
- /mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
- dev: true
+ mimic-fn@2.1.0: {}
- /mimic-fn@3.1.0:
- resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
- engines: {node: '>=8'}
- dev: true
+ mimic-fn@3.1.0: {}
- /minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
- dependencies:
- brace-expansion: 1.1.11
+ min-indent@1.0.1: {}
- /minimatch@5.1.6:
- resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
- engines: {node: '>=10'}
+ minimatch@10.0.3:
dependencies:
- brace-expansion: 2.0.1
- dev: false
-
- /minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ '@isaacs/brace-expansion': 5.0.0
- /mitt@3.0.0:
- resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==}
- dev: false
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
- /mkdirp-classic@0.5.3:
- resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
- dev: false
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.2
- /mlly@1.4.0:
- resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==}
+ minimatch@9.0.5:
dependencies:
- acorn: 8.10.0
- pathe: 1.1.1
- pkg-types: 1.0.3
- ufo: 1.1.2
- dev: true
+ brace-expansion: 2.0.2
- /mri@1.1.4:
- resolution: {integrity: sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==}
- engines: {node: '>=4'}
+ minimist@1.2.8: {}
- /ms@2.0.0:
- resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
- dev: false
+ minipass@7.1.2: {}
- /ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ mitt@3.0.1: {}
- /ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ ms@2.0.0: {}
- /mz@2.7.0:
- resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- dependencies:
- any-promise: 1.3.0
- object-assign: 4.1.1
- thenify-all: 1.6.0
- dev: true
+ ms@2.1.3: {}
- /nanoid@3.3.6:
- resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
+ nanoid@3.3.11: {}
- /natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ natural-compare@1.4.0: {}
- /ndjson@2.0.0:
- resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==}
- engines: {node: '>=10'}
- hasBin: true
+ ndjson@2.0.0:
dependencies:
json-stringify-safe: 5.0.1
minimist: 1.2.8
readable-stream: 3.6.2
split2: 3.2.2
through2: 4.0.2
- dev: true
- /negotiator@0.6.3:
- resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
- engines: {node: '>= 0.6'}
- dev: false
+ negotiator@0.6.3: {}
- /netmask@2.0.2:
- resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
- engines: {node: '>= 0.4.0'}
- dev: false
+ negotiator@0.6.4: {}
- /node-ensure@0.0.0:
- resolution: {integrity: sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==}
- dev: false
+ netmask@2.0.2: {}
- /node-fetch@2.7.0:
- resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
- engines: {node: 4.x || >=6.0.0}
- peerDependencies:
- encoding: ^0.1.0
- peerDependenciesMeta:
- encoding:
- optional: true
+ no-case@3.0.4:
dependencies:
- whatwg-url: 5.0.0
- dev: false
+ lower-case: 2.0.2
+ tslib: 2.8.1
- /node-forge@1.3.1:
- resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
- engines: {node: '>= 6.13.0'}
- dev: false
+ node-ensure@0.0.0: {}
- /node-int64@0.4.0:
- resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
- dev: true
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
- /node-releases@2.0.13:
- resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
+ node-forge@1.3.1: {}
- /nodemon@2.0.22:
- resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==}
- engines: {node: '>=8.10.0'}
- hasBin: true
- requiresBuild: true
+ node-releases@2.0.21: {}
+
+ nodemon@3.1.10:
dependencies:
- chokidar: 3.5.3
- debug: 3.2.7(supports-color@5.5.0)
+ chokidar: 3.6.0
+ debug: 4.4.3(supports-color@5.5.0)
ignore-by-default: 1.0.1
minimatch: 3.1.2
pstree.remy: 1.1.8
- semver: 5.7.2
- simple-update-notifier: 1.1.0
+ semver: 7.7.2
+ simple-update-notifier: 2.0.0
supports-color: 5.5.0
- touch: 3.1.0
+ touch: 3.1.1
undefsafe: 2.0.5
- dev: true
-
- /nopt@1.0.10:
- resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==}
- hasBin: true
- dependencies:
- abbrev: 1.1.1
- dev: true
- /normalize-package-data@2.5.0:
- resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ normalize-package-data@2.5.0:
dependencies:
hosted-git-info: 2.8.9
- resolve: 1.22.8
+ resolve: 1.22.10
semver: 5.7.2
validate-npm-package-license: 3.0.4
- dev: false
- /normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
- dev: true
+ normalize-path@3.0.0: {}
- /npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
+ npm-run-path@4.0.1:
dependencies:
path-key: 3.1.1
- dev: true
- /object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
+ nwsapi@2.2.22: {}
- /object-hash@3.0.0:
- resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
- engines: {node: '>= 6'}
- dev: false
+ object-assign@4.1.1: {}
- /object-inspect@1.13.0:
- resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==}
- dev: false
+ object-hash@3.0.0: {}
- /object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: false
+ object-inspect@1.13.4: {}
- /object.assign@4.1.4:
- resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
- engines: {node: '>= 0.4'}
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.8
+ call-bound: 1.0.4
define-properties: 1.2.1
- has-symbols: 1.0.3
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
object-keys: 1.1.1
- dev: false
- /on-exit-leak-free@0.2.0:
- resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==}
+ on-exit-leak-free@2.1.2: {}
- /on-finished@2.4.1:
- resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
- engines: {node: '>= 0.8'}
+ on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
- dev: false
- /on-headers@1.0.2:
- resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
- engines: {node: '>= 0.8'}
- dev: false
+ on-headers@1.1.0: {}
- /once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ once@1.4.0:
dependencies:
wrappy: 1.0.2
- /onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
+ onetime@5.1.2:
dependencies:
mimic-fn: 2.1.0
- dev: true
- /optionator@0.9.3:
- resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
- engines: {node: '>= 0.8.0'}
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ openai@5.21.0(ws@8.18.3)(zod@3.25.76):
+ optionalDependencies:
+ ws: 8.18.3
+ zod: 3.25.76
+
+ optionator@0.9.4:
dependencies:
- '@aashutoshrathi/word-wrap': 1.2.6
deep-is: 0.1.4
fast-levenshtein: 2.0.6
levn: 0.4.1
prelude-ls: 1.2.1
type-check: 0.4.0
+ word-wrap: 1.2.5
- /p-defer@1.0.0:
- resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
- engines: {node: '>=4'}
- dev: true
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
- /p-finally@1.0.0:
- resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
- engines: {node: '>=4'}
- dev: false
+ p-defer@1.0.0: {}
- /p-limit@2.3.0:
- resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
- engines: {node: '>=6'}
+ p-limit@2.3.0:
dependencies:
p-try: 2.2.0
- /p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
+ p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
- /p-limit@4.0.0:
- resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- yocto-queue: 1.0.0
- dev: true
-
- /p-locate@4.1.0:
- resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
- engines: {node: '>=8'}
+ p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
- /p-locate@5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
+ p-locate@5.0.0:
dependencies:
p-limit: 3.1.0
- /p-map-values@1.0.0:
- resolution: {integrity: sha512-/n8QJM4Os3HLRMSuQWwAocsMExENSQwWTgRi8m3JVEOWQ/4gud14igBcnYvSGQTbiyZbuizxEmwf0w3ITn67gg==}
- engines: {node: '>=14'}
- dev: true
-
- /p-queue@6.6.2:
- resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
- engines: {node: '>=8'}
- dependencies:
- eventemitter3: 4.0.7
- p-timeout: 3.2.0
- dev: false
-
- /p-retry@4.6.2:
- resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
- engines: {node: '>=8'}
- dependencies:
- '@types/retry': 0.12.0
- retry: 0.13.1
- dev: false
-
- /p-timeout@3.2.0:
- resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
- engines: {node: '>=8'}
- dependencies:
- p-finally: 1.0.0
- dev: false
+ p-map-values@1.0.0: {}
- /p-try@2.2.0:
- resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
- engines: {node: '>=6'}
+ p-try@2.2.0: {}
- /pac-proxy-agent@7.0.1:
- resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==}
- engines: {node: '>= 14'}
+ pac-proxy-agent@7.2.0:
dependencies:
'@tootallnate/quickjs-emscripten': 0.23.0
- agent-base: 7.1.0
- debug: 4.3.4
- get-uri: 6.0.2
- http-proxy-agent: 7.0.0
- https-proxy-agent: 7.0.2
- pac-resolver: 7.0.0
- socks-proxy-agent: 8.0.2
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
+ get-uri: 6.0.5
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ pac-resolver: 7.0.1
+ socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
- dev: false
- /pac-resolver@7.0.0:
- resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==}
- engines: {node: '>= 14'}
+ pac-resolver@7.0.1:
dependencies:
degenerator: 5.0.1
- ip: 1.1.8
netmask: 2.0.2
- dev: false
- /parent-module@1.0.1:
- resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
- engines: {node: '>=6'}
+ package-json-from-dist@1.0.1: {}
+
+ parent-module@1.0.1:
dependencies:
callsites: 3.1.0
- /parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
+ parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.22.13
- error-ex: 1.3.2
+ '@babel/code-frame': 7.27.1
+ error-ex: 1.3.4
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
- /parseurl@1.3.3:
- resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
- engines: {node: '>= 0.8'}
- dev: false
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
- /path-exists@4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
+ parseurl@1.3.3: {}
- /path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
+ path-exists@4.0.0: {}
- /path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
+ path-is-absolute@1.0.1: {}
- /path-name@1.0.0:
- resolution: {integrity: sha512-/dcAb5vMXH0f51yvMuSUqFpxUcA8JelbRmE5mW/p4CUJxrNgK24IkstnV7ENtg2IDGBOu6izKTG6eilbnbNKWQ==}
- dev: true
+ path-key@3.1.1: {}
- /path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ path-name@1.0.0: {}
- /path-to-regexp@0.1.7:
- resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
- dev: false
+ path-parse@1.0.7: {}
- /path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ path-scurry@2.0.0:
+ dependencies:
+ lru-cache: 11.2.1
+ minipass: 7.1.2
- /pathe@1.1.1:
- resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==}
- dev: true
+ path-to-regexp@0.1.12: {}
- /pathval@1.1.1:
- resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
- dev: true
+ path-type@4.0.0: {}
- /pdf-parse@1.1.1:
- resolution: {integrity: sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==}
- engines: {node: '>=6.8.1'}
+ pathe@2.0.3: {}
+
+ pathval@2.0.1: {}
+
+ pdf-parse@1.1.1:
dependencies:
- debug: 3.2.7(supports-color@5.5.0)
+ debug: 3.2.7
node-ensure: 0.0.0
transitivePeerDependencies:
- supports-color
- dev: false
- /pend@1.2.0:
- resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
- dev: false
+ pdfjs-dist@5.4.149:
+ optionalDependencies:
+ '@napi-rs/canvas': 0.1.80
- /picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ pend@1.2.0: {}
- /picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
- /pino-abstract-transport@0.5.0:
- resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==}
+ picomatch@4.0.3: {}
+
+ pino-abstract-transport@2.0.0:
dependencies:
- duplexify: 4.1.2
split2: 4.2.0
- /pino-pretty@7.6.1:
- resolution: {integrity: sha512-H7N6ZYkiyrfwBGW9CSjx0uyO9Q2Lyt73881+OTYk8v3TiTdgN92QHrWlEq/LeWw5XtDP64jeSk3mnc6T+xX9/w==}
- hasBin: true
+ pino-pretty@13.1.1:
dependencies:
- args: 5.0.3
colorette: 2.0.20
dateformat: 4.6.3
+ fast-copy: 3.0.2
fast-safe-stringify: 2.1.1
+ help-me: 5.0.0
joycon: 3.1.1
- on-exit-leak-free: 0.2.0
- pino-abstract-transport: 0.5.0
- pump: 3.0.0
- readable-stream: 3.6.2
- rfdc: 1.3.0
- secure-json-parse: 2.7.0
- sonic-boom: 2.8.0
- strip-json-comments: 3.1.1
+ minimist: 1.2.8
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 2.0.0
+ pump: 3.0.3
+ secure-json-parse: 4.0.0
+ sonic-boom: 4.2.0
+ strip-json-comments: 5.0.3
- /pino-std-serializers@4.0.0:
- resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==}
+ pino-std-serializers@7.0.0: {}
- /pino@7.10.0:
- resolution: {integrity: sha512-T6R92jy/APDElEuOk0gqa4nds3ZgqFbHde2X0g8XorlyPlVGlr9T5KQphtp72a3ByKOdZMg/gM/0IprpGQfTWg==}
- hasBin: true
- dependencies:
- atomic-sleep: 1.0.0
- fast-redact: 3.2.0
- on-exit-leak-free: 0.2.0
- pino-abstract-transport: 0.5.0
- pino-std-serializers: 4.0.0
- process-warning: 1.0.0
- quick-format-unescaped: 4.0.4
- real-require: 0.1.0
- safe-stable-stringify: 2.4.3
- sonic-boom: 2.8.0
- thread-stream: 0.15.2
- dev: false
-
- /pino@7.11.0:
- resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==}
- hasBin: true
+ pino@9.10.0:
dependencies:
atomic-sleep: 1.0.0
- fast-redact: 3.3.0
- on-exit-leak-free: 0.2.0
- pino-abstract-transport: 0.5.0
- pino-std-serializers: 4.0.0
- process-warning: 1.0.0
+ fast-redact: 3.5.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 2.0.0
+ pino-std-serializers: 7.0.0
+ process-warning: 5.0.0
quick-format-unescaped: 4.0.4
- real-require: 0.1.0
- safe-stable-stringify: 2.4.3
- sonic-boom: 2.8.0
- thread-stream: 0.15.2
- dev: true
-
- /pirates@4.0.6:
- resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
- engines: {node: '>= 6'}
- dev: true
-
- /pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
- dependencies:
- find-up: 4.1.0
- dev: true
-
- /pkg-types@1.0.3:
- resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
- dependencies:
- jsonc-parser: 3.2.0
- mlly: 1.4.0
- pathe: 1.1.1
- dev: true
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 4.2.0
+ thread-stream: 3.1.0
- /postcss-load-config@3.1.4:
- resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
- engines: {node: '>= 10'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
- dependencies:
- lilconfig: 2.1.0
- yaml: 1.10.2
- dev: true
+ possible-typed-array-names@1.1.0: {}
- /postcss@8.4.25:
- resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==}
- engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.6:
dependencies:
- nanoid: 3.3.6
- picocolors: 1.0.0
- source-map-js: 1.0.2
-
- /prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- /prettier@2.6.2:
- resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==}
- engines: {node: '>=10.13.0'}
- hasBin: true
- dev: true
+ prelude-ls@1.2.1: {}
- /prettier@2.8.8:
- resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
- engines: {node: '>=10.13.0'}
- hasBin: true
- dev: true
+ prettier@3.6.2: {}
- /pretty-bytes@5.6.0:
- resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
- engines: {node: '>=6'}
- dev: false
+ pretty-bytes@5.6.0: {}
- /pretty-bytes@6.1.0:
- resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==}
- engines: {node: ^14.13.1 || >=16.0.0}
- dev: false
+ pretty-bytes@6.1.1: {}
- /pretty-format@27.5.1:
- resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
- engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+ pretty-format@27.5.1:
dependencies:
ansi-regex: 5.0.1
ansi-styles: 5.2.0
react-is: 17.0.2
- dev: true
-
- /pretty-format@29.7.0:
- resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- dependencies:
- '@jest/schemas': 29.6.3
- ansi-styles: 5.2.0
- react-is: 18.2.0
- dev: true
-
- /process-warning@1.0.0:
- resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==}
-
- /process@0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
- dev: false
-
- /progress@2.0.3:
- resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
- engines: {node: '>=0.4.0'}
- dev: false
- /prompts@2.4.2:
- resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
- engines: {node: '>= 6'}
- dependencies:
- kleur: 3.0.3
- sisteransi: 1.0.5
- dev: true
+ process-warning@5.0.0: {}
- /proto3-json-serializer@0.1.9:
- resolution: {integrity: sha512-A60IisqvnuI45qNRygJjrnNjX2TMdQGMY+57tR3nul3ZgO2zXkR9OGR8AXxJhkqx84g0FTnrfi3D5fWMSdANdQ==}
- dependencies:
- protobufjs: 6.11.4
- dev: false
+ process@0.11.10: {}
- /protobufjs@6.11.3:
- resolution: {integrity: sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==}
- hasBin: true
- requiresBuild: true
- dependencies:
- '@protobufjs/aspromise': 1.1.2
- '@protobufjs/base64': 1.1.2
- '@protobufjs/codegen': 2.0.4
- '@protobufjs/eventemitter': 1.1.0
- '@protobufjs/fetch': 1.1.0
- '@protobufjs/float': 1.0.2
- '@protobufjs/inquire': 1.1.0
- '@protobufjs/path': 1.1.2
- '@protobufjs/pool': 1.1.0
- '@protobufjs/utf8': 1.1.0
- '@types/long': 4.0.2
- '@types/node': 20.8.7
- long: 4.0.0
- dev: false
+ progress@2.0.3: {}
- /protobufjs@6.11.4:
- resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==}
- hasBin: true
- requiresBuild: true
+ proto3-json-serializer@2.0.2:
dependencies:
- '@protobufjs/aspromise': 1.1.2
- '@protobufjs/base64': 1.1.2
- '@protobufjs/codegen': 2.0.4
- '@protobufjs/eventemitter': 1.1.0
- '@protobufjs/fetch': 1.1.0
- '@protobufjs/float': 1.0.2
- '@protobufjs/inquire': 1.1.0
- '@protobufjs/path': 1.1.2
- '@protobufjs/pool': 1.1.0
- '@protobufjs/utf8': 1.1.0
- '@types/long': 4.0.2
- '@types/node': 20.1.7
- long: 4.0.0
- dev: false
+ protobufjs: 7.5.4
- /protobufjs@7.2.5:
- resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==}
- engines: {node: '>=12.0.0'}
- requiresBuild: true
+ protobufjs@7.5.4:
dependencies:
'@protobufjs/aspromise': 1.1.2
'@protobufjs/base64': 1.1.2
@@ -7639,478 +8817,350 @@ packages:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
- '@types/node': 20.1.7
- long: 5.2.3
- dev: false
+ '@types/node': 24.5.2
+ long: 5.3.2
- /proxy-addr@2.0.7:
- resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
- engines: {node: '>= 0.10'}
+ proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
ipaddr.js: 1.9.1
- dev: false
- /proxy-agent@6.3.0:
- resolution: {integrity: sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==}
- engines: {node: '>= 14'}
+ proxy-agent@6.5.0:
dependencies:
- agent-base: 7.1.0
- debug: 4.3.4
- http-proxy-agent: 7.0.0
- https-proxy-agent: 7.0.2
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
lru-cache: 7.18.3
- pac-proxy-agent: 7.0.1
+ pac-proxy-agent: 7.2.0
proxy-from-env: 1.1.0
- socks-proxy-agent: 8.0.2
+ socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
- dev: false
- /proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- dev: false
+ proxy-from-env@1.1.0: {}
- /pstree.remy@1.1.8:
- resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
- dev: true
+ pstree.remy@1.1.8: {}
- /pump@3.0.0:
- resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+ pump@3.0.3:
dependencies:
- end-of-stream: 1.4.4
+ end-of-stream: 1.4.5
once: 1.4.0
- /pumpify@2.0.1:
- resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==}
+ pumpify@2.0.1:
dependencies:
- duplexify: 4.1.2
+ duplexify: 4.1.3
inherits: 2.0.4
- pump: 3.0.0
- dev: false
+ pump: 3.0.3
- /punycode@2.3.0:
- resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
- engines: {node: '>=6'}
+ punycode@1.4.1: {}
- /puppeteer-core@20.9.0(typescript@5.2.2):
- resolution: {integrity: sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==}
- engines: {node: '>=16.3.0'}
- peerDependencies:
- typescript: '>= 4.7.4'
- peerDependenciesMeta:
- typescript:
- optional: true
+ punycode@2.3.1: {}
+
+ puppeteer-core@24.22.0:
dependencies:
- '@puppeteer/browsers': 1.4.6(typescript@5.2.2)
- chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663)
- cross-fetch: 4.0.0
- debug: 4.3.4
- devtools-protocol: 0.0.1147663
- typescript: 5.2.2
- ws: 8.13.0
+ '@puppeteer/browsers': 2.10.10
+ chromium-bidi: 8.0.0(devtools-protocol@0.0.1495869)
+ debug: 4.4.3(supports-color@5.5.0)
+ devtools-protocol: 0.0.1495869
+ typed-query-selector: 2.12.0
+ webdriver-bidi-protocol: 0.2.11
+ ws: 8.18.3
transitivePeerDependencies:
+ - bare-buffer
- bufferutil
- - encoding
+ - react-native-b4a
- supports-color
- utf-8-validate
- dev: false
- /puppeteer@20.9.0(typescript@5.2.2):
- resolution: {integrity: sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==}
- engines: {node: '>=16.3.0'}
- requiresBuild: true
+ puppeteer@24.22.0(typescript@5.9.2):
dependencies:
- '@puppeteer/browsers': 1.4.6(typescript@5.2.2)
- cosmiconfig: 8.2.0
- puppeteer-core: 20.9.0(typescript@5.2.2)
+ '@puppeteer/browsers': 2.10.10
+ chromium-bidi: 8.0.0(devtools-protocol@0.0.1495869)
+ cosmiconfig: 9.0.0(typescript@5.9.2)
+ devtools-protocol: 0.0.1495869
+ puppeteer-core: 24.22.0
+ typed-query-selector: 2.12.0
transitivePeerDependencies:
+ - bare-buffer
- bufferutil
- - encoding
+ - react-native-b4a
- supports-color
- typescript
- utf-8-validate
- dev: false
- /pure-rand@6.0.4:
- resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==}
- dev: true
-
- /qs@6.11.0:
- resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
- engines: {node: '>=0.6'}
+ qs@6.13.0:
dependencies:
- side-channel: 1.0.4
- dev: false
-
- /queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ side-channel: 1.1.0
- /queue-tick@1.0.1:
- resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
- dev: false
+ queue-microtask@1.2.3: {}
- /quick-format-unescaped@4.0.4:
- resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+ quick-format-unescaped@4.0.4: {}
- /randombytes@2.1.0:
- resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+ randombytes@2.1.0:
dependencies:
safe-buffer: 5.2.1
- dev: false
- /range-parser@1.2.1:
- resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
- engines: {node: '>= 0.6'}
- dev: false
+ range-parser@1.2.1: {}
- /raw-body@2.5.1:
- resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
- engines: {node: '>= 0.8'}
+ raw-body@2.5.2:
dependencies:
bytes: 3.1.2
http-errors: 2.0.0
iconv-lite: 0.4.24
unpipe: 1.0.0
- dev: false
- /raw-body@2.5.2:
- resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
- engines: {node: '>= 0.8'}
+ raw-body@3.0.1:
dependencies:
bytes: 3.1.2
http-errors: 2.0.0
- iconv-lite: 0.4.24
+ iconv-lite: 0.7.0
unpipe: 1.0.0
- dev: false
- /react-dom@18.2.0(react@18.2.0):
- resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
- peerDependencies:
- react: ^18.2.0
+ react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
- react: 18.2.0
- scheduler: 0.23.0
- dev: false
-
- /react-is@16.13.1:
- resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- dev: false
+ react: 18.3.1
+ scheduler: 0.23.2
- /react-is@17.0.2:
- resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
- dev: true
+ react-is@16.13.1: {}
- /react-is@18.2.0:
- resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
- dev: true
+ react-is@17.0.2: {}
- /react-refresh@0.14.0:
- resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
- engines: {node: '>=0.10.0'}
- dev: false
+ react-refresh@0.17.0: {}
- /react@18.2.0:
- resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
- engines: {node: '>=0.10.0'}
+ react@18.3.1:
dependencies:
loose-envify: 1.4.0
- dev: false
- /read-pkg-up@7.0.1:
- resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
- engines: {node: '>=8'}
+ read-pkg-up@7.0.1:
dependencies:
find-up: 4.1.0
read-pkg: 5.2.0
type-fest: 0.8.1
- dev: false
- /read-pkg@5.2.0:
- resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
- engines: {node: '>=8'}
+ read-pkg@5.2.0:
dependencies:
- '@types/normalize-package-data': 2.4.3
+ '@types/normalize-package-data': 2.4.4
normalize-package-data: 2.5.0
parse-json: 5.2.0
type-fest: 0.6.0
- dev: false
- /read-yaml-file@2.1.0:
- resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==}
- engines: {node: '>=10.13'}
+ read-yaml-file@2.1.0:
dependencies:
js-yaml: 4.1.0
strip-bom: 4.0.0
- dev: true
- /readable-stream@3.6.2:
- resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
- engines: {node: '>= 6'}
+ readable-stream@3.6.2:
dependencies:
inherits: 2.0.4
string_decoder: 1.3.0
util-deprecate: 1.0.2
- /readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
+ readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
- dev: true
- /real-require@0.1.0:
- resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==}
- engines: {node: '>= 12.13.0'}
+ real-require@0.2.0: {}
- /regenerate-unicode-properties@10.1.1:
- resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==}
- engines: {node: '>=4'}
+ redent@3.0.0:
dependencies:
- regenerate: 1.4.2
- dev: false
-
- /regenerate@1.4.2:
- resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
- dev: false
-
- /regenerator-runtime@0.13.11:
- resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
- dev: false
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
- /regenerator-runtime@0.14.0:
- resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
- dev: false
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
- /regenerator-transform@0.15.2:
- resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+ regenerate-unicode-properties@10.2.2:
dependencies:
- '@babel/runtime': 7.23.2
- dev: false
+ regenerate: 1.4.2
- /regexp.prototype.flags@1.5.1:
- resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
- engines: {node: '>= 0.4'}
+ regenerate@1.4.2: {}
+
+ regexp.prototype.flags@1.5.4:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.8
define-properties: 1.2.1
- set-function-name: 2.0.1
- dev: false
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
- /regexpu-core@5.3.2:
- resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
- engines: {node: '>=4'}
+ regexpu-core@6.3.1:
dependencies:
- '@babel/regjsgen': 0.8.0
regenerate: 1.4.2
- regenerate-unicode-properties: 10.1.1
- regjsparser: 0.9.1
+ regenerate-unicode-properties: 10.2.2
+ regjsgen: 0.8.0
+ regjsparser: 0.12.0
unicode-match-property-ecmascript: 2.0.0
- unicode-match-property-value-ecmascript: 2.1.0
- dev: false
+ unicode-match-property-value-ecmascript: 2.2.1
- /regjsparser@0.9.1:
- resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
- hasBin: true
+ regjsgen@0.8.0: {}
+
+ regjsparser@0.12.0:
dependencies:
- jsesc: 0.5.0
- dev: false
+ jsesc: 3.0.2
- /rename-overwrite@4.0.3:
- resolution: {integrity: sha512-e1zOWZh4Lauz5DcLMC8j4eoOHPIrZkAVpiocE9SkDE1ZrGMW+W88LR1Y2YjD1DFgOYfJWqSsK6JKsRfuRH+tbQ==}
- engines: {node: '>=12.10'}
+ rename-overwrite@5.0.4:
dependencies:
'@zkochan/rimraf': 2.1.3
fs-extra: 10.1.0
- dev: true
-
- /require-directory@2.1.1:
- resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
- engines: {node: '>=0.10.0'}
-
- /require-from-string@2.0.2:
- resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
- engines: {node: '>=0.10.0'}
- dev: false
- /resolve-cwd@3.0.0:
- resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
- engines: {node: '>=8'}
- dependencies:
- resolve-from: 5.0.0
- dev: true
+ require-directory@2.1.1: {}
- /resolve-from@4.0.0:
- resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
- engines: {node: '>=4'}
+ require-from-string@2.0.2: {}
- /resolve-from@5.0.0:
- resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
- engines: {node: '>=8'}
- dev: true
+ resolve-from@4.0.0: {}
- /resolve.exports@2.0.2:
- resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
- engines: {node: '>=10'}
- dev: true
+ resolve-pkg-maps@1.0.0: {}
- /resolve@1.22.2:
- resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
- hasBin: true
+ resolve@1.22.10:
dependencies:
- is-core-module: 2.12.1
+ is-core-module: 2.16.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- dev: false
- /resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
- hasBin: true
+ retry-request@4.2.2:
dependencies:
- is-core-module: 2.13.0
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
+ debug: 4.4.3(supports-color@5.5.0)
+ extend: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
- /retry-request@4.2.2:
- resolution: {integrity: sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==}
- engines: {node: '>=8.10.0'}
+ retry-request@7.0.2:
dependencies:
- debug: 4.3.4
+ '@types/request': 2.48.13
extend: 3.0.2
+ teeny-request: 9.0.0
transitivePeerDependencies:
+ - encoding
- supports-color
- dev: false
-
- /retry@0.13.1:
- resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
- engines: {node: '>= 4'}
- dev: false
- /reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ retry@0.13.1: {}
- /rfc4648@1.5.2:
- resolution: {integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==}
- dev: true
+ reusify@1.1.0: {}
- /rfdc@1.3.0:
- resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
+ rfc4648@1.5.4: {}
- /rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- hasBin: true
+ rimraf@3.0.2:
dependencies:
glob: 7.2.3
- /rollup-plugin-terser@7.0.2(rollup@2.79.1):
- resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
- deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
- peerDependencies:
- rollup: ^2.0.0
+ rimraf@6.0.1:
+ dependencies:
+ glob: 11.0.3
+ package-json-from-dist: 1.0.1
+
+ rollup-plugin-terser@7.0.2(rollup@2.79.2):
dependencies:
- '@babel/code-frame': 7.22.13
+ '@babel/code-frame': 7.27.1
jest-worker: 26.6.2
- rollup: 2.79.1
+ rollup: 2.79.2
serialize-javascript: 4.0.0
- terser: 5.22.0
- dev: false
+ terser: 5.44.0
- /rollup@2.79.1:
- resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
- engines: {node: '>=10.0.0'}
- hasBin: true
+ rollup-plugin-visualizer@5.14.0(rollup@2.79.2):
+ dependencies:
+ open: 8.4.2
+ picomatch: 4.0.3
+ source-map: 0.7.6
+ yargs: 17.7.2
+ optionalDependencies:
+ rollup: 2.79.2
+
+ rollup@2.79.2:
optionalDependencies:
fsevents: 2.3.3
- dev: false
- /rollup@3.26.2:
- resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==}
- engines: {node: '>=14.18.0', npm: '>=8.0.0'}
- hasBin: true
+ rollup@4.51.0:
+ dependencies:
+ '@types/estree': 1.0.8
optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.51.0
+ '@rollup/rollup-android-arm64': 4.51.0
+ '@rollup/rollup-darwin-arm64': 4.51.0
+ '@rollup/rollup-darwin-x64': 4.51.0
+ '@rollup/rollup-freebsd-arm64': 4.51.0
+ '@rollup/rollup-freebsd-x64': 4.51.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.51.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.51.0
+ '@rollup/rollup-linux-arm64-gnu': 4.51.0
+ '@rollup/rollup-linux-arm64-musl': 4.51.0
+ '@rollup/rollup-linux-loong64-gnu': 4.51.0
+ '@rollup/rollup-linux-ppc64-gnu': 4.51.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.51.0
+ '@rollup/rollup-linux-riscv64-musl': 4.51.0
+ '@rollup/rollup-linux-s390x-gnu': 4.51.0
+ '@rollup/rollup-linux-x64-gnu': 4.51.0
+ '@rollup/rollup-linux-x64-musl': 4.51.0
+ '@rollup/rollup-openharmony-arm64': 4.51.0
+ '@rollup/rollup-win32-arm64-msvc': 4.51.0
+ '@rollup/rollup-win32-ia32-msvc': 4.51.0
+ '@rollup/rollup-win32-x64-msvc': 4.51.0
fsevents: 2.3.3
- /run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ rrweb-cssom@0.8.0: {}
+
+ run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
- /safe-array-concat@1.0.1:
- resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
- engines: {node: '>=0.4'}
+ safe-array-concat@1.1.3:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- has-symbols: 1.0.3
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
isarray: 2.0.5
- dev: false
- /safe-buffer@5.1.2:
- resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
- dev: false
+ safe-buffer@5.2.1: {}
- /safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
- /safe-execa@0.1.2:
- resolution: {integrity: sha512-vdTshSQ2JsRCgT8eKZWNJIL26C6bVqy1SOmuCMlKHegVeo8KYRobRrefOdUq9OozSPUUiSxrylteeRmLOMFfWg==}
- engines: {node: '>=12'}
+ safe-execa@0.1.2:
dependencies:
'@zkochan/which': 2.0.3
execa: 5.1.1
path-name: 1.0.0
- dev: true
- /safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+ safe-push-apply@1.0.0:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-regex: 1.1.4
- dev: false
+ es-errors: 1.3.0
+ isarray: 2.0.5
- /safe-stable-stringify@2.4.3:
- resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==}
- engines: {node: '>=10'}
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
- /safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- dev: false
+ safe-stable-stringify@2.5.0: {}
- /scheduler@0.23.0:
- resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+ safer-buffer@2.1.2: {}
+
+ saxes@6.0.0:
dependencies:
- loose-envify: 1.4.0
- dev: false
+ xmlchars: 2.2.0
- /secure-json-parse@2.7.0:
- resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
- /semver@5.7.2:
- resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
- hasBin: true
+ secure-json-parse@4.0.0: {}
- /semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
+ semver@5.7.2: {}
- /semver@7.0.0:
- resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==}
- hasBin: true
- dev: true
+ semver@6.3.1: {}
- /semver@7.5.4:
- resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
- engines: {node: '>=10'}
- hasBin: true
- dependencies:
- lru-cache: 6.0.0
+ semver@7.7.2: {}
- /send@0.18.0:
- resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
- engines: {node: '>= 0.8.0'}
+ send@0.19.0:
dependencies:
debug: 2.6.9
depd: 2.0.0
@@ -8127,438 +9177,310 @@ packages:
statuses: 2.0.1
transitivePeerDependencies:
- supports-color
- dev: false
- /serialize-javascript@4.0.0:
- resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
+ serialize-javascript@4.0.0:
dependencies:
randombytes: 2.1.0
- dev: false
- /serve-static@1.15.0:
- resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
- engines: {node: '>= 0.8.0'}
+ serve-static@1.16.2:
dependencies:
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
parseurl: 1.3.3
- send: 0.18.0
+ send: 0.19.0
transitivePeerDependencies:
- supports-color
- dev: false
- /set-function-name@2.0.1:
- resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
- engines: {node: '>= 0.4'}
+ set-function-length@1.2.2:
dependencies:
- define-data-property: 1.1.1
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.0
- dev: false
-
- /setprototypeof@1.2.0:
- resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
- dev: false
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
- /sharp@0.33.2:
- resolution: {integrity: sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==}
- engines: {libvips: '>=8.15.1', node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- requiresBuild: true
+ set-function-name@2.0.2:
dependencies:
- color: 4.2.3
- detect-libc: 2.0.2
- semver: 7.5.4
- optionalDependencies:
- '@img/sharp-darwin-arm64': 0.33.2
- '@img/sharp-darwin-x64': 0.33.2
- '@img/sharp-libvips-darwin-arm64': 1.0.1
- '@img/sharp-libvips-darwin-x64': 1.0.1
- '@img/sharp-libvips-linux-arm': 1.0.1
- '@img/sharp-libvips-linux-arm64': 1.0.1
- '@img/sharp-libvips-linux-s390x': 1.0.1
- '@img/sharp-libvips-linux-x64': 1.0.1
- '@img/sharp-libvips-linuxmusl-arm64': 1.0.1
- '@img/sharp-libvips-linuxmusl-x64': 1.0.1
- '@img/sharp-linux-arm': 0.33.2
- '@img/sharp-linux-arm64': 0.33.2
- '@img/sharp-linux-s390x': 0.33.2
- '@img/sharp-linux-x64': 0.33.2
- '@img/sharp-linuxmusl-arm64': 0.33.2
- '@img/sharp-linuxmusl-x64': 0.33.2
- '@img/sharp-wasm32': 0.33.2
- '@img/sharp-win32-ia32': 0.33.2
- '@img/sharp-win32-x64': 0.33.2
- dev: false
-
- /shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
dependencies:
- shebang-regex: 3.0.0
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
- /shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
+ setprototypeof@1.2.0: {}
- /side-channel@1.0.4:
- resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+ shebang-command@2.0.0:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- object-inspect: 1.13.0
- dev: false
+ shebang-regex: 3.0.0
- /siginfo@2.0.0:
- resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
- dev: true
+ shebang-regex@3.0.0: {}
- /signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
- /signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
- dev: true
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
- /simple-swizzle@0.2.2:
- resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ side-channel-weakmap@1.0.2:
dependencies:
- is-arrayish: 0.3.2
- dev: false
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
- /simple-update-notifier@1.1.0:
- resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==}
- engines: {node: '>=8.10.0'}
+ side-channel@1.1.0:
dependencies:
- semver: 7.0.0
- dev: true
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
- /sisteransi@1.0.5:
- resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
- dev: true
+ siginfo@2.0.0: {}
- /slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
+ signal-exit@3.0.7: {}
- /smart-buffer@4.2.0:
- resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
- engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
- dev: false
+ signal-exit@4.1.0: {}
- /socks-proxy-agent@8.0.2:
- resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==}
- engines: {node: '>= 14'}
+ simple-update-notifier@2.0.0:
+ dependencies:
+ semver: 7.7.2
+
+ smart-buffer@4.2.0: {}
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ socks-proxy-agent@8.0.5:
dependencies:
- agent-base: 7.1.0
- debug: 4.3.4
- socks: 2.7.1
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
+ socks: 2.8.7
transitivePeerDependencies:
- supports-color
- dev: false
- /socks@2.7.1:
- resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==}
- engines: {node: '>= 10.13.0', npm: '>= 3.0.0'}
+ socks@2.8.7:
dependencies:
- ip: 2.0.0
+ ip-address: 10.0.1
smart-buffer: 4.2.0
- dev: false
- /sonic-boom@2.8.0:
- resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==}
+ sonic-boom@4.2.0:
dependencies:
atomic-sleep: 1.0.0
- /sort-keys@4.2.0:
- resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==}
- engines: {node: '>=8'}
+ sort-keys@4.2.0:
dependencies:
is-plain-obj: 2.1.0
- dev: true
- /source-map-js@1.0.2:
- resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
- engines: {node: '>=0.10.0'}
+ source-map-js@1.2.1: {}
- /source-map-support@0.5.13:
- resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+ source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
- dev: true
- /source-map-support@0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
- dev: false
+ source-map@0.5.7: {}
- /source-map@0.5.7:
- resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
- engines: {node: '>=0.10.0'}
- dev: false
+ source-map@0.6.1: {}
- /source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
+ source-map@0.7.6: {}
- /source-map@0.8.0-beta.0:
- resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
- engines: {node: '>= 8'}
+ source-map@0.8.0-beta.0:
dependencies:
whatwg-url: 7.1.0
- /sourcemap-codec@1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- deprecated: Please use @jridgewell/sourcemap-codec instead
- dev: false
+ sourcemap-codec@1.4.8: {}
- /spdx-correct@3.2.0:
- resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ spdx-correct@3.2.0:
dependencies:
spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.13
- dev: false
+ spdx-license-ids: 3.0.22
- /spdx-exceptions@2.3.0:
- resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
- dev: false
+ spdx-exceptions@2.5.0: {}
- /spdx-expression-parse@3.0.1:
- resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ spdx-expression-parse@3.0.1:
dependencies:
- spdx-exceptions: 2.3.0
- spdx-license-ids: 3.0.13
- dev: false
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.22
- /spdx-license-ids@3.0.13:
- resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
- dev: false
+ spdx-license-ids@3.0.22: {}
- /split2@3.2.2:
- resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
+ split2@3.2.2:
dependencies:
readable-stream: 3.6.2
- dev: true
-
- /split2@4.2.0:
- resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
- engines: {node: '>= 10.x'}
- /sprintf-js@1.0.3:
- resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
- dev: true
+ split2@4.2.0: {}
- /stack-utils@2.0.6:
- resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
- engines: {node: '>=10'}
- dependencies:
- escape-string-regexp: 2.0.0
- dev: true
+ stackback@0.0.2: {}
- /stackback@0.0.2:
- resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
- dev: true
+ statuses@2.0.1: {}
- /statuses@2.0.1:
- resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
- engines: {node: '>= 0.8'}
- dev: false
+ std-env@3.9.0: {}
- /std-env@3.3.3:
- resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==}
- dev: true
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
- /stream-events@1.0.5:
- resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
+ stream-events@1.0.5:
dependencies:
stubs: 3.0.0
- dev: false
- /stream-shift@1.0.1:
- resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==}
+ stream-shift@1.0.3: {}
- /streamx@2.15.1:
- resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==}
+ streamx@2.22.1:
dependencies:
fast-fifo: 1.3.2
- queue-tick: 1.0.1
- dev: false
-
- /string-length@4.0.2:
- resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
- engines: {node: '>=10'}
- dependencies:
- char-regex: 1.0.2
- strip-ansi: 6.0.1
- dev: true
+ text-decoder: 1.2.3
+ optionalDependencies:
+ bare-events: 2.6.1
+ transitivePeerDependencies:
+ - react-native-b4a
- /string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
+ string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
- /string.prototype.matchall@4.0.10:
- resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
+ string-width@5.1.2:
dependencies:
- call-bind: 1.0.2
- define-properties: 1.2.1
- es-abstract: 1.22.2
- get-intrinsic: 1.2.1
- has-symbols: 1.0.3
- internal-slot: 1.0.5
- regexp.prototype.flags: 1.5.1
- set-function-name: 2.0.1
- side-channel: 1.0.4
- dev: false
-
- /string.prototype.trim@1.2.8:
- resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
- engines: {node: '>= 0.4'}
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.2
+
+ string.prototype.matchall@4.0.12:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.8
+ call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.22.2
- dev: false
+ es-abstract: 1.24.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.0
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.0
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
- /string.prototype.trimend@1.0.7:
- resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
+ string.prototype.trimend@1.0.9:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.8
+ call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.22.2
- dev: false
+ es-object-atoms: 1.1.1
- /string.prototype.trimstart@1.0.7:
- resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
+ string.prototype.trimstart@1.0.8:
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.22.2
- dev: false
+ es-object-atoms: 1.1.1
- /string_decoder@1.3.0:
- resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
- /stringify-object@3.3.0:
- resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
- engines: {node: '>=4'}
+ stringify-object@3.3.0:
dependencies:
get-own-enumerable-property-symbols: 3.0.2
is-obj: 1.0.1
is-regexp: 1.0.0
- dev: false
- /strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
+ strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
- /strip-bom@4.0.0:
- resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
- engines: {node: '>=8'}
- dev: true
+ strip-ansi@7.1.2:
+ dependencies:
+ ansi-regex: 6.2.2
- /strip-comments-strings@1.2.0:
- resolution: {integrity: sha512-zwF4bmnyEjZwRhaak9jUWNxc0DoeKBJ7lwSN/LEc8dQXZcUFG6auaaTQJokQWXopLdM3iTx01nQT8E4aL29DAQ==}
- dev: true
+ strip-bom@4.0.0: {}
- /strip-comments@2.0.1:
- resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==}
- engines: {node: '>=10'}
- dev: false
+ strip-comments-strings@1.2.0: {}
- /strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
- dev: true
+ strip-comments@2.0.1: {}
- /strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
+ strip-final-newline@2.0.0: {}
- /strip-literal@1.0.1:
- resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==}
+ strip-indent@3.0.0:
dependencies:
- acorn: 8.10.0
- dev: true
+ min-indent: 1.0.1
- /stubs@3.0.0:
- resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==}
- dev: false
+ strip-json-comments@3.1.1: {}
- /stylis@4.2.0:
- resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
- dev: false
+ strip-json-comments@5.0.3: {}
- /sucrase@3.32.0:
- resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
- engines: {node: '>=8'}
- hasBin: true
+ strip-literal@3.0.0:
dependencies:
- '@jridgewell/gen-mapping': 0.3.3
- commander: 4.1.1
- glob: 7.1.6
- lines-and-columns: 1.2.4
- mz: 2.7.0
- pirates: 4.0.6
- ts-interface-checker: 0.1.13
- dev: true
+ js-tokens: 9.0.1
- /supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
+ strnum@1.1.2: {}
+
+ stubs@3.0.0: {}
+
+ stylis@4.2.0: {}
+
+ supports-color@5.5.0:
dependencies:
has-flag: 3.0.0
- /supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
+ supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
- /supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
- dependencies:
- has-flag: 4.0.0
- dev: true
+ supports-preserve-symlinks-flag@1.0.0: {}
- /supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
+ svg-parser@2.0.4: {}
- /svg-parser@2.0.4:
- resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
- dev: false
+ symbol-tree@3.2.4: {}
- /tar-fs@3.0.4:
- resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==}
+ tar-fs@3.1.1:
dependencies:
- mkdirp-classic: 0.5.3
- pump: 3.0.0
- tar-stream: 3.1.6
- dev: false
+ pump: 3.0.3
+ tar-stream: 3.1.7
+ optionalDependencies:
+ bare-fs: 4.4.4
+ bare-path: 3.0.0
+ transitivePeerDependencies:
+ - bare-buffer
+ - react-native-b4a
- /tar-stream@3.1.6:
- resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==}
+ tar-stream@3.1.7:
dependencies:
- b4a: 1.6.4
+ b4a: 1.7.1
fast-fifo: 1.3.2
- streamx: 2.15.1
- dev: false
+ streamx: 2.22.1
+ transitivePeerDependencies:
+ - react-native-b4a
- /teeny-request@7.2.0:
- resolution: {integrity: sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw==}
- engines: {node: '>=10'}
+ teeny-request@7.2.0:
dependencies:
http-proxy-agent: 5.0.0
https-proxy-agent: 5.0.1
@@ -8568,836 +9490,480 @@ packages:
transitivePeerDependencies:
- encoding
- supports-color
- dev: false
- /temp-dir@2.0.0:
- resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
- engines: {node: '>=8'}
- dev: false
+ teeny-request@9.0.0:
+ dependencies:
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ node-fetch: 2.7.0
+ stream-events: 1.0.5
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
- /tempy@0.6.0:
- resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==}
- engines: {node: '>=10'}
+ temp-dir@2.0.0: {}
+
+ tempy@0.6.0:
dependencies:
is-stream: 2.0.1
temp-dir: 2.0.0
type-fest: 0.16.0
unique-string: 2.0.0
- dev: false
- /terser@5.22.0:
- resolution: {integrity: sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==}
- engines: {node: '>=10'}
- hasBin: true
+ terser@5.44.0:
dependencies:
- '@jridgewell/source-map': 0.3.5
- acorn: 8.10.0
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.15.0
commander: 2.20.3
source-map-support: 0.5.21
- dev: false
- /test-exclude@6.0.0:
- resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
- engines: {node: '>=8'}
+ test-exclude@7.0.1:
dependencies:
'@istanbuljs/schema': 0.1.3
- glob: 7.2.3
- minimatch: 3.1.2
- dev: true
-
- /text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ glob: 10.4.5
+ minimatch: 9.0.5
- /thenify-all@1.6.0:
- resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
- engines: {node: '>=0.8'}
+ text-decoder@1.2.3:
dependencies:
- thenify: 3.3.1
- dev: true
-
- /thenify@3.3.1:
- resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
- dependencies:
- any-promise: 1.3.0
- dev: true
+ b4a: 1.7.1
+ transitivePeerDependencies:
+ - react-native-b4a
- /thread-stream@0.15.2:
- resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==}
+ thread-stream@3.1.0:
dependencies:
- real-require: 0.1.0
+ real-require: 0.2.0
- /through2@4.0.2:
- resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
+ through2@4.0.2:
dependencies:
readable-stream: 3.6.2
- dev: true
- /through@2.3.8:
- resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
- dev: false
+ tinybench@2.9.0: {}
- /time-zone@1.0.0:
- resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==}
- engines: {node: '>=4'}
- dev: true
+ tinyexec@0.3.2: {}
- /tinybench@2.5.0:
- resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==}
- dev: true
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
- /tinypool@0.5.0:
- resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==}
- engines: {node: '>=14.0.0'}
- dev: true
+ tinypool@1.1.1: {}
- /tinyspy@2.1.1:
- resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==}
- engines: {node: '>=14.0.0'}
- dev: true
+ tinyrainbow@2.0.0: {}
- /tmpl@1.0.5:
- resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
- dev: true
+ tinyspy@4.0.4: {}
- /to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
+ tldts-core@6.1.86: {}
- /to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
+ tldts@6.1.86:
dependencies:
- is-number: 7.0.0
+ tldts-core: 6.1.86
- /toidentifier@1.0.1:
- resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
- engines: {node: '>=0.6'}
- dev: false
-
- /touch@3.1.0:
- resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
- hasBin: true
+ to-regex-range@5.0.1:
dependencies:
- nopt: 1.0.10
- dev: true
-
- /tr46@0.0.3:
- resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
- dev: false
+ is-number: 7.0.0
- /tr46@1.0.1:
- resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
- dependencies:
- punycode: 2.3.0
+ toidentifier@1.0.1: {}
- /tree-kill@1.2.2:
- resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
- hasBin: true
- dev: true
+ touch@3.1.1: {}
- /ts-api-utils@1.0.3(typescript@5.2.2):
- resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
- engines: {node: '>=16.13.0'}
- peerDependencies:
- typescript: '>=4.2.0'
+ tough-cookie@5.1.2:
dependencies:
- typescript: 5.2.2
- dev: false
-
- /ts-interface-checker@0.1.13:
- resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- dev: true
-
- /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.2.2):
- resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- '@babel/core': '>=7.0.0-beta.0 <8'
- '@jest/types': ^29.0.0
- babel-jest: ^29.0.0
- esbuild: '*'
- jest: ^29.0.0
- typescript: '>=4.3 <6'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- '@jest/types':
- optional: true
- babel-jest:
- optional: true
- esbuild:
- optional: true
+ tldts: 6.1.86
+
+ tr46@0.0.3: {}
+
+ tr46@1.0.1:
dependencies:
- '@babel/core': 7.23.2
- bs-logger: 0.2.6
- fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@20.1.7)
- jest-util: 29.7.0
- json5: 2.2.3
- lodash.memoize: 4.1.2
- make-error: 1.3.6
- semver: 7.5.4
- typescript: 5.2.2
- yargs-parser: 21.1.1
- dev: true
+ punycode: 2.3.1
- /ts-node@10.9.1(@types/node@20.8.7)(typescript@5.2.2):
- resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
- hasBin: true
- peerDependencies:
- '@swc/core': '>=1.2.50'
- '@swc/wasm': '>=1.2.50'
- '@types/node': '*'
- typescript: '>=2.7'
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- '@swc/wasm':
- optional: true
+ tr46@5.1.1:
dependencies:
- '@cspotcode/source-map-support': 0.8.1
- '@tsconfig/node10': 1.0.9
- '@tsconfig/node12': 1.0.11
- '@tsconfig/node14': 1.0.3
- '@tsconfig/node16': 1.0.4
- '@types/node': 20.8.7
- acorn: 8.10.0
- acorn-walk: 8.2.0
- arg: 4.1.3
- create-require: 1.1.1
- diff: 4.0.2
- make-error: 1.3.6
- typescript: 5.2.2
- v8-compile-cache-lib: 3.0.1
- yn: 3.1.1
- dev: true
-
- /tslib@2.6.2:
- resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
- dev: false
-
- /tsup@6.6.0(@swc/core@1.3.32):
- resolution: {integrity: sha512-HxZE7Hj5yNxLFftCXdcJ+Jsax8dI4oKb0bt8fIvd1g/W0FZ46sU1pFBVo15WpOERFcEMH7Hykey/Q+hKO4s9RQ==}
- engines: {node: '>=14'}
- hasBin: true
- peerDependencies:
- '@swc/core': ^1
- postcss: ^8.4.12
- typescript: ^4.1.0
- peerDependenciesMeta:
- '@swc/core':
- optional: true
- postcss:
- optional: true
- typescript:
- optional: true
+ punycode: 2.3.1
+
+ ts-api-utils@2.1.0(typescript@5.9.2):
dependencies:
- '@swc/core': 1.3.32
- bundle-require: 4.0.1(esbuild@0.17.19)
- cac: 6.7.14
- chokidar: 3.5.3
- debug: 4.3.4
- esbuild: 0.17.19
- execa: 5.1.1
- globby: 11.1.0
- joycon: 3.1.1
- postcss-load-config: 3.1.4
- resolve-from: 5.0.0
- rollup: 3.26.2
- source-map: 0.8.0-beta.0
- sucrase: 3.32.0
- tree-kill: 1.2.2
- transitivePeerDependencies:
- - supports-color
- - ts-node
- dev: true
+ typescript: 5.9.2
- /turbo-darwin-64@1.10.7:
- resolution: {integrity: sha512-N2MNuhwrl6g7vGuz4y3fFG2aR1oCs0UZ5HKl8KSTn/VC2y2YIuLGedQ3OVbo0TfEvygAlF3QGAAKKtOCmGPNKA==}
- cpu: [x64]
- os: [darwin]
- requiresBuild: true
- dev: true
+ tslib@2.8.1: {}
+
+ tsx@4.20.5:
+ dependencies:
+ esbuild: 0.25.10
+ get-tsconfig: 4.10.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ turbo-darwin-64@2.5.6:
optional: true
- /turbo-darwin-arm64@1.10.7:
- resolution: {integrity: sha512-WbJkvjU+6qkngp7K4EsswOriO3xrNQag7YEGRtfLoDdMTk4O4QTeU6sfg2dKfDsBpTidTvEDwgIYJhYVGzrz9Q==}
- cpu: [arm64]
- os: [darwin]
- requiresBuild: true
- dev: true
+ turbo-darwin-arm64@2.5.6:
optional: true
- /turbo-linux-64@1.10.7:
- resolution: {integrity: sha512-x1CF2CDP1pDz/J8/B2T0hnmmOQI2+y11JGIzNP0KtwxDM7rmeg3DDTtDM/9PwGqfPotN9iVGgMiMvBuMFbsLhg==}
- cpu: [x64]
- os: [linux]
- requiresBuild: true
- dev: true
+ turbo-linux-64@2.5.6:
optional: true
- /turbo-linux-arm64@1.10.7:
- resolution: {integrity: sha512-JtnBmaBSYbs7peJPkXzXxsRGSGBmBEIb6/kC8RRmyvPAMyqF8wIex0pttsI+9plghREiGPtRWv/lfQEPRlXnNQ==}
- cpu: [arm64]
- os: [linux]
- requiresBuild: true
- dev: true
+ turbo-linux-arm64@2.5.6:
optional: true
- /turbo-windows-64@1.10.7:
- resolution: {integrity: sha512-7A/4CByoHdolWS8dg3DPm99owfu1aY/W0V0+KxFd0o2JQMTQtoBgIMSvZesXaWM57z3OLsietFivDLQPuzE75w==}
- cpu: [x64]
- os: [win32]
- requiresBuild: true
- dev: true
+ turbo-windows-64@2.5.6:
optional: true
- /turbo-windows-arm64@1.10.7:
- resolution: {integrity: sha512-D36K/3b6+hqm9IBAymnuVgyePktwQ+F0lSXr2B9JfAdFPBktSqGmp50JNC7pahxhnuCLj0Vdpe9RqfnJw5zATA==}
- cpu: [arm64]
- os: [win32]
- requiresBuild: true
- dev: true
+ turbo-windows-arm64@2.5.6:
optional: true
- /turbo@1.10.7:
- resolution: {integrity: sha512-xm0MPM28TWx1e6TNC3wokfE5eaDqlfi0G24kmeHupDUZt5Wd0OzHFENEHMPqEaNKJ0I+AMObL6nbSZonZBV2HA==}
- hasBin: true
- requiresBuild: true
+ turbo@2.5.6:
optionalDependencies:
- turbo-darwin-64: 1.10.7
- turbo-darwin-arm64: 1.10.7
- turbo-linux-64: 1.10.7
- turbo-linux-arm64: 1.10.7
- turbo-windows-64: 1.10.7
- turbo-windows-arm64: 1.10.7
- dev: true
-
- /type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
+ turbo-darwin-64: 2.5.6
+ turbo-darwin-arm64: 2.5.6
+ turbo-linux-64: 2.5.6
+ turbo-linux-arm64: 2.5.6
+ turbo-windows-64: 2.5.6
+ turbo-windows-arm64: 2.5.6
+
+ type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
- /type-detect@4.0.8:
- resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
- engines: {node: '>=4'}
- dev: true
-
- /type-fest@0.16.0:
- resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
- engines: {node: '>=10'}
- dev: false
-
- /type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
+ type-fest@0.16.0: {}
- /type-fest@0.21.3:
- resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
- engines: {node: '>=10'}
- dev: true
-
- /type-fest@0.6.0:
- resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
- engines: {node: '>=8'}
- dev: false
+ type-fest@0.6.0: {}
- /type-fest@0.8.1:
- resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
- engines: {node: '>=8'}
- dev: false
+ type-fest@0.8.1: {}
- /type-is@1.6.18:
- resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
- engines: {node: '>= 0.6'}
+ type-is@1.6.18:
dependencies:
media-typer: 0.3.0
mime-types: 2.1.35
- dev: false
- /typed-array-buffer@1.0.0:
- resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
- engines: {node: '>= 0.4'}
+ typed-array-buffer@1.0.3:
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
- is-typed-array: 1.1.12
- dev: false
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
- /typed-array-byte-length@1.0.0:
- resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
- engines: {node: '>= 0.4'}
+ typed-array-byte-length@1.0.3:
dependencies:
- call-bind: 1.0.2
- for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
- dev: false
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
- /typed-array-byte-offset@1.0.0:
- resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
- engines: {node: '>= 0.4'}
+ typed-array-byte-offset@1.0.4:
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
- dev: false
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
- /typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+ typed-array-length@1.0.7:
dependencies:
- call-bind: 1.0.2
- for-each: 0.3.3
- is-typed-array: 1.1.12
- dev: false
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
- /typedarray-to-buffer@3.1.5:
- resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ typed-query-selector@2.12.0: {}
+
+ typedarray-to-buffer@3.1.5:
dependencies:
is-typedarray: 1.0.0
- dev: false
-
- /typescript@5.0.4:
- resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==}
- engines: {node: '>=12.20'}
- hasBin: true
- dev: false
-
- /typescript@5.2.2:
- resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- /ufo@1.1.2:
- resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==}
- dev: true
- /unbox-primitive@1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
- dependencies:
- call-bind: 1.0.2
- has-bigints: 1.0.2
- has-symbols: 1.0.3
- which-boxed-primitive: 1.0.2
- dev: false
+ typescript@5.9.2: {}
- /unbzip2-stream@1.4.3:
- resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
+ unbox-primitive@1.1.0:
dependencies:
- buffer: 5.7.1
- through: 2.3.8
- dev: false
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
- /undefsafe@2.0.5:
- resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
- dev: true
+ undefsafe@2.0.5: {}
- /undici-types@5.25.3:
- resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==}
+ undici-types@7.12.0: {}
- /unicode-canonical-property-names-ecmascript@2.0.0:
- resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
- engines: {node: '>=4'}
- dev: false
+ unicode-canonical-property-names-ecmascript@2.0.1: {}
- /unicode-match-property-ecmascript@2.0.0:
- resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
- engines: {node: '>=4'}
+ unicode-match-property-ecmascript@2.0.0:
dependencies:
- unicode-canonical-property-names-ecmascript: 2.0.0
- unicode-property-aliases-ecmascript: 2.1.0
- dev: false
+ unicode-canonical-property-names-ecmascript: 2.0.1
+ unicode-property-aliases-ecmascript: 2.2.0
- /unicode-match-property-value-ecmascript@2.1.0:
- resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
- engines: {node: '>=4'}
- dev: false
+ unicode-match-property-value-ecmascript@2.2.1: {}
- /unicode-property-aliases-ecmascript@2.1.0:
- resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
- engines: {node: '>=4'}
- dev: false
+ unicode-property-aliases-ecmascript@2.2.0: {}
- /unique-string@2.0.0:
- resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
- engines: {node: '>=8'}
+ unique-string@2.0.0:
dependencies:
crypto-random-string: 2.0.0
- dev: false
-
- /universalify@0.1.2:
- resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
- engines: {node: '>= 4.0.0'}
- dev: false
-
- /universalify@2.0.0:
- resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
- engines: {node: '>= 10.0.0'}
- /unpipe@1.0.0:
- resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
- engines: {node: '>= 0.8'}
- dev: false
+ universalify@2.0.1: {}
- /upath@1.2.0:
- resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
- engines: {node: '>=4'}
- dev: false
+ unpipe@1.0.0: {}
- /update-browserslist-db@1.0.11(browserslist@4.21.9):
- resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
- dependencies:
- browserslist: 4.21.9
- escalade: 3.1.1
- picocolors: 1.0.0
- dev: false
+ upath@1.2.0: {}
- /update-browserslist-db@1.0.13(browserslist@4.22.1):
- resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
+ update-browserslist-db@1.1.3(browserslist@4.26.2):
dependencies:
- browserslist: 4.22.1
- escalade: 3.1.1
- picocolors: 1.0.0
+ browserslist: 4.26.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
- /uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ uri-js@4.4.1:
dependencies:
- punycode: 2.3.0
+ punycode: 2.3.1
- /util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ util-deprecate@1.0.2: {}
- /util@0.12.5:
- resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+ util@0.12.5:
dependencies:
inherits: 2.0.4
- is-arguments: 1.1.1
- is-generator-function: 1.0.10
- is-typed-array: 1.1.12
- which-typed-array: 1.1.11
- dev: false
-
- /utils-merge@1.0.1:
- resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
- engines: {node: '>= 0.4.0'}
- dev: false
-
- /uuid@8.3.2:
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
- hasBin: true
- dev: false
+ is-arguments: 1.2.0
+ is-generator-function: 1.1.0
+ is-typed-array: 1.1.15
+ which-typed-array: 1.1.19
- /v8-compile-cache-lib@3.0.1:
- resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
- dev: true
+ utils-merge@1.0.1: {}
- /v8-to-istanbul@9.1.0:
- resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==}
- engines: {node: '>=10.12.0'}
- dependencies:
- '@jridgewell/trace-mapping': 0.3.18
- '@types/istanbul-lib-coverage': 2.0.4
- convert-source-map: 1.9.0
- dev: true
+ uuid@8.3.2: {}
- /v8-to-istanbul@9.1.3:
- resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==}
- engines: {node: '>=10.12.0'}
- dependencies:
- '@jridgewell/trace-mapping': 0.3.20
- '@types/istanbul-lib-coverage': 2.0.5
- convert-source-map: 2.0.0
- dev: true
+ uuid@9.0.1: {}
- /validate-npm-package-license@3.0.4:
- resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ validate-npm-package-license@3.0.4:
dependencies:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
- dev: false
- /vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
- dev: false
+ vary@1.1.2: {}
- /vite-node@0.31.1(@types/node@18.16.1):
- resolution: {integrity: sha512-BajE/IsNQ6JyizPzu9zRgHrBwczkAs0erQf/JRpgTIESpKvNj9/Gd0vxX905klLkb0I0SJVCKbdrl5c6FnqYKA==}
- engines: {node: '>=v14.18.0'}
- hasBin: true
+ vite-node@3.2.4(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5):
dependencies:
cac: 6.7.14
- debug: 4.3.4
- mlly: 1.4.0
- pathe: 1.1.1
- picocolors: 1.0.0
- vite: 4.3.5(@types/node@18.16.1)
+ debug: 4.4.3(supports-color@5.5.0)
+ es-module-lexer: 1.7.0
+ pathe: 2.0.3
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
transitivePeerDependencies:
- '@types/node'
+ - jiti
- less
+ - lightningcss
- sass
+ - sass-embedded
- stylus
- sugarss
- supports-color
- terser
- dev: true
+ - tsx
+ - yaml
- /vite-plugin-compression@0.5.1(vite@4.3.5):
- resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
- peerDependencies:
- vite: '>=2.0.0'
+ vite-plugin-compression@0.5.1(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)):
dependencies:
chalk: 4.1.2
- debug: 4.3.4
+ debug: 4.4.3(supports-color@5.5.0)
fs-extra: 10.1.0
- vite: 4.3.5(@types/node@18.16.1)
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
transitivePeerDependencies:
- supports-color
- dev: true
-
- /vite-plugin-pwa@0.14.7(vite@4.3.5)(workbox-build@6.6.0)(workbox-window@6.6.0):
- resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==}
- peerDependencies:
- vite: ^3.1.0 || ^4.0.0
- workbox-build: ^6.5.4
- workbox-window: ^6.5.4
- dependencies:
- '@rollup/plugin-replace': 5.0.2(rollup@3.26.2)
- debug: 4.3.4
- fast-glob: 3.3.0
- pretty-bytes: 6.1.0
- rollup: 3.26.2
- vite: 4.3.5(@types/node@18.16.1)
- workbox-build: 6.6.0
+
+ vite-plugin-pwa@1.0.3(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))(workbox-build@6.6.0(@types/babel__core@7.20.5))(workbox-window@6.6.0):
+ dependencies:
+ debug: 4.4.3(supports-color@5.5.0)
+ pretty-bytes: 6.1.1
+ tinyglobby: 0.2.15
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
+ workbox-build: 6.6.0(@types/babel__core@7.20.5)
workbox-window: 6.6.0
transitivePeerDependencies:
- supports-color
- dev: false
- /vite-plugin-svgr@3.2.0(rollup@2.79.1)(vite@4.3.5):
- resolution: {integrity: sha512-Uvq6niTvhqJU6ga78qLKBFJSDvxWhOnyfQSoKpDPMAGxJPo5S3+9hyjExE5YDj6Lpa4uaLkGc1cBgxXov+LjSw==}
- peerDependencies:
- vite: ^2.6.0 || 3 || 4
+ vite-plugin-svgr@4.5.0(rollup@2.79.2)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)):
dependencies:
- '@rollup/pluginutils': 5.0.2(rollup@2.79.1)
- '@svgr/core': 7.0.0
- '@svgr/plugin-jsx': 7.0.0
- vite: 4.3.5(@types/node@18.16.1)
+ '@rollup/pluginutils': 5.3.0(rollup@2.79.2)
+ '@svgr/core': 8.1.0(typescript@5.9.2)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2))
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
transitivePeerDependencies:
- rollup
- supports-color
- dev: false
+ - typescript
- /vite@4.3.5(@types/node@18.16.1):
- resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==}
- engines: {node: ^14.18.0 || >=16.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': '>= 14'
- less: '*'
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
+ vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5):
dependencies:
- '@types/node': 18.16.1
- esbuild: 0.17.19
- postcss: 8.4.25
- rollup: 3.26.2
+ esbuild: 0.25.10
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.6
+ rollup: 4.51.0
+ tinyglobby: 0.2.15
optionalDependencies:
+ '@types/node': 24.5.2
fsevents: 2.3.3
-
- /vitest@0.31.1:
- resolution: {integrity: sha512-/dOoOgzoFk/5pTvg1E65WVaobknWREN15+HF+0ucudo3dDG/vCZoXTQrjIfEaWvQXmqScwkRodrTbM/ScMpRcQ==}
- engines: {node: '>=v14.18.0'}
- hasBin: true
- peerDependencies:
- '@edge-runtime/vm': '*'
- '@vitest/browser': '*'
- '@vitest/ui': '*'
- happy-dom: '*'
- jsdom: '*'
- playwright: '*'
- safaridriver: '*'
- webdriverio: '*'
- peerDependenciesMeta:
- '@edge-runtime/vm':
- optional: true
- '@vitest/browser':
- optional: true
- '@vitest/ui':
- optional: true
- happy-dom:
- optional: true
- jsdom:
- optional: true
- playwright:
- optional: true
- safaridriver:
- optional: true
- webdriverio:
- optional: true
- dependencies:
- '@types/chai': 4.3.5
- '@types/chai-subset': 1.3.3
- '@types/node': 18.16.1
- '@vitest/expect': 0.31.1
- '@vitest/runner': 0.31.1
- '@vitest/snapshot': 0.31.1
- '@vitest/spy': 0.31.1
- '@vitest/utils': 0.31.1
- acorn: 8.10.0
- acorn-walk: 8.2.0
- cac: 6.7.14
- chai: 4.3.7
- concordance: 5.0.4
- debug: 4.3.4
- local-pkg: 0.4.3
- magic-string: 0.30.1
- pathe: 1.1.1
- picocolors: 1.0.0
- std-env: 3.3.3
- strip-literal: 1.0.1
- tinybench: 2.5.0
- tinypool: 0.5.0
- vite: 4.3.5(@types/node@18.16.1)
- vite-node: 0.31.1(@types/node@18.16.1)
- why-is-node-running: 2.2.2
+ terser: 5.44.0
+ tsx: 4.20.5
+
+ vitest@3.2.4(@types/node@24.5.2)(jsdom@26.1.0)(terser@5.44.0)(tsx@4.20.5):
+ dependencies:
+ '@types/chai': 5.2.2
+ '@vitest/expect': 3.2.4
+ '@vitest/mocker': 3.2.4(vite@7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5))
+ '@vitest/pretty-format': 3.2.4
+ '@vitest/runner': 3.2.4
+ '@vitest/snapshot': 3.2.4
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
+ chai: 5.3.3
+ debug: 4.4.3(supports-color@5.5.0)
+ expect-type: 1.2.2
+ magic-string: 0.30.19
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ std-env: 3.9.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.2
+ tinyglobby: 0.2.15
+ tinypool: 1.1.1
+ tinyrainbow: 2.0.0
+ vite: 7.1.6(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
+ vite-node: 3.2.4(@types/node@24.5.2)(terser@5.44.0)(tsx@4.20.5)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 24.5.2
+ jsdom: 26.1.0
transitivePeerDependencies:
+ - jiti
- less
+ - lightningcss
+ - msw
- sass
+ - sass-embedded
- stylus
- sugarss
- supports-color
- terser
- dev: true
+ - tsx
+ - yaml
- /walker@1.0.8:
- resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+ w3c-xmlserializer@5.0.0:
dependencies:
- makeerror: 1.0.12
- dev: true
+ xml-name-validator: 5.0.0
- /webidl-conversions@3.0.1:
- resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
- dev: false
+ webdriver-bidi-protocol@0.2.11: {}
- /webidl-conversions@4.0.2:
- resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
+ webidl-conversions@3.0.1: {}
- /well-known-symbols@2.0.0:
- resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==}
- engines: {node: '>=6'}
- dev: true
+ webidl-conversions@4.0.2: {}
- /whatwg-url@5.0.0:
- resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ webidl-conversions@7.0.0: {}
+
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@4.0.0: {}
+
+ whatwg-url@14.2.0:
+ dependencies:
+ tr46: 5.1.1
+ webidl-conversions: 7.0.0
+
+ whatwg-url@5.0.0:
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
- dev: false
- /whatwg-url@7.1.0:
- resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
+ whatwg-url@7.1.0:
dependencies:
lodash.sortby: 4.7.0
tr46: 1.0.1
webidl-conversions: 4.0.2
- /which-boxed-primitive@1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.0
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.19
+
+ which-collection@1.0.2:
dependencies:
- is-bigint: 1.0.4
- is-boolean-object: 1.1.2
- is-number-object: 1.0.7
- is-string: 1.0.7
- is-symbol: 1.0.4
- dev: false
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
- /which-typed-array@1.1.11:
- resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
- engines: {node: '>= 0.4'}
+ which-typed-array@1.1.19:
dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
- dev: false
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
- /which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
+ which@2.0.2:
dependencies:
isexe: 2.0.0
- /why-is-node-running@2.2.2:
- resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
- engines: {node: '>=8'}
- hasBin: true
+ why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
stackback: 0.0.2
- dev: true
- /workbox-background-sync@6.6.0:
- resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==}
+ word-wrap@1.2.5: {}
+
+ workbox-background-sync@6.6.0:
dependencies:
idb: 7.1.1
workbox-core: 6.6.0
- dev: false
- /workbox-broadcast-update@6.6.0:
- resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==}
+ workbox-broadcast-update@6.6.0:
dependencies:
workbox-core: 6.6.0
- dev: false
- /workbox-build@6.6.0:
- resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==}
- engines: {node: '>=10.0.0'}
+ workbox-build@6.6.0(@types/babel__core@7.20.5):
dependencies:
- '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0)
- '@babel/core': 7.23.2
- '@babel/preset-env': 7.23.2(@babel/core@7.23.2)
- '@babel/runtime': 7.23.2
- '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.2)(rollup@2.79.1)
- '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1)
- '@rollup/plugin-replace': 2.4.2(rollup@2.79.1)
+ '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1)
+ '@babel/core': 7.28.4
+ '@babel/preset-env': 7.28.3(@babel/core@7.28.4)
+ '@babel/runtime': 7.28.4
+ '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@2.79.2)
+ '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2)
+ '@rollup/plugin-replace': 2.4.2(rollup@2.79.2)
'@surma/rollup-plugin-off-main-thread': 2.2.3
- ajv: 8.12.0
+ ajv: 8.17.1
common-tags: 1.8.2
fast-json-stable-stringify: 2.1.0
fs-extra: 9.1.0
glob: 7.2.3
lodash: 4.17.21
pretty-bytes: 5.6.0
- rollup: 2.79.1
- rollup-plugin-terser: 7.0.2(rollup@2.79.1)
+ rollup: 2.79.2
+ rollup-plugin-terser: 7.0.2(rollup@2.79.2)
source-map: 0.8.0-beta.0
stringify-object: 3.3.0
strip-comments: 2.0.1
@@ -9421,57 +9987,40 @@ packages:
transitivePeerDependencies:
- '@types/babel__core'
- supports-color
- dev: false
- /workbox-cacheable-response@6.6.0:
- resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==}
- deprecated: workbox-background-sync@6.6.0
+ workbox-cacheable-response@6.6.0:
dependencies:
workbox-core: 6.6.0
- dev: false
- /workbox-core@6.6.0:
- resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==}
- dev: false
+ workbox-core@6.6.0: {}
- /workbox-expiration@6.6.0:
- resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==}
+ workbox-expiration@6.6.0:
dependencies:
idb: 7.1.1
workbox-core: 6.6.0
- dev: false
- /workbox-google-analytics@6.6.0:
- resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==}
+ workbox-google-analytics@6.6.0:
dependencies:
workbox-background-sync: 6.6.0
workbox-core: 6.6.0
workbox-routing: 6.6.0
workbox-strategies: 6.6.0
- dev: false
- /workbox-navigation-preload@6.6.0:
- resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==}
+ workbox-navigation-preload@6.6.0:
dependencies:
workbox-core: 6.6.0
- dev: false
- /workbox-precaching@6.6.0:
- resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==}
+ workbox-precaching@6.6.0:
dependencies:
workbox-core: 6.6.0
workbox-routing: 6.6.0
workbox-strategies: 6.6.0
- dev: false
- /workbox-range-requests@6.6.0:
- resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==}
+ workbox-range-requests@6.6.0:
dependencies:
workbox-core: 6.6.0
- dev: false
- /workbox-recipes@6.6.0:
- resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==}
+ workbox-recipes@6.6.0:
dependencies:
workbox-cacheable-response: 6.6.0
workbox-core: 6.6.0
@@ -9479,184 +10028,91 @@ packages:
workbox-precaching: 6.6.0
workbox-routing: 6.6.0
workbox-strategies: 6.6.0
- dev: false
- /workbox-routing@6.6.0:
- resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==}
+ workbox-routing@6.6.0:
dependencies:
workbox-core: 6.6.0
- dev: false
- /workbox-strategies@6.6.0:
- resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==}
+ workbox-strategies@6.6.0:
dependencies:
workbox-core: 6.6.0
- dev: false
- /workbox-streams@6.6.0:
- resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==}
+ workbox-streams@6.6.0:
dependencies:
workbox-core: 6.6.0
workbox-routing: 6.6.0
- dev: false
- /workbox-sw@6.6.0:
- resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==}
- dev: false
+ workbox-sw@6.6.0: {}
- /workbox-window@6.6.0:
- resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==}
+ workbox-window@6.6.0:
dependencies:
- '@types/trusted-types': 2.0.5
+ '@types/trusted-types': 2.0.7
workbox-core: 6.6.0
- dev: false
- /wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
+ wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
- /wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 5.1.2
+ strip-ansi: 7.1.2
- /write-file-atomic@3.0.3:
- resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+ wrappy@1.0.2: {}
+
+ write-file-atomic@3.0.3:
dependencies:
imurmurhash: 0.1.4
is-typedarray: 1.0.0
signal-exit: 3.0.7
typedarray-to-buffer: 3.1.5
- dev: false
-
- /write-file-atomic@4.0.2:
- resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
- engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
- dependencies:
- imurmurhash: 0.1.4
- signal-exit: 3.0.7
- dev: true
- /write-file-atomic@5.0.1:
- resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ write-file-atomic@5.0.1:
dependencies:
imurmurhash: 0.1.4
signal-exit: 4.1.0
- dev: true
- /write-yaml-file@5.0.0:
- resolution: {integrity: sha512-FdNA4RyH1L43TlvGG8qOMIfcEczwA5ij+zLXUy3Z83CjxhLvcV7/Q/8pk22wnCgYw7PJhtK+7lhO+qqyT4NdvQ==}
- engines: {node: '>=16.14'}
+ write-yaml-file@5.0.0:
dependencies:
js-yaml: 4.1.0
write-file-atomic: 5.0.1
- dev: true
-
- /ws@8.13.0:
- resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
- dev: false
- /xdg-basedir@4.0.0:
- resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
- engines: {node: '>=8'}
- dev: false
+ ws@8.18.3: {}
- /y18n@5.0.8:
- resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
- engines: {node: '>=10'}
+ xdg-basedir@4.0.0: {}
- /yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ xml-name-validator@5.0.0: {}
- /yallist@4.0.0:
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ xmlchars@2.2.0: {}
- /yaml@1.10.2:
- resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
- engines: {node: '>= 6'}
+ y18n@5.0.8: {}
- /yargs-parser@20.2.9:
- resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
- engines: {node: '>=10'}
+ yallist@3.1.1: {}
- /yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
+ yallist@4.0.0: {}
- /yargs@16.2.0:
- resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
- engines: {node: '>=10'}
- dependencies:
- cliui: 7.0.4
- escalade: 3.1.1
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 20.2.9
+ yaml@1.10.2: {}
- /yargs@17.7.1:
- resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==}
- engines: {node: '>=12'}
- dependencies:
- cliui: 8.0.1
- escalade: 3.1.1
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 21.1.1
- dev: false
+ yargs-parser@21.1.1: {}
- /yargs@17.7.2:
- resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
- engines: {node: '>=12'}
+ yargs@17.7.2:
dependencies:
cliui: 8.0.1
- escalade: 3.1.1
+ escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
- /yauzl@2.10.0:
- resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+ yauzl@2.10.0:
dependencies:
buffer-crc32: 0.2.13
fd-slicer: 1.1.0
- dev: false
-
- /yn@3.1.1:
- resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
- engines: {node: '>=6'}
- dev: true
-
- /yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
-
- /yocto-queue@1.0.0:
- resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
- engines: {node: '>=12.20'}
- dev: true
- /zod@3.20.2:
- resolution: {integrity: sha512-1MzNQdAvO+54H+EaK5YpyEy0T+Ejo/7YLHS93G3RnYWh5gaotGHwGeN/ZO687qEDU2y4CdStQYXVHIgrUl5UVQ==}
- dev: false
+ yocto-queue@0.1.0: {}
- /zod@3.22.4:
- resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==}
- dev: false
+ zod@3.25.76: {}
diff --git a/renovate.json b/renovate.json
new file mode 100644
index 0000000..dc2c044
--- /dev/null
+++ b/renovate.json
@@ -0,0 +1,93 @@
+{
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+ "extends": [
+ "config:recommended",
+ ":maintainLockFilesWeekly",
+ ":semanticCommitTypeAll(chore)"
+ ],
+ "timezone": "Europe/Stockholm",
+ "schedule": ["before 6am on Monday"],
+ "prConcurrentLimit": 3,
+ "branchConcurrentLimit": 5,
+ "assignees": ["@adamoldin"],
+ "reviewers": ["@adamoldin"],
+ "packageRules": [
+ {
+ "matchPackagePatterns": ["*"],
+ "rangeStrategy": "bump"
+ },
+ {
+ "groupName": "TypeScript and ESLint",
+ "matchPackageNames": [
+ "typescript",
+ "eslint",
+ "@typescript-eslint/eslint-plugin",
+ "@typescript-eslint/parser"
+ ],
+ "schedule": ["before 6am on Monday"]
+ },
+ {
+ "groupName": "React ecosystem",
+ "matchPackageNames": [
+ "react",
+ "react-dom",
+ "@types/react",
+ "@types/react-dom",
+ "@vitejs/plugin-react"
+ ],
+ "schedule": ["before 6am on Monday"]
+ },
+ {
+ "groupName": "Vite and build tools",
+ "matchPackageNames": [
+ "vite",
+ "vitest",
+ "rollup",
+ "esbuild"
+ ],
+ "schedule": ["before 6am on Monday"]
+ },
+ {
+ "groupName": "Testing libraries",
+ "matchPackageNames": [
+ "@testing-library/react",
+ "@testing-library/jest-dom",
+ "@testing-library/user-event",
+ "jsdom"
+ ],
+ "schedule": ["before 6am on Monday"]
+ },
+ {
+ "matchDepTypes": ["devDependencies"],
+ "automerge": true,
+ "automergeType": "pr",
+ "requiredStatusChecks": null,
+ "matchUpdateTypes": ["patch", "minor"]
+ },
+ {
+ "matchPackageNames": ["node"],
+ "allowedVersions": ">=22.0.0"
+ },
+ {
+ "matchPackageNames": ["pnpm"],
+ "allowedVersions": ">=10.0.0"
+ }
+ ],
+ "lockFileMaintenance": {
+ "enabled": true,
+ "schedule": ["before 6am on Monday"]
+ },
+ "vulnerabilityAlerts": {
+ "enabled": true,
+ "schedule": ["at any time"]
+ },
+ "osvVulnerabilityAlerts": true,
+ "commitMessagePrefix": "chore(deps): ",
+ "commitMessageAction": "update",
+ "commitMessageTopic": "{{depName}}",
+ "commitMessageExtra": "to {{newVersion}}",
+ "prTitle": "{{commitMessagePrefix}}{{commitMessageAction}} {{commitMessageTopic}}{{commitMessageExtra}}",
+ "prBodyTemplate": "This PR updates {{depName}} from {{currentVersion}} to {{newVersion}}.\n\n{{{updateType}}} update\n\n{{{notes}}}\n\n{{{changelogs}}}",
+ "labels": ["dependencies", "renovate"],
+ "addLabels": ["automerge"]
+}
\ No newline at end of file
diff --git a/tsconfig.base.json b/tsconfig.base.json
new file mode 100644
index 0000000..646d881
--- /dev/null
+++ b/tsconfig.base.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "strict": true,
+ "target": "ESNext",
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "forceConsistentCasingInFileNames": true,
+ "skipLibCheck": true,
+ "resolveJsonModule": true,
+ "paths": {
+ "@devolunch/shared": ["packages/shared/src/index.ts"],
+ "@devolunch/shared/*": ["packages/shared/src/*"]
+ },
+ "isolatedModules": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "declaration": true,
+ "sourceMap": true
+ },
+ "exclude": ["node_modules", "dist", "build"]
+}
diff --git a/turbo.json b/turbo.json
index ecec9ae..324d2b9 100644
--- a/turbo.json
+++ b/turbo.json
@@ -1,29 +1,41 @@
{
"$schema": "https://turbo.build/schema.json",
- "pipeline": {
+ "globalEnv": ["NODE_ENV"],
+ "globalDependencies": ["**/.env.*local"],
+ "tasks": {
"build": {
- "outputs": ["dist/**/*"],
- "dependsOn": ["^build"]
+ "dependsOn": ["^build"],
+ "inputs": ["src/**/*.{ts,tsx,js,jsx}", "package.json", "tsconfig*.json"],
+ "outputs": ["dist/**", "build/**"]
},
"dev": {
"cache": false,
- "persistent": true
+ "persistent": true,
+ "dependsOn": ["^build"]
},
- "test": {
- "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"]
+ "typecheck": {
+ "dependsOn": ["^build"],
+ "inputs": ["src/**/*.{ts,tsx}", "**/*.d.ts", "tsconfig*.json"]
},
- "clean": {
- "cache": false
+ "lint": {
+ "dependsOn": ["^build"],
+ "inputs": ["src/**/*.{ts,tsx,js,jsx}", "eslint.config.js", ".prettierrc.js"]
},
- "lint": {},
"format": {
- "cache": false
+ "cache": false,
+ "inputs": ["src/**/*.{ts,tsx,js,jsx,json,md}", ".prettierrc.js"]
},
- "lint:fix": {
- "cache": false
+ "test": {
+ "dependsOn": ["^build"],
+ "inputs": ["src/**/*.{ts,tsx}", "test/**/*.{ts,tsx}", "**/*.test.{ts,tsx}", "vitest.config.ts"],
+ "outputs": ["coverage/**"]
},
- "typecheck": {
- "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"]
+ "test:watch": {
+ "cache": false,
+ "persistent": true
+ },
+ "clean": {
+ "cache": false
}
}
}