(null)
-
- const showTooltip = (): void => {
- if (timeoutRef.current) {
- clearTimeout(timeoutRef.current)
- }
- timeoutRef.current = setTimeout(() => setIsVisible(true), delay)
- }
-
- const hideTooltip = (): void => {
- if (timeoutRef.current) {
- clearTimeout(timeoutRef.current)
- }
- setIsVisible(false)
- }
-
- const getTooltipClasses = (): string => {
- const baseClasses =
- 'absolute z-50 px-3 py-2 text-sm text-white bg-gray-900 dark:bg-gray-700 rounded-md shadow-md whitespace-nowrap pointer-events-none transition-opacity duration-200'
-
- const placementClasses = {
- top: 'bottom-full left-1/2 transform -translate-x-1/2 mb-2',
- bottom: 'top-full left-1/2 transform -translate-x-1/2 mt-2',
- left: 'right-full top-1/2 transform -translate-y-1/2 mr-2',
- right: 'left-full top-1/2 transform -translate-y-1/2 ml-2',
- }
-
- return `${baseClasses} ${placementClasses[placement]} ${isVisible ? 'opacity-100' : 'opacity-0'}`
- }
-
- const getArrowClasses = (): string => {
- const baseClasses =
- 'absolute w-2 h-2 bg-gray-900 dark:bg-gray-700 transform rotate-45'
-
- const arrowClasses = {
- top: 'top-full left-1/2 transform -translate-x-1/2 -mt-1',
- bottom: 'bottom-full left-1/2 transform -translate-x-1/2 -mb-1',
- left: 'left-full top-1/2 transform -translate-y-1/2 -ml-1',
- right: 'right-full top-1/2 transform -translate-y-1/2 -mr-1',
- }
-
- return `${baseClasses} ${arrowClasses[placement]}`
- }
-
- return (
-
- {React.cloneElement(children, {
- onMouseEnter: showTooltip,
- onMouseLeave: hideTooltip,
- onFocus: showTooltip,
- onBlur: hideTooltip,
- })}
-
- {isVisible && (
-
- )}
-
- )
-}
diff --git a/components/chart.tsx b/components/chart.tsx
deleted file mode 100644
index 58ac1c7..0000000
--- a/components/chart.tsx
+++ /dev/null
@@ -1,134 +0,0 @@
-import {
- FlexibleWidthXYPlot,
- VerticalBarSeries,
- HorizontalGridLines,
- XAxis,
- YAxis,
-} from 'react-vis'
-import useInfusions from 'lib/hooks/useInfusions'
-import { filterInfusions } from 'lib/helpers'
-import { TreatmentTypeEnum } from 'lib/db/infusions'
-
-// Dynamically load react-vis CSS only when Chart component is used
-if (typeof window !== 'undefined') {
- const link = document.createElement('link')
- link.rel = 'stylesheet'
- link.href = 'https://unpkg.com/react-vis/dist/style.css'
- if (!document.querySelector(`link[href="${link.href}"]`)) {
- document.head.appendChild(link)
- }
-}
-
-type ChartEntry = {
- x: string
- y: number
-}
-
-interface ChartProps {
- filterYear: string
-}
-
-export default function Chart(props: ChartProps): JSX.Element | null {
- const { filterYear } = props
- const { data } = useInfusions()
-
- if (!data) {
- return null
- }
-
- const filteredInfusions = filterInfusions(data, filterYear)
-
- const bleeds = filteredInfusions
- .filter((entry) => entry.type === TreatmentTypeEnum.BLEED)
- .map((bleed) => bleed.date)
-
- const preventative = filteredInfusions
- .filter((entry) => entry.type === TreatmentTypeEnum.PREVENTATIVE)
- .map((preventitive) => preventitive.date)
-
- const prophy = filteredInfusions
- .filter((entry) => entry.type === TreatmentTypeEnum.PROPHY)
- .map((prophy) => prophy.date)
-
- const antibody = filteredInfusions
- .filter((entry) => entry.type === TreatmentTypeEnum.ANTIBODY)
- .map((antibody) => antibody.date)
-
- const chartSchema: ChartEntry[] = [
- { x: 'Jan', y: 0 },
- { x: 'Feb', y: 0 },
- { x: 'Mar', y: 0 },
- { x: 'Apr', y: 0 },
- { x: 'May', y: 0 },
- { x: 'Jun', y: 0 },
- { x: 'Jul', y: 0 },
- { x: 'Aug', y: 0 },
- { x: 'Sep', y: 0 },
- { x: 'Oct', y: 0 },
- { x: 'Nov', y: 0 },
- { x: 'Dec', y: 0 },
- ]
-
- // clones array using value rather than reference
- const bleedData = JSON.parse(JSON.stringify(chartSchema))
- const preventativeData = JSON.parse(JSON.stringify(chartSchema))
- const prophyData = JSON.parse(JSON.stringify(chartSchema))
- const antibodyData = JSON.parse(JSON.stringify(chartSchema))
-
- // distribute infusions into months
- const distributeInfusions = (infusions: string[], data: ChartEntry[]) => {
- for (const infusion of infusions) {
- // Extract month from YYYY-MM-DD format (zero-based index)
- const monthIndex = Number.parseInt(infusion.split('-')[1], 10) - 1
- data[monthIndex].y = data[monthIndex].y + 1
- }
- }
-
- distributeInfusions(bleeds, bleedData)
- distributeInfusions(preventative, preventativeData)
- distributeInfusions(prophy, prophyData)
- distributeInfusions(antibody, antibodyData)
-
- // determine the highest number of grouped infunsions to
- // create a max value used to set the height of the chart
- const bleedNumbers = bleedData.map((infusion: ChartEntry) => infusion.y)
- const preventativeNumbers = preventativeData.map(
- (infusion: ChartEntry) => infusion.y
- )
- const prophyNumbers = prophyData.map((infusion: ChartEntry) => infusion.y)
- const antibodyNumbers = antibodyData.map((infusion: ChartEntry) => infusion.y)
-
- const largestNumberOfBleeds = Math.max(...bleedNumbers)
- const largestNumberOfPreventative = Math.max(...preventativeNumbers)
- const largestNumberOfProphy = Math.max(...prophyNumbers)
- const largestNumberOfAntibody = Math.max(...antibodyNumbers)
-
- const maxY =
- largestNumberOfBleeds +
- largestNumberOfPreventative +
- largestNumberOfProphy +
- largestNumberOfAntibody
-
- return (
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/components/feedbackFishFooter.tsx b/components/feedbackFishFooter.tsx
deleted file mode 100644
index 0e88c1d..0000000
--- a/components/feedbackFishFooter.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-// import { FeedbackFish } from '@feedback-fish/react'
-
-export default function Footer(): JSX.Element {
- // NOTE(michael): testing out https://feedback.fish.
- // const PROJECT_ID = process.env.FEEDBACK_FISH_PROJECT_ID
-
- return (
-
- )
-}
diff --git a/components/identity.tsx b/components/identity.tsx
deleted file mode 100644
index c1b0520..0000000
--- a/components/identity.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { useAuth } from 'lib/auth'
-
-export default function Identity(): JSX.Element {
- const { user } = useAuth()
-
- return (
-
- {!user ? (
-
Loading user...
- ) : (
- <>
-
- {user.photoUrl ? (
-
- ) : (
-
- {user.displayName?.charAt(0) || '?'}
-
- )}
-
-
-
- {user.displayName}
-
- >
- )}
-
- )
-}
diff --git a/components/logo.tsx b/components/logo.tsx
deleted file mode 100644
index 4cd90d6..0000000
--- a/components/logo.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import React from 'react'
-import Image from 'next/image'
-import Link from 'next/link'
-
-export default function Logo(): JSX.Element {
- const [isMobile, setIsMobile] = React.useState(false)
-
- React.useEffect(() => {
- const checkMobile = () => {
- setIsMobile(window.innerWidth < 640) // Tailwind's sm breakpoint
- }
-
- checkMobile()
- window.addEventListener('resize', checkMobile)
- return () => window.removeEventListener('resize', checkMobile)
- }, [])
-
- return (
-
- {/** biome-ignore lint/a11y/useValidAnchor: href provided by Link */}
-
-
-
-
- )
-}
diff --git a/components/withAuth.tsx b/components/withAuth.tsx
deleted file mode 100644
index 9fbdfca..0000000
--- a/components/withAuth.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import dynamic from 'next/dynamic'
-import type { ComponentType } from 'react'
-import LoadingScreen from 'components/loadingScreen'
-
-// Dynamically import AuthProvider to avoid loading Firebase on public pages
-const AuthProvider = dynamic(
- () => import('lib/auth').then((mod) => mod.AuthProvider),
- {
- ssr: false,
- loading: () => ,
- }
-)
-
-// HOC that wraps a page component with AuthProvider
-export function withAuth(
- WrappedComponent: ComponentType
-): ComponentType
{
- const WithAuthComponent = (props: P) => {
- return (
-
-
-
- )
- }
-
- // Copy display name for debugging
- const displayName =
- WrappedComponent.displayName || WrappedComponent.name || 'Component'
- WithAuthComponent.displayName = `withAuth(${displayName})`
-
- return WithAuthComponent
-}
-
-// Wrapper component for use with getLayout pattern
-export function AuthWrapper({ children }: { children: React.ReactNode }) {
- return {children}
-}
diff --git a/firebase.json b/firebase.json
index 39139ea..6cbaca3 100644
--- a/firebase.json
+++ b/firebase.json
@@ -1,7 +1,7 @@
{
"firestore": {
- "rules": "firestore.rules",
- "indexes": "firestore.indexes.json"
+ "rules": "firebase/firestore.rules",
+ "indexes": "firebase/firestore.indexes.json"
},
"emulators": {
"auth": {
diff --git a/firestore.dev.rules b/firebase/firestore.dev.rules
similarity index 100%
rename from firestore.dev.rules
rename to firebase/firestore.dev.rules
diff --git a/firestore.indexes.json b/firebase/firestore.indexes.json
similarity index 100%
rename from firestore.indexes.json
rename to firebase/firestore.indexes.json
diff --git a/firestore.prod.rules b/firebase/firestore.prod.rules
similarity index 100%
rename from firestore.prod.rules
rename to firebase/firestore.prod.rules
diff --git a/firestore.rules b/firebase/firestore.rules
similarity index 100%
rename from firestore.rules
rename to firebase/firestore.rules
diff --git a/lib/auth-provider-wrapper.tsx b/lib/auth-provider-wrapper.tsx
deleted file mode 100644
index 1a3a07f..0000000
--- a/lib/auth-provider-wrapper.tsx
+++ /dev/null
@@ -1,2 +0,0 @@
-// Wrapper file for dynamic import compatibility
-export { AuthProvider as default } from './auth'
diff --git a/lib/auth.tsx b/lib/auth.tsx
deleted file mode 100644
index 2a59b65..0000000
--- a/lib/auth.tsx
+++ /dev/null
@@ -1,352 +0,0 @@
-import { useState, useEffect, useContext, createContext } from 'react'
-import cookie from 'js-cookie'
-import {
- signInWithPopup,
- signInWithEmailAndPassword,
- createUserWithEmailAndPassword,
- signOut as firebaseSignOut,
- onIdTokenChanged,
- GoogleAuthProvider,
- type User,
-} from 'firebase/auth'
-
-import { getAuth, firestore, collection, doc, getDoc } from 'lib/firebase'
-import { createUser } from 'lib/db/users'
-import { generateUniqueString } from 'lib/helpers'
-import LoadingScreen from 'components/loadingScreen'
-import type { UserType } from 'lib/types/users'
-import Router from 'next/router'
-
-type ContextProps = {
- user: UserType | null
- loading?: boolean
- signout: () => Promise
- signinWithGoogle: (redirect: string) => Promise
- signinWithTestUser: () => Promise
-}
-
-// Default context for pages without AuthProvider (public pages)
-// loading: false means we're not waiting for auth, user: null means not authenticated
-const authContext = createContext>({
- user: null,
- loading: false,
-})
-
-export function AuthProvider({
- children,
-}: {
- children: React.ReactNode
-}): React.ReactElement {
- const auth = useProvideAuth()
- if (typeof window === 'undefined') {
- return <>{children}>
- }
- return {children}
-}
-
-export const useAuth = () => useContext(authContext)
-
-// Global state to persist auth across page navigations
-let globalUser: UserType | null = null
-let globalLoading = true
-let authListenerInitialized = false
-
-function useProvideAuth() {
- // Initialize with global state to persist across page navigations
- const [user, setUser] = useState(globalUser)
- const [loading, setLoading] = useState(globalLoading)
-
- const handleUser = async (rawUser: User | null) => {
- if (rawUser) {
- const formattedUser = await formatUser(rawUser)
- const db = firestore.instance
-
- if (db) {
- const userDocRef = doc(collection(db, 'users'), formattedUser.uid)
- const dbUserSnap = await getDoc(userDocRef)
-
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- const { ...userWithoutToken } = formattedUser
-
- // TODO(michael) If user already exist then remove alertId
- // so it isn't overwritten when the user is updated on `createUser`
- // and overwrite the alertId created in the formatter.
- // This needs to be cleaned up.
- if (dbUserSnap.exists()) {
- const dbData = dbUserSnap.data()
- formattedUser.alertId = dbData?.alertId
- formattedUser.isAdmin = dbData?.isAdmin
- formattedUser.apiKey = dbData?.apiKey
- formattedUser.medication = dbData?.medication || ''
- formattedUser.monoclonalAntibody = dbData?.monoclonalAntibody || ''
- delete userWithoutToken.alertId
- }
-
- await createUser(formattedUser.uid, userWithoutToken)
- }
-
- // Update both local and global state
- globalUser = formattedUser
- globalLoading = false
- setUser(formattedUser)
- setLoading(false)
-
- cookie.set('hemolog-auth', {
- expires: 1,
- })
-
- return formattedUser
- } else {
- // Update both local and global state
- globalUser = null
- globalLoading = false
- setUser(null)
- setLoading(false)
-
- cookie.remove('hemolog-auth')
-
- return false
- }
- }
-
- const signinWithGoogle = async (redirect: string) => {
- if (process.env.NEXT_PUBLIC_USE_EMULATORS) {
- console.warn(
- 'Google sign-in is disabled when NEXT_PUBLIC_USE_EMULATORS is enabled. Use the Test User button instead.'
- )
- setLoading(false)
- return
- }
-
- setLoading(true)
- const auth = getAuth()
-
- if (!auth) {
- console.error('Firebase auth not available for Google sign-in')
- setLoading(false)
- return
- }
-
- try {
- const provider = new GoogleAuthProvider()
- const result = await signInWithPopup(auth, provider)
- await handleUser(result.user)
-
- if (redirect) {
- Router.push(redirect)
- }
- } catch (error) {
- console.error('Google sign-in error:', error)
- setLoading(false)
- }
- }
-
- const signinWithTestUser = async () => {
- setLoading(true)
-
- if (typeof window === 'undefined') {
- console.error('Error: Cannot sign in on server-side')
- setLoading(false)
- return
- }
-
- const auth = getAuth()
-
- if (!auth) {
- console.error(
- 'Error: Firebase auth not available. Make sure Firebase is initialized and emulator is running.'
- )
- setLoading(false)
- return
- }
-
- const testEmail = 'michael+test@hemolog.com'
- const testPassword = 'test123'
-
- try {
- // Try to sign in directly first (user might already exist)
- const signInResponse = await signInWithEmailAndPassword(
- auth,
- testEmail,
- testPassword
- )
- if (signInResponse.user) {
- await handleUser(signInResponse.user)
- Router.push('/home')
- return
- }
- } catch (signInError: unknown) {
- // If user doesn't exist, create them
- const error =
- signInError && typeof signInError === 'object' && 'code' in signInError
- ? (signInError as { code?: string })
- : null
-
- const isUserNotFound =
- error?.code === 'auth/user-not-found' ||
- error?.code === 'auth/invalid-credential'
-
- if (!isUserNotFound) {
- console.error('Sign in error:', signInError)
- setLoading(false)
- return
- }
-
- // User doesn't exist, create them using Firebase SDK
- try {
- const createResponse = await createUserWithEmailAndPassword(
- auth,
- testEmail,
- testPassword
- )
- if (createResponse.user) {
- await handleUser(createResponse.user)
- Router.push('/home')
- return
- }
- } catch (createError: unknown) {
- // If email already exists (race condition), try signing in again
- const createErr =
- createError &&
- typeof createError === 'object' &&
- 'code' in createError
- ? (createError as { code?: string })
- : null
-
- if (createErr?.code === 'auth/email-already-in-use') {
- try {
- const retrySignIn = await signInWithEmailAndPassword(
- auth,
- testEmail,
- testPassword
- )
- if (retrySignIn.user) {
- await handleUser(retrySignIn.user)
- Router.push('/home')
- return
- }
- } catch (retryError) {
- console.error('Retry sign in error:', retryError)
- }
- } else {
- console.error('Create user error:', createError)
- }
- setLoading(false)
- }
- }
- }
-
- const signout = async () => {
- Router.push('/signin')
- const auth = getAuth()
- if (!auth) {
- await handleUser(null)
- return
- }
- await firebaseSignOut(auth)
- await handleUser(null)
- }
-
- // biome-ignore lint/correctness/useExhaustiveDependencies: handleUser is stable and would cause infinite re-renders
- useEffect(() => {
- // Only initialize auth listener on client-side when Firebase is available
- if (typeof window === 'undefined') {
- setLoading(false)
- return
- }
-
- const auth = getAuth()
-
- if (!auth) {
- globalLoading = false
- setLoading(false)
- return
- }
-
- // If we already have a user from a previous page, sync local state
- if (globalUser && !user) {
- setUser(globalUser)
- setLoading(false)
- return
- }
-
- // Only set up listener once globally to avoid duplicate listeners
- if (authListenerInitialized) {
- // Sync with global state
- setUser(globalUser)
- setLoading(globalLoading)
- return
- }
-
- authListenerInitialized = true
- const unsubscribe = onIdTokenChanged(auth, handleUser)
- return () => {
- unsubscribe()
- authListenerInitialized = false
- }
- }, [])
-
- return {
- user,
- loading,
- signinWithGoogle,
- signinWithTestUser,
- signout,
- }
-}
-
-const formatUser = async (rawUser: User): Promise => {
- let token = ''
- try {
- const idTokenResult = await rawUser.getIdTokenResult()
- token = idTokenResult.token
- } catch {
- // Token retrieval failed, continue without token
- }
-
- const alertId = await generateUniqueString(6)
-
- return {
- alertId,
- email: rawUser.email || '',
- name: rawUser.displayName || '',
- photoUrl: rawUser.photoURL || undefined,
- provider: rawUser.providerData?.[0]?.providerId || 'password',
- token: token || '',
- uid: rawUser.uid,
- }
-}
-
-// NOTE(michael) This takes care of protecting unauthed users
-// from seeing any protected pages. This could be handled better,
-// but this works for now
-export function ProtectRoute({
- children,
-}: {
- children: React.ReactNode
-}): React.ReactElement | null {
- const { user, loading } = useAuth()
- if (typeof window === 'undefined') return null
-
- if (loading && !user) {
- return
- }
-
- const { pathname } = window.location
-
- if (!user) {
- // allow access to signin and emergency pages
- if (pathname === '/signin' || pathname.includes('emergency')) {
- return <>{children}>
- }
-
- // Redirect to signin for all other routes when not authenticated
- if (typeof window !== 'undefined') {
- Router.replace('/signin')
- return
- }
- return null
- }
-
- return <>{children}>
-}
diff --git a/lib/db/feedback.ts b/lib/db/feedback.ts
deleted file mode 100644
index 191f5b8..0000000
--- a/lib/db/feedback.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import {
- firestore,
- collection,
- doc,
- addDoc,
- deleteDoc,
- updateDoc,
-} from 'lib/firebase'
-import type { AttachedUserType } from 'lib/types/users'
-
-export interface FeedbackType {
- createdAt: string
- message: string
- user: AttachedUserType
-}
-
-// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
-function cleanUndefined(obj: T): Partial {
- return Object.fromEntries(
- Object.entries(obj).filter(([, v]) => v !== undefined)
- ) as Partial
-}
-
-function createFeedback(data: FeedbackType) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve({ id: '' })
- }
-
- return addDoc(collection(db, 'feedback'), cleanUndefined(data))
-}
-
-function deleteFeedback(uid: string) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve()
- }
-
- return deleteDoc(doc(collection(db, 'feedback'), uid))
-}
-
-function updateFeedback(uid: string, newValues: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve()
- }
-
- return updateDoc(
- doc(collection(db, 'feedback'), uid),
- cleanUndefined(newValues)
- )
-}
-
-export { createFeedback, deleteFeedback, updateFeedback }
diff --git a/lib/db/infusions.ts b/lib/db/infusions.ts
deleted file mode 100644
index 1686697..0000000
--- a/lib/db/infusions.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import {
- firestore,
- collection,
- doc,
- addDoc,
- setDoc,
- updateDoc,
-} from 'lib/firebase'
-import type { AttachedUserType } from 'lib/types/users'
-
-export enum TreatmentTypeEnum {
- PROPHY = 'PROPHY',
- BLEED = 'BLEED',
- PREVENTATIVE = 'PREVENTATIVE',
- ANTIBODY = 'ANTIBODY',
-}
-
-export type TreatmentTypeOptions =
- | TreatmentTypeEnum.PROPHY
- | TreatmentTypeEnum.BLEED
- | TreatmentTypeEnum.PREVENTATIVE
- | TreatmentTypeEnum.ANTIBODY
-
-export interface Medication {
- brand: string
- costPerUnit?: number
- lot?: string
- units: number
-}
-
-export interface TreatmentType {
- deletedAt: string | null
- uid?: string
- cause: string
- createdAt: string
- date: string
- medication: Medication
- sites: string
- type: TreatmentTypeOptions
- user: AttachedUserType
-}
-
-// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
-function cleanUndefined(obj: T): Partial {
- return Object.fromEntries(
- Object.entries(obj).filter(([, v]) => v !== undefined)
- ) as Partial
-}
-
-// NOTE(michael) this might be a bad way of adding the doc id.
-// Probably worth searching for another solution.
-async function createInfusion(data: TreatmentType) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- const cleanData = cleanUndefined(data)
- const infusionsRef = collection(db, 'infusions')
- const docRef = await addDoc(infusionsRef, cleanData)
- await setDoc(docRef, { uid: docRef.id, ...cleanData }, { merge: true })
-}
-
-function deleteInfusion(uid: string) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve()
- }
-
- const infusionDocRef = doc(collection(db, 'infusions'), uid)
- return setDoc(
- infusionDocRef,
- { deletedAt: new Date().toISOString() },
- { merge: true }
- )
-}
-
-async function updateInfusion(uid: string, newValues: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- const cleanValues = cleanUndefined(newValues)
- const infusionDocRef = doc(collection(db, 'infusions'), uid)
- return updateDoc(infusionDocRef, cleanValues)
-}
-
-export { createInfusion, deleteInfusion, updateInfusion }
diff --git a/lib/db/users.ts b/lib/db/users.ts
deleted file mode 100644
index c05c016..0000000
--- a/lib/db/users.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import {
- firestore,
- collection,
- doc,
- setDoc,
- updateDoc,
- deleteDoc,
- query,
- where,
- getDocs,
- writeBatch,
-} from 'lib/firebase'
-import type { UserType } from 'lib/types/users'
-
-async function createUser(uid: string, data: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- try {
- // Filter out undefined values - Firestore doesn't accept them
- const cleanData = Object.fromEntries(
- Object.entries({ uid, ...data }).filter(([, v]) => v !== undefined)
- )
- const userDocRef = doc(collection(db, 'users'), uid)
- await setDoc(userDocRef, cleanData, { merge: true })
- } catch (error) {
- console.error(error)
- }
-}
-
-async function deleteUser(uid: string) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- const userDocRef = doc(collection(db, 'users'), uid)
- await deleteDoc(userDocRef)
-
- const infusionsQuery = query(
- collection(db, 'infusions'),
- where('user.uid', '==', uid)
- )
- const snapshot = await getDocs(infusionsQuery)
-
- const batch = writeBatch(db)
- snapshot.forEach((docSnap) => {
- batch.delete(docSnap.ref)
- })
-
- return batch.commit()
-}
-
-async function updateUser(uid: string, newValues: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- // Filter out undefined values - Firestore doesn't accept them
- const cleanValues = Object.fromEntries(
- Object.entries(newValues).filter(([, v]) => v !== undefined)
- )
- const userDocRef = doc(collection(db, 'users'), uid)
- return updateDoc(userDocRef, cleanValues)
-}
-
-export { createUser, deleteUser, updateUser }
diff --git a/lib/fetcher.ts b/lib/fetcher.ts
deleted file mode 100644
index cd8a565..0000000
--- a/lib/fetcher.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import fetch from 'isomorphic-unfetch'
-
-const fetcher = async (
- input: RequestInfo,
- token: string
-): Promise => {
- const res = await fetch(input, {
- method: 'GET',
- headers: new Headers({ 'Content-Type': 'application/json', token }),
- credentials: 'same-origin',
- })
- return res.json()
-}
-
-export default fetcher
diff --git a/lib/firebase.ts b/lib/firebase.ts
deleted file mode 100644
index 846a402..0000000
--- a/lib/firebase.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-// firebase.ts
-// Initializes firebase across app for auth and firestore using modular v9+ API
-
-import { initializeApp, getApps, type FirebaseApp } from 'firebase/app'
-import {
- getFirestore,
- connectFirestoreEmulator,
- type Firestore,
-} from 'firebase/firestore'
-import {
- getAuth as getFirebaseAuth,
- connectAuthEmulator,
- type Auth,
-} from 'firebase/auth'
-
-const firebaseConfig = {
- apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY || 'development',
- authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || 'localhost',
- projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || 'hemolog',
-}
-
-// Singleton instances
-let firebaseApp: FirebaseApp | null = null
-let firestoreInstance: Firestore | null = null
-let authInstance: Auth | null = null
-let firestoreEmulatorConnected = false
-let authEmulatorConnected = false
-
-// Initialize Firebase app (only on client-side)
-function getApp(): FirebaseApp | null {
- if (typeof window === 'undefined') {
- return null
- }
-
- if (!firebaseApp) {
- const apps = getApps()
- if (apps.length === 0) {
- firebaseApp = initializeApp(firebaseConfig)
- } else {
- firebaseApp = apps[0]
- }
- }
-
- return firebaseApp
-}
-
-// Get Firestore instance
-function getFirestoreInstance(): Firestore | null {
- if (typeof window === 'undefined') {
- return null
- }
-
- const app = getApp()
- if (!app) {
- return null
- }
-
- if (!firestoreInstance) {
- firestoreInstance = getFirestore(app)
-
- // Connect to emulator if developing locally
- if (process.env.NEXT_PUBLIC_USE_EMULATORS && !firestoreEmulatorConnected) {
- try {
- connectFirestoreEmulator(firestoreInstance, 'localhost', 8082)
- firestoreEmulatorConnected = true
- } catch {
- // Emulator already connected, ignore
- }
- }
- }
-
- return firestoreInstance
-}
-
-// Get Auth instance
-export function getAuth(): Auth | null {
- if (typeof window === 'undefined') {
- return null
- }
-
- const app = getApp()
- if (!app) {
- return null
- }
-
- if (!authInstance) {
- authInstance = getFirebaseAuth(app)
-
- // Connect to emulator if developing locally
- if (process.env.NEXT_PUBLIC_USE_EMULATORS && !authEmulatorConnected) {
- try {
- connectAuthEmulator(authInstance, 'http://localhost:9099', {
- disableWarnings: true,
- })
- authEmulatorConnected = true
- } catch {
- // Emulator already connected, ignore
- }
- }
- }
-
- return authInstance
-}
-
-// Export firestore getter - components should use this
-export const firestore = {
- get instance(): Firestore | null {
- return getFirestoreInstance()
- },
-}
-
-// Re-export only the Firestore functions we actually use
-export {
- collection,
- doc,
- getDoc,
- getDocs,
- setDoc,
- updateDoc,
- deleteDoc,
- addDoc,
- query,
- where,
- limit,
- onSnapshot,
- writeBatch,
-} from 'firebase/firestore'
diff --git a/lib/helpers.ts b/lib/helpers.ts
deleted file mode 100644
index cb02def..0000000
--- a/lib/helpers.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { customAlphabet } from 'nanoid/async'
-import { getYear } from 'date-fns'
-import type { TreatmentType } from 'lib/db/infusions'
-
-async function generateUniqueString(length = 6) {
- // removed 'i' and 'l' for clarity when reading the id on different mediums i.e. (paper, url)
- const alphabet = '0123456789ABCDEFGHJKMNOPQRSTUVWXYZabcdefghjkmnopqrstuvwxyz'
- const nanoid = customAlphabet(alphabet, length)
- const uniqueString = await nanoid()
-
- return uniqueString
-}
-
-const filterInfusions = (data: TreatmentType[], filterYear: string) =>
- data && filterYear !== 'All time'
- ? data.filter((d) => {
- const [year, month, day] = d.date.split('-').map(Number)
- return (
- getYear(new Date(year, month - 1, day)) ===
- Number.parseInt(filterYear, 10)
- )
- })
- : data
-
-export { generateUniqueString, filterInfusions }
-
-/**
- * Track an event using the onedollarstats.com client.
- * Internally uses category "Event".
- * @param action - The event action (e.g., "Logged Infusion")
- * @param properties - Optional event properties
- */
-export const track = (
- action: string,
- properties: Record = {}
-): void => {
- if (typeof window !== 'undefined' && window.stonks) {
- window.stonks.event('Event', action, properties)
- }
-}
diff --git a/lib/hooks/useDbUser.ts b/lib/hooks/useDbUser.ts
deleted file mode 100644
index c9de79c..0000000
--- a/lib/hooks/useDbUser.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useMemo } from 'react'
-import { firestore, collection, query, where } from 'lib/firebase'
-import useFirestoreQuery, {
- type FirestoreStatusType,
-} from 'lib/hooks/useFirestoreQuery'
-import type { Person } from 'lib/types/person'
-
-// TODO(michaelwschultz): move FirestoreStatusTypes to a more general place
-type FirestoreStatusTypes = FirestoreStatusType
-
-interface FirestoreUserResponse {
- person: Person | null
- status: FirestoreStatusTypes
- error: Error | null
-}
-
-export default function useDbUser(
- uid: string | string[]
-): FirestoreUserResponse {
- // Normalize uid to string
- const normalizedUid = Array.isArray(uid) ? uid[0] : uid
-
- // Memoize the query to prevent unnecessary re-subscriptions
- const firestoreQuery = useMemo(() => {
- const db = firestore.instance
- if (!db || !normalizedUid) {
- return null
- }
-
- return query(collection(db, 'users'), where('uid', '==', normalizedUid))
- }, [normalizedUid])
-
- const { data, status, error } = useFirestoreQuery(firestoreQuery)
-
- let person: Person | null = null
- if (data && Array.isArray(data) && data.length > 0) {
- person = data[0] as Person
- }
-
- return {
- person,
- status,
- error: error ?? null,
- }
-}
diff --git a/lib/hooks/useEmergencyUser.ts b/lib/hooks/useEmergencyUser.ts
deleted file mode 100644
index 460f794..0000000
--- a/lib/hooks/useEmergencyUser.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { useMemo } from 'react'
-import {
- firestore,
- collection,
- query,
- where,
- limit as firestoreLimit,
-} from 'lib/firebase'
-import useFirestoreQuery, {
- type FirestoreStatusType,
-} from 'lib/hooks/useFirestoreQuery'
-import type { Person } from 'lib/types/person'
-
-// TODO move FirestoreStatusTypes to a more general place
-type FirestoreStatusTypes = FirestoreStatusType
-
-interface FirestoreUserResponse {
- person: Person | null
- status: FirestoreStatusTypes
- error: Error | null
-}
-
-export default function useEmergencyUser(
- alertId?: string | string[]
-): FirestoreUserResponse {
- // Normalize alertId to string
- const normalizedAlertId = Array.isArray(alertId) ? alertId[0] : alertId
-
- // Memoize the query to prevent unnecessary re-subscriptions
- const firestoreQuery = useMemo(() => {
- const db = firestore.instance
- if (!db) {
- return null
- }
-
- return query(
- collection(db, 'users'),
- where('alertId', '==', normalizedAlertId || ''),
- firestoreLimit(1)
- )
- }, [normalizedAlertId])
-
- const { data, status, error } = useFirestoreQuery(firestoreQuery)
-
- let person: Person | undefined
- if (data && Array.isArray(data) && data.length > 0) {
- person = data[0] as Person
- }
-
- return {
- person: person ?? null,
- status,
- error: error ?? null,
- }
-}
diff --git a/lib/hooks/useFirestoreQuery.ts b/lib/hooks/useFirestoreQuery.ts
deleted file mode 100644
index 6cacb3b..0000000
--- a/lib/hooks/useFirestoreQuery.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-// Reducer for hook state and actions
-import { useReducer, useEffect, useRef } from 'react'
-import {
- onSnapshot,
- type Query,
- type DocumentReference,
- type QuerySnapshot,
- type DocumentSnapshot,
- type DocumentData,
-} from 'firebase/firestore'
-
-export enum FirestoreStatusType {
- IDLE = 'idle',
- LOADING = 'loading',
- SUCCESS = 'success',
- ERROR = 'error',
-}
-
-interface Action {
- type: FirestoreStatusType
- payload?: T
-}
-
-interface State {
- status: FirestoreStatusType
- data: T | undefined
- error: Error | undefined
-}
-
-const reducer = (_state: State, action: Action): State => {
- switch (action.type) {
- case FirestoreStatusType.IDLE:
- return {
- status: FirestoreStatusType.IDLE,
- data: undefined,
- error: undefined,
- }
- case FirestoreStatusType.LOADING:
- return {
- status: FirestoreStatusType.LOADING,
- data: undefined,
- error: undefined,
- }
- case FirestoreStatusType.SUCCESS:
- return {
- status: FirestoreStatusType.SUCCESS,
- data: action.payload,
- error: undefined,
- }
- case FirestoreStatusType.ERROR:
- return {
- status: FirestoreStatusType.ERROR,
- data: undefined,
- error: action.payload as Error | undefined,
- }
- default:
- throw new Error('invalid action')
- }
-}
-
-type FirestoreQueryType =
- | Query
- | DocumentReference
-
-// Hook
-export default function useFirestoreQuery(
- query: FirestoreQueryType | null | undefined
-) {
- // Our initial state
- // Start with an "idle" status if query is falsy, as that means hook consumer is
- // waiting on required data before creating the query object.
- const initialState: State = {
- status: query ? FirestoreStatusType.LOADING : FirestoreStatusType.IDLE,
- data: undefined,
- error: undefined,
- }
-
- // Setup our state and actions
- const [state, dispatch] = useReducer(reducer, initialState)
-
- // Track the previous query to avoid re-subscribing unnecessarily
- const prevQueryRef = useRef(null)
-
- useEffect(() => {
- // Return early if query is falsy and reset to "idle" status
- if (!query) {
- dispatch({ type: FirestoreStatusType.IDLE })
- return
- }
-
- // Check if query changed (simple reference equality)
- // For v9, we rely on the consumer to memoize their queries
- if (prevQueryRef.current === query) {
- return
- }
- prevQueryRef.current = query
-
- dispatch({ type: FirestoreStatusType.LOADING })
-
- // Subscribe to query with onSnapshot
- // Handle both Query and DocumentReference
- const isDocRef = 'type' in query && query.type === 'document'
-
- if (isDocRef) {
- // Document reference
- const unsubscribe = onSnapshot(
- query as DocumentReference,
- (docSnap: DocumentSnapshot) => {
- const data = docSnap.exists()
- ? { id: docSnap.id, ...docSnap.data() }
- : null
- dispatch({ type: FirestoreStatusType.SUCCESS, payload: data as T })
- },
- (error: Error) => {
- dispatch({
- type: FirestoreStatusType.ERROR,
- payload: error as T & Error,
- })
- }
- )
- return () => unsubscribe()
- } else {
- // Query
- const unsubscribe = onSnapshot(
- query as Query,
- (snapshot: QuerySnapshot) => {
- const data = snapshot.docs.map((doc) => ({
- id: doc.id,
- ...doc.data(),
- }))
- dispatch({ type: FirestoreStatusType.SUCCESS, payload: data as T })
- },
- (error: Error) => {
- dispatch({
- type: FirestoreStatusType.ERROR,
- payload: error as T & Error,
- })
- }
- )
- return () => unsubscribe()
- }
- }, [query])
-
- return state
-}
diff --git a/lib/hooks/useInfusions.ts b/lib/hooks/useInfusions.ts
deleted file mode 100644
index b046f8a..0000000
--- a/lib/hooks/useInfusions.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { useMemo } from 'react'
-import { firestore, collection, query, where } from 'lib/firebase'
-import { useAuth } from 'lib/auth'
-import { compareDesc } from 'date-fns'
-
-import useFirestoreQuery, {
- type FirestoreStatusType,
-} from 'lib/hooks/useFirestoreQuery'
-import type { TreatmentType } from 'lib/db/infusions'
-
-type FirestoreStatusTypes = FirestoreStatusType
-
-interface InfusionResponse {
- data: TreatmentType[]
- status: FirestoreStatusTypes
- error: Error | null
-}
-
-export default function useInfusions(
- limit?: number,
- uid?: string
-): InfusionResponse {
- const { user } = useAuth()
- const userUid = user ? user.uid : uid
-
- // Memoize the query to prevent unnecessary re-subscriptions
- const firestoreQuery = useMemo(() => {
- const db = firestore.instance
- if (!db || !userUid) {
- return null
- }
-
- return query(
- collection(db, 'infusions'),
- where('user.uid', '==', userUid),
- where('deletedAt', '==', null)
- )
- }, [userUid])
-
- const {
- data: unsortedData,
- status,
- error,
- } = useFirestoreQuery(firestoreQuery)
-
- // NOTE(Michael) sorts infusions by date (newest to oldest)
- const data: TreatmentType[] = useMemo(() => {
- const arr: TreatmentType[] = Array.isArray(unsortedData) ? unsortedData : []
-
- if (arr.length > 0) {
- const sorted = [...arr].sort((a: TreatmentType, b: TreatmentType) =>
- compareDesc(new Date(a.date), new Date(b.date))
- )
-
- if (limit) {
- return sorted.slice(0, limit)
- }
- return sorted
- }
-
- return arr
- }, [unsortedData, limit])
-
- return {
- data,
- status,
- error: error ?? null,
- }
-}
diff --git a/lib/hooks/useMediaQuery.ts b/lib/hooks/useMediaQuery.ts
deleted file mode 100644
index fd3f566..0000000
--- a/lib/hooks/useMediaQuery.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { useState, useEffect } from 'react'
-
-export interface MediaQueryOptions {
- match?: 'up' | 'down'
-}
-
-export function useMediaQuery(
- query: string,
- _options?: MediaQueryOptions
-): boolean {
- const [matches, setMatches] = useState(() => {
- if (typeof window !== 'undefined') {
- return window.matchMedia(query).matches
- }
- return false
- })
-
- useEffect(() => {
- const mediaQuery = window.matchMedia(query)
- const handleChange = (event: MediaQueryListEvent): void => {
- setMatches(event.matches)
- }
-
- mediaQuery.addEventListener('change', handleChange)
- setMatches(mediaQuery.matches)
-
- return () => {
- mediaQuery.removeEventListener('change', handleChange)
- }
- }, [query])
-
- return matches
-}
diff --git a/lib/hooks/useModal.ts b/lib/hooks/useModal.ts
deleted file mode 100644
index a76eb62..0000000
--- a/lib/hooks/useModal.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { useState } from 'react'
-
-export interface ModalBindings {
- visible: boolean
- setVisible: (visible: boolean) => void
-}
-
-export interface UseModalReturn {
- visible: boolean
- setVisible: (visible: boolean) => void
- bindings: ModalBindings
-}
-
-export function useModal(initialState = false): UseModalReturn {
- const [visible, setVisible] = useState(initialState)
-
- const bindings: ModalBindings = {
- visible,
- setVisible,
- }
-
- return {
- visible,
- setVisible,
- bindings,
- }
-}
diff --git a/lib/theme.ts b/lib/theme.ts
deleted file mode 100644
index 208f6a3..0000000
--- a/lib/theme.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const theme = {
- colors: {
- text: 'white',
- primary: 'salmon',
- },
-}
diff --git a/next-env.d.ts b/next-env.d.ts
index 4f11a03..c4b7818 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,5 +1,6 @@
///
///
+import "./.next/dev/types/routes.d.ts";
// NOTE: This file should not be edited
-// see https://nextjs.org/docs/basic-features/typescript for more information.
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/package.json b/package.json
index ca282a5..b3d5e79 100644
--- a/package.json
+++ b/package.json
@@ -8,33 +8,32 @@
"dev": "next dev",
"firebase": "firebase emulators:start",
"firebase:dev": "pnpm run rules:dev && firebase emulators:start",
- "rules:dev": "./switch-rules.sh dev",
- "rules:prod": "./switch-rules.sh prod",
+ "rules:dev": "./src/scripts/switch-rules.sh dev",
+ "rules:prod": "./src/scripts/switch-rules.sh prod",
"lint": "biome check",
"lint:fix": "biome check --write",
"start": "next start",
"prepare": "husky install",
"cy:open": "cypress open",
- "cy:run": "cypress run"
+ "cy:run": "cypress run",
+ "seed": "NEXT_PUBLIC_USE_EMULATORS=true npx tsx src/lib/seed.ts"
},
"engines": {
"node": "22.21.x"
},
"dependencies": {
+ "@tanstack/react-query": "^5.62.0",
"@tanstack/react-table": "^8.21.3",
"date-fns": "^2.30.0",
"firebase": "^12.7.0",
"firebase-admin": "^12.7.0",
"formik": "^2.4.9",
- "isomorphic-unfetch": "^3.1.0",
"js-cookie": "^2.2.1",
- "nanoid": "^3.3.11",
- "next": "^12.3.7",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
+ "next": "^16.1.1",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0",
"react-qr-code": "^2.0.18",
- "react-vis": "^1.12.1",
- "swr": "^1.3.0",
+ "recharts": "^3.6.0",
"underscore": "^1.13.7"
},
"devDependencies": {
@@ -44,9 +43,9 @@
"@tailwindcss/postcss": "^4.1.18",
"@testing-library/cypress": "^8.0.7",
"@types/js-cookie": "^2.2.7",
- "@types/node": "^20.19.24",
- "@types/react": "^17.0.89",
- "@types/react-vis": "^1.11.15",
+ "@types/node": "^22.19.3",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
"@types/underscore": "^1.13.0",
"autoprefixer": "^10.4.23",
"cypress": "^10.11.0",
diff --git a/pages/_app.tsx b/pages/_app.tsx
deleted file mode 100644
index 3152785..0000000
--- a/pages/_app.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import Head from 'next/head'
-import type { AppProps } from 'next/app'
-import { Toaster } from 'react-hot-toast'
-import { ThemeProvider } from 'lib/contexts/ThemeContext'
-
-import '../styles/globals.css'
-
-export default function App({ Component, pageProps }: AppProps): JSX.Element {
- const description =
- 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.'
-
- return (
- <>
-
-
- Hemolog
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* */}
-
-
-
-
-
-
-
- >
- )
-}
diff --git a/pages/_document.tsx b/pages/_document.tsx
deleted file mode 100644
index 8dff373..0000000
--- a/pages/_document.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import Document, { Html, Head, Main, NextScript } from 'next/document'
-
-export default class MyDocument extends Document {
- render() {
- const googleRichResultsSchema = {
- '@context': 'https://schema.org',
- '@type': 'Organization',
- url: 'https://hemolog.com',
- logo: 'https://hemolog.com/images/hemolog-logo.png',
- }
-
- return (
-
-
-
-
- {/* react-vis CSS is loaded dynamically when Chart component is used */}
-
-
-
-
-
-
- )
- }
-}
diff --git a/pages/about.tsx b/pages/about.tsx
deleted file mode 100644
index 25bf4f0..0000000
--- a/pages/about.tsx
+++ /dev/null
@@ -1,131 +0,0 @@
-import Head from 'next/head'
-import NextLink from 'next/link'
-import Image from 'next/image'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-
-const About = (): JSX.Element => {
- return (
- <>
-
- Hemolog - About
-
-
-
-
-
-
The story so far
-
- More than you would ever want to know about Hemolog
-
-
-
-
-
-
-
-
-
- Let's face it, there are some exciting developments in the world
- of Hemophilia research. Honestly, it's not just research
- anymore. Clinical trials are happening now across the globe.
- Gene therapy is definitely going to change things for the
- better, it's just a matter of when it's available to all of us.
-
-
-
- That being said, it's still important to keep track of your
- treatments. Maybe even more now than ever. If getting on a trial
- is something you're interested in, knowing how many bleeds you
- were having before is really important.
-
-
-
- Trial or not, keeping track of your treatment habits can be hard
- and the tools we have aren't great. Hemolog is simple. You track
- your treatments and Hemolog gives you instant feedback.
-
-
-
- Insights are something that I always wanted to be a part of
- Hemolog and now they're finally here.
-
-
-
-
-
-
- High level insights that help you understand your habits
-
-
-
-
- These insights are calculated as you log your treatments. Filter
- by year for a comprehensive view into your treatment history. I've
- chosen a few insights that are interesting to me. If you have
- thoughts on what you would like to see, just let me know.
-
-
-
-
Note
-
- Development is ongoing. Check out the{' '}
-
- development blog
- {' '}
- for updates and changes.
-
-
-
-
-
-
- Now that Hemolog is back, I hope you enjoy using it as much as
- I have. It's up to all of us to keep each other accountable.
- You can{' '}
-
- view my emergency page
- {' '}
- at any time to verify I've been keeping up with my prophy
- regimen.
-
-
— Michael Schultz
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default About
diff --git a/pages/api/alert-lightstrip.ts b/pages/api/alert-lightstrip.ts
deleted file mode 100644
index adaae8c..0000000
--- a/pages/api/alert-lightstrip.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-// NOTE(michael): this endpoint isn't used anywhere and was just an
-// exploration of the HUE api.
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
-
-const alertLights = (_req: NextApiRequest, res: NextApiResponse) => {
- return fetch(`${REQUEST_URL}/state`, {
- method: 'PUT',
- body: JSON.stringify({ on: true, hue: 0 }),
- })
- .then((resp) => resp.json())
- .then((data) => {
- res.json(data)
- return
- })
-}
-
-export default alertLights
diff --git a/pages/api/delete-account.ts b/pages/api/delete-account.ts
deleted file mode 100644
index 4baa5da..0000000
--- a/pages/api/delete-account.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-import { auth } from 'lib/firebase-admin'
-import { deleteUserAndData } from 'lib/admin-db/users'
-
-const deleteAccount = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'DELETE') {
- return res.status(405).send('Requires DELETE method.')
- }
-
- try {
- const token = req.headers.token
-
- if (!token || typeof token !== 'string') {
- throw new Error('Access denied. Missing valid token.')
- }
-
- const { uid } = await auth.verifyIdToken(token)
-
- if (!uid) {
- throw new Error('Access denied. Invalid token.')
- }
-
- await deleteUserAndData(uid)
-
- return res.status(200).json({ success: true })
- } catch (error: unknown) {
- const errorMessage =
- error instanceof Error ? error.message : 'Unable to delete account.'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default deleteAccount
diff --git a/pages/api/flip-lightstrip.ts b/pages/api/flip-lightstrip.ts
deleted file mode 100644
index 42ee345..0000000
--- a/pages/api/flip-lightstrip.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-// NOTE(michael): this endpoint isn't used anywhere and was just an
-// exploration of the HUE api.
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
-
-const flipLights = async (req: NextApiRequest, res: NextApiResponse) => {
- const { query } = req
- let on: boolean | undefined
-
- // biome-ignore lint/suspicious/noImplicitAnyLet: not important
- let currentState
-
- // NOTE(michael) this is only needed if I want to accept a query param
- if (query.on) {
- switch (query.on) {
- case 'false': {
- on = false
- break
- }
- case 'true': {
- on = true
- break
- }
- case 'default': {
- on = true
- break
- }
- }
- } else {
- return fetch(REQUEST_URL, {
- method: 'GET',
- })
- .then((resp) => resp.json())
- .then((data) => {
- currentState = data.state.on
- // toggle light state
- on = !currentState
-
- return fetch(`${REQUEST_URL}/state`, {
- method: 'PUT',
- body: JSON.stringify({ on: on }),
- })
- .then((resp) => resp.json())
- .then((data) => {
- res.json(data)
- return
- })
- })
- }
-
- return fetch(`${REQUEST_URL}/state`, {
- method: 'PUT',
- body: JSON.stringify({ on: on }),
- })
- .then((resp) => resp.json())
- .then((data) => {
- res.json(data)
- return
- })
-}
-
-export default flipLights
diff --git a/pages/api/recent-treatments.ts b/pages/api/recent-treatments.ts
deleted file mode 100644
index ff59ae0..0000000
--- a/pages/api/recent-treatments.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { getRecentUserInfusionsByApiKey } from 'lib/admin-db/infusions'
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const recentTreatments = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'GET') {
- return res.status(405).send('Requires GET method.')
- }
- try {
- const { apikey, alertid } = req.query
- if (!apikey && !alertid) {
- throw { message: 'Access denied. Missing api key.' }
- }
-
- const { infusions, error } = await getRecentUserInfusionsByApiKey(
- apikey as string,
- alertid as string
- )
-
- if (error) {
- throw error
- }
-
- return res.status(200).json(infusions)
- } catch (error: unknown) {
- const errorMessage =
- error &&
- typeof error === 'object' &&
- 'message' in error &&
- typeof error.message === 'string'
- ? error.message
- : 'An error occurred'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default recentTreatments
diff --git a/pages/api/treatments.ts b/pages/api/treatments.ts
deleted file mode 100644
index f072c93..0000000
--- a/pages/api/treatments.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { getAllInfusionsByApiKey } from 'lib/admin-db/infusions'
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const treatments = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'GET') {
- return res.status(405).send('Requires GET method.')
- }
- try {
- const { apikey } = req.query
- if (!apikey) {
- throw { message: 'Access denied. Missing api key.' }
- }
-
- const { infusions, error } = await getAllInfusionsByApiKey(apikey as string)
-
- if (error) {
- throw error
- }
-
- return res.status(200).json(infusions)
- } catch (error: unknown) {
- const errorMessage =
- error &&
- typeof error === 'object' &&
- 'message' in error &&
- typeof error.message === 'string'
- ? error.message
- : 'An error occurred'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default treatments
diff --git a/pages/changelog/hello-world-again.tsx b/pages/changelog/hello-world-again.tsx
deleted file mode 100644
index a9c2cde..0000000
--- a/pages/changelog/hello-world-again.tsx
+++ /dev/null
@@ -1,107 +0,0 @@
-import Head from 'next/head'
-import Image from 'next/image'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'Hello world... again',
- image: ['https://hemolog.com/images/insights-example.png'],
- datePublished: '2020-02-05T08:00:00+08:00',
- dateModified: '2020-02-05T09:20:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
-
Changelog
-
- Development blog about new features, fixes, and updates to Hemolog
-
-
-
-
-
- Hello world...again
-
-
- Hemolog is back and better than ever
-
-
-
-
-
- Update #1
-
-
-
- Hemolog is back! After 8 years, I've built a reincarnation of
- the old iPhone app Hemolog. This time around, it does a bit more
- than just storing your treatment logs. In this incarnation,
- Hemolog is now a web app and helps you understand your logs by
- giving showing you stats.
-
-
- The original Hemolog was built with the help of a contract
- developer. This time around I've designed and built everything
- from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
-
-
-
-
-
- High level insights that help you understand your habits
-
-
-
-
- These insights are calculated as you add more data. Filters will
- allow you to choose different time frames for viewing your data
- down the road giving you the best most comprehensive view into
- your treatment history ever. I've chosen a few insights that are
- interesting for me. If you have thoughts on what you would like
- to see just let me know.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
diff --git a/pages/changelog/index.tsx b/pages/changelog/index.tsx
deleted file mode 100644
index c389fa7..0000000
--- a/pages/changelog/index.tsx
+++ /dev/null
@@ -1,222 +0,0 @@
-import Head from 'next/head'
-import Image from 'next/image'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
Changelog
-
- Development blog about new features, fixes, and updates to Hemolog
-
-
-
-
-
-
- Log treatments at the speed of light
-
-
- A brand new way to log treatments, directly from your keyboard.
- Now available on Mac and Windows (beta) via{' '}
-
- Raycast
-
- .
-
-
-
-
- Update #4
-
-
-
- One of my favorite tools to use on my Mac is{' '}
-
- Raycast
-
- . It's a productivity tool that lets you quickly launch apps,
- search the web, and run commands all from your keyboard.
-
-
-
-
-
-
-
-
-
- A brand new treatment type
-
-
- It's finally here. Monoclonal antibodies officially can treat
- hemophilia, giving us a new method of getting our medicine in
- our body and a whole lot more.
-
-
-
-
- Update #3
-
-
-
- I never thought I'd say this, but I no longer simply{' '}
- infuse to treat bleeds. I also{' '}
- inject .
-
-
- That might not sound like a huge difference off the bat, but I
- can assure you it is. Having to find a vein all the time is now
- a thing of the past, finally we can inject subcutaneously under
- the skin, like so many other people. I'm so excited for what
- this means for people with bad or damage veins and kids! It's
- just lessens the burden so much.
-
-
-
-
-
-
-
-
-
- Mobile enhancements
-
-
- Looks great on your desktop and mobile devices!
-
-
-
-
- Update #2
-
-
-
- I designed Hemolog to be used anywhere. That meant building a
- web app verses an iPhone, Android, or some hybrid app.
-
-
-
-
-
-
-
-
- Hello world...again
-
-
- Hemolog is back and better than ever
-
-
-
-
-
- Update #1
-
-
-
- Hemolog is back! After 8 years, I've built a reincarnation of
- the old iPhone app Hemolog. This time around, it does a bit more
- than just storing your treatment logs. In this incarnation,
- Hemolog is now a web app and helps you understand your logs by
- giving showing you stats.
-
-
- The original Hemolog was built with the help of a contract
- developer. This time around I've designed and built everything
- from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
diff --git a/pages/changelog/mobile-enhancements.tsx b/pages/changelog/mobile-enhancements.tsx
deleted file mode 100644
index 754463f..0000000
--- a/pages/changelog/mobile-enhancements.tsx
+++ /dev/null
@@ -1,134 +0,0 @@
-import Head from 'next/head'
-import { IconShare, IconChevronLeft } from '@tabler/icons-react'
-import Image from 'next/image'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'Mobile enhancements',
- image: ['https://hemolog.com/images/changelog/iphone-hemolog-light.png'],
- datePublished: '2020-02-05T08:00:00+08:00',
- dateModified: '2020-02-05T09:20:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
-
Changelog
-
-
- Back to list of updates
-
-
-
-
-
-
- Mobile enhancements
-
-
- Looks great on your desktop and mobile devices!
-
-
-
-
- Update #2
-
-
-
- I designed Hemolog to be used anywhere. That meant building a
- web app verses an iPhone, Android, or some hybrid app.
-
-
- The original Hemolog was built with the help of a contract
- developer. This time around I've designed and built everything
- from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
-
-
-
-
-
- Hemolog running on an iPhone 12
-
-
-
-
-
Pro tip
-
- Visit Hemolog.com using Safari on your iPhone and click the{' '}
- icon, then scroll
- down to 'Add to Home Screen' to create an app icon.
-
-
-
-
-
-
- Hemolog app icon on iPhone
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
diff --git a/pages/changelog/monoclonal-antibodies.tsx b/pages/changelog/monoclonal-antibodies.tsx
deleted file mode 100644
index d220b9e..0000000
--- a/pages/changelog/monoclonal-antibodies.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import Head from 'next/head'
-import { IconChevronLeft } from '@tabler/icons-react'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'A brand new treatment type',
- image: ['https://hemolog.com/images/changelog/iphone-hemolog-light.png'],
- datePublished: '2022-04-04T07:09:00+08:00',
- dateModified: '2022-04-04T07:09:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
-
Changelog
-
-
- Back to list of updates
-
-
-
-
-
-
- A brand new treatment type
-
-
- It's finally here. Monoclonal antibodies officially can treat
- hemophilia, giving us a new method of getting our medicine in
- our body and a whole lot more.
-
-
-
-
- Update #3
-
-
-
- I never thought I'd say this, but I no longer simply{' '}
- infuse to treat bleeds. I also{' '}
- inject .
-
-
- That might not sound like a huge difference off the bat, but I
- can assure you it is. Having to find a vein all the time is now
- a thing of the past, finally we can inject subcutaneously under
- the skin, like so many other people. I'm so excited for what
- this means for people with bad or damage veins and kids! It's
- just lessens the burden so much.
-
-
- I'm now using a drug called{' '}
-
- Hemlibra
- {' '}
- which is one of these new{' '}
-
- monoclonal antibodies
-
- , I needed to add a completely new category to Hemolog. This
- wasn't as easy as just adding a new medication. The first thing
- you'll notice is that I decided to rename infusions {' '}
- across the site to treatments . This means we can now
- specify between infusions and injections when logging a
- treatment.
-
-
- Once more drugs are on the market I'll update the list of
- medications available, but for now feel free to add your own
- manually. To update this, visit your{' '}
-
- profile page
-
- .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
diff --git a/pages/changelog/raycast-extension.tsx b/pages/changelog/raycast-extension.tsx
deleted file mode 100644
index 8ee09be..0000000
--- a/pages/changelog/raycast-extension.tsx
+++ /dev/null
@@ -1,167 +0,0 @@
-import Head from 'next/head'
-import Image from 'next/image'
-import { IconChevronLeft } from '@tabler/icons-react'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'Log treatments at the speed of light',
- image: ['https://hemolog.com/images/changelog/raycast.png'],
- datePublished: '2025-09-22T06:09:00+08:00',
- dateModified: '2025-09-22T06:09:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
-
Changelog
-
-
- Back to list of updates
-
-
-
-
-
-
- Log treatments at the speed of light
-
-
- A brand new way to log treatments, directly from your keyboard.
- Now available on Mac and Windows (beta) via{' '}
-
- Raycast
-
- .
-
-
-
-
- Update #4
-
-
-
- One of my favorite tools to use on my Mac is{' '}
-
- Raycast
-
- . It's a productivity tool that lets you quickly launch apps,
- search the web, and run commands all from your keyboard.
-
-
- Raycast has an{' '}
-
- extensions
- {' '}
- ecosystem that lets you extend its functionality. I decided to
- build an extension for Hemolog that lets you log treatments
- directly from Raycast. It's super quick and easy to use, and
- it's available for free on the Raycast Store.
-
-
-
-
-
-
-
- To get started, you'll need to install{' '}
-
- Raycast
- {' '}
- on your Mac or Windows PC! (the Windows app is currently in
- beta).
-
-
-
-
-
- Once you have Raycast installed, you can install the Hemolog
- extension from the{' '}
-
- Raycast Store
-
- . After that, you'll need to connect your Hemolog account to the
- extension. It's as easy as logging into your hemolog account and
- visiting your{' '}
-
- profile page
-
- . Here you'll find your API key . Launch the
- Hemolog extension in Raycast and you'll be prompted to enter
- your API key . Paste it in, and you're all set!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
diff --git a/pages/emergency/[alertId].tsx b/pages/emergency/[alertId].tsx
deleted file mode 100644
index 78b1b1e..0000000
--- a/pages/emergency/[alertId].tsx
+++ /dev/null
@@ -1,102 +0,0 @@
-import { useRouter } from 'next/router'
-import Head from 'next/head'
-import NextLink from 'next/link'
-
-import useEmergencyUser from 'lib/hooks/useEmergencyUser'
-import { FirestoreStatusType } from 'lib/hooks/useFirestoreQuery'
-import EmergencyInfo from 'components/emergencyInfo'
-import Footer from 'components/footer'
-
-const Emergency = (): JSX.Element => {
- const router = useRouter()
- const { alertId } = router.query
- let isExample = false
-
- if (alertId === 'example') {
- isExample = true
- }
-
- const { person, status, error } = useEmergencyUser(
- isExample ? 'mike29' : alertId
- )
-
- return (
- <>
-
- Emergency - from Hemolog
-
-
- {/* Header */}
-
-
- Emergency Info
-
-
- {/* biome-ignore lint/a11y/useValidAnchor: NextLink provides href */}
-
- Hemolog.com
-
-
-
-
- {/* Disclaimer and Important Note */}
-
-
- This page shows the most recent medical logs for someone with
- hemophilia.
- This data is self reported and may not be up-to-date.
-
-
-
-
Important
-
- If someone has been in an accident, please call{' '}
-
- 911
- {' '}
- immediately.
-
-
-
-
- {/* Main Content */}
-
- {status === FirestoreStatusType.LOADING && (
-
-
-
Loading emergency info
-
- )}
-
- {error && (
-
-
Error
-
- Something went wrong. This could mean that this person no longer
- has a Hemolog account or the app is broken.
-
-
- )}
-
- {!person && status !== FirestoreStatusType.LOADING && (
-
-
Try again
-
- Nothing could be found at this address. Please make sure the URL
- matches the link provided on the Hemolog Emergency Card.
-
-
- )}
-
- {person && }
-
-
-
- >
- )
-}
-
-export default Emergency
diff --git a/pages/index.tsx b/pages/index.tsx
deleted file mode 100644
index d990851..0000000
--- a/pages/index.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import Head from 'next/head'
-import NextLink from 'next/link'
-import Image from 'next/image'
-import Footer from 'components/footer'
-import StaticHeader from 'components/staticHeader'
-import DescriptionCards from 'components/descriptionCards'
-
-export default function Landing(): JSX.Element {
- return (
- <>
-
- Hemolog
-
-
-
-
- {/* Background illustration */}
-
-
-
-
- {/* Content */}
-
-
- TREATMENT INSIGHTS
- THAT MATTER
-
-
- The last treatment log you'll ever need.
-
-
-
-
- Log your treatments and get fantastic insights that help you
- change your habits.
-
- Sign up for free and start using the newest version of Hemolog
- today!
-
-
-
-
- Learn more about the Hemolog story...
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
diff --git a/pages/signin.tsx b/pages/signin.tsx
deleted file mode 100644
index 8b2aee5..0000000
--- a/pages/signin.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import Head from 'next/head'
-
-import Logo from 'components/logo'
-import Footer from 'components/footer'
-import { withAuth } from 'components/withAuth'
-import { useAuth } from 'lib/auth'
-
-export async function getStaticProps() {
- return {
- props: {
- version: process.env.npm_package_version,
- },
- }
-}
-
-const Signin = (pageProps: { version: string }) => {
- const { version } = pageProps
- const auth = useAuth()
-
- return (
- <>
-
- Hemolog - Sign in
-
-
-
-
-
-
-
Important
-
- Hemolog is currently in development. Data integrity is not
- guaranteed. Hemolog is{' '}
-
- not
- {' '}
- HIPAA compliant... yada yada yada.
-
-
-
-
-
-
- Register or sign in
-
-
- Signing in will create an account if you don't have one yet.
- Don't worry, Hemolog will always be free .
-
-
-
- {!process.env.NEXT_PUBLIC_USE_EMULATORS && (
-
auth.signinWithGoogle?.('/home')}
- disabled={auth.loading}
- className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2'
- >
- {auth.loading && (
-
- )}
- Continue with Google
-
- )}
- {process.env.NEXT_PUBLIC_USE_EMULATORS && (
-
auth.signinWithTestUser?.()}
- disabled={auth.loading}
- className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2'
- >
- {auth.loading && (
-
- )}
- Continue with Test User
-
- )}
-
-
-
-
- {/*
-
-
*/}
-
-
-
-
- >
- )
-}
-
-export default withAuth(Signin)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3365aac..782d2f1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,9 +8,12 @@ importers:
.:
dependencies:
+ '@tanstack/react-query':
+ specifier: ^5.62.0
+ version: 5.90.14(react@18.3.1)
'@tanstack/react-table':
specifier: ^8.21.3
- version: 8.21.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
+ version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
date-fns:
specifier: ^2.30.0
version: 2.30.0
@@ -22,7 +25,7 @@ importers:
version: 12.7.0(encoding@0.1.13)
formik:
specifier: ^2.4.9
- version: 2.4.9(@types/react@17.0.89)(react@17.0.2)
+ version: 2.4.9(@types/react@18.3.27)(react@18.3.1)
isomorphic-unfetch:
specifier: ^3.1.0
version: 3.1.0(encoding@0.1.13)
@@ -33,23 +36,23 @@ importers:
specifier: ^3.3.11
version: 3.3.11
next:
- specifier: ^12.3.7
- version: 12.3.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
+ specifier: ^16.1.1
+ version: 16.1.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react:
- specifier: ^17.0.2
- version: 17.0.2
+ specifier: ^18.0.0
+ version: 18.3.1
react-dom:
- specifier: ^17.0.2
- version: 17.0.2(react@17.0.2)
+ specifier: ^18.0.0
+ version: 18.3.1(react@18.3.1)
react-qr-code:
specifier: ^2.0.18
- version: 2.0.18(react@17.0.2)
+ version: 2.0.18(react@18.3.1)
react-vis:
specifier: ^1.12.1
- version: 1.12.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
- swr:
- specifier: ^1.3.0
- version: 1.3.0(react@17.0.2)
+ version: 1.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ recharts:
+ specifier: ^3.6.0
+ version: 3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@17.0.2)(react@18.3.1)(redux@5.0.1)
underscore:
specifier: ^1.13.7
version: 1.13.7
@@ -62,7 +65,7 @@ importers:
version: 16.1.1
'@tabler/icons-react':
specifier: ^3.36.0
- version: 3.36.0(react@17.0.2)
+ version: 3.36.0(react@18.3.1)
'@tailwindcss/postcss':
specifier: ^4.1.18
version: 4.1.18
@@ -73,11 +76,14 @@ importers:
specifier: ^2.2.7
version: 2.2.7
'@types/node':
- specifier: ^20.19.24
- version: 20.19.24
+ specifier: ^22.19.3
+ version: 22.19.3
'@types/react':
- specifier: ^17.0.89
- version: 17.0.89
+ specifier: ^18.0.0
+ version: 18.3.27
+ '@types/react-dom':
+ specifier: ^18.0.0
+ version: 18.3.7(@types/react@18.3.27)
'@types/react-vis':
specifier: ^1.11.15
version: 1.11.15
@@ -104,7 +110,7 @@ importers:
version: 12.5.0(enquirer@2.4.1)
react-hot-toast:
specifier: ^2.6.0
- version: 2.6.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
+ version: 2.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
tailwindcss:
specifier: ^4.0.0
version: 4.0.0
@@ -208,6 +214,9 @@ packages:
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
+ '@emnapi/runtime@1.7.1':
+ resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
+
'@fastify/busboy@3.2.0':
resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==}
@@ -511,6 +520,143 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ '@img/colour@1.0.0':
+ resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
@@ -544,83 +690,53 @@ packages:
'@next/bundle-analyzer@16.1.1':
resolution: {integrity: sha512-aNJy301GGH8k36rDgrYdnyYEdjRQg6csMi1njzqHo+3qyZvOOWMHSv+p7SztNTzP5RU2KRwX0pPwYBtDcE+vVA==}
- '@next/env@12.3.7':
- resolution: {integrity: sha512-gCw4sTeHoNr0EUO+Nk9Ll21OzF3PnmM0GlHaKgsY2AWQSqQlMgECvB0YI4k21M9iGy+tQ5RMyXQuoIMpzhtxww==}
-
- '@next/swc-android-arm-eabi@12.3.4':
- resolution: {integrity: sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [android]
-
- '@next/swc-android-arm64@12.3.4':
- resolution: {integrity: sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [android]
+ '@next/env@16.1.1':
+ resolution: {integrity: sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==}
- '@next/swc-darwin-arm64@12.3.4':
- resolution: {integrity: sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA==}
+ '@next/swc-darwin-arm64@16.1.1':
+ resolution: {integrity: sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@12.3.4':
- resolution: {integrity: sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ==}
+ '@next/swc-darwin-x64@16.1.1':
+ resolution: {integrity: sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-freebsd-x64@12.3.4':
- resolution: {integrity: sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [freebsd]
-
- '@next/swc-linux-arm-gnueabihf@12.3.4':
- resolution: {integrity: sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
-
- '@next/swc-linux-arm64-gnu@12.3.4':
- resolution: {integrity: sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA==}
+ '@next/swc-linux-arm64-gnu@16.1.1':
+ resolution: {integrity: sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@12.3.4':
- resolution: {integrity: sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ==}
+ '@next/swc-linux-arm64-musl@16.1.1':
+ resolution: {integrity: sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@12.3.4':
- resolution: {integrity: sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag==}
+ '@next/swc-linux-x64-gnu@16.1.1':
+ resolution: {integrity: sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@12.3.4':
- resolution: {integrity: sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg==}
+ '@next/swc-linux-x64-musl@16.1.1':
+ resolution: {integrity: sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@12.3.4':
- resolution: {integrity: sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ==}
+ '@next/swc-win32-arm64-msvc@16.1.1':
+ resolution: {integrity: sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-ia32-msvc@12.3.4':
- resolution: {integrity: sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
-
- '@next/swc-win32-x64-msvc@12.3.4':
- resolution: {integrity: sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg==}
+ '@next/swc-win32-x64-msvc@16.1.1':
+ resolution: {integrity: sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -678,6 +794,17 @@ packages:
'@protobufjs/utf8@1.1.0':
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+ '@reduxjs/toolkit@2.11.2':
+ resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==}
+ peerDependencies:
+ react: ^16.9.0 || ^17.0.0 || ^18 || ^19
+ react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-redux:
+ optional: true
+
'@sindresorhus/is@0.14.0':
resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
engines: {node: '>=6'}
@@ -685,8 +812,14 @@ packages:
'@so-ric/colorspace@1.1.6':
resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
- '@swc/helpers@0.4.11':
- resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==}
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@standard-schema/utils@0.3.0':
+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
'@szmarczak/http-timer@1.1.2':
resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
@@ -788,6 +921,14 @@ packages:
'@tailwindcss/postcss@4.1.18':
resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
+ '@tanstack/query-core@5.90.14':
+ resolution: {integrity: sha512-/6di2yNI+YxpVrH9Ig74Q+puKnkCE+D0LGyagJEGndJHJc6ahkcc/UqirHKy8zCYE/N9KLggxcQvzYCsUBWgdw==}
+
+ '@tanstack/react-query@5.90.14':
+ resolution: {integrity: sha512-JAMuULej09hrZ14W9+mxoRZ44rR2BuZfCd6oKTQVNfynQxCN3muH3jh3W46gqZNw5ZqY0ZVaS43Imb3dMr6tgw==}
+ peerDependencies:
+ react: ^18 || ^19
+
'@tanstack/react-table@8.21.3':
resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==}
engines: {node: '>=12'}
@@ -832,6 +973,33 @@ packages:
'@types/connect@3.4.38':
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+ '@types/d3-array@3.2.2':
+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
+
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-ease@3.0.2':
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-path@3.1.1':
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+ '@types/d3-scale@4.0.9':
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+ '@types/d3-shape@3.1.7':
+ resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+
+ '@types/d3-time@3.0.4':
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+ '@types/d3-timer@3.0.2':
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
'@types/duplexify@3.6.5':
resolution: {integrity: sha512-fB56ACzlW91UdZ5F3VXplVMDngO8QaX5Y2mjvADtN01TT2TMy4WjF0Lg+tFDvt4uMBeTe4SgaD+qCrA7dL5/tA==}
@@ -888,11 +1056,16 @@ packages:
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+ '@types/react-dom@18.3.7':
+ resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
+ peerDependencies:
+ '@types/react': ^18.0.0
+
'@types/react-vis@1.11.15':
resolution: {integrity: sha512-0feNthHy/GnkCRPagPKkAnZmKQY1rI+OelD/ASdI7z+PMCfcmPLTi7nLrduIojxGAOWBiIgyH3YX1Ix7GWpAag==}
- '@types/react@17.0.89':
- resolution: {integrity: sha512-I98SaDCar5lvEYl80ClRIUztH/hyWHR+I2f+5yTVp/MQ205HgYkA2b5mVdry/+nsEIrf8I65KA5V/PASx68MsQ==}
+ '@types/react@18.3.27':
+ resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==}
'@types/readdir-glob@1.1.5':
resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==}
@@ -903,9 +1076,6 @@ packages:
'@types/responselike@1.0.3':
resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
- '@types/scheduler@0.16.8':
- resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
-
'@types/send@0.17.6':
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
@@ -930,6 +1100,9 @@ packages:
'@types/underscore@1.13.0':
resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==}
+ '@types/use-sync-external-store@0.0.6':
+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
+
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
@@ -1259,9 +1432,6 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
- caniuse-lite@1.0.30001754:
- resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==}
-
caniuse-lite@1.0.30001761:
resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
@@ -1362,6 +1532,9 @@ packages:
cli-width@2.2.1:
resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
cliui@7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
@@ -1376,6 +1549,10 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@@ -1516,6 +1693,9 @@ packages:
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
csv-streamify@3.0.4:
resolution: {integrity: sha512-IQkxN0zu0gym8/5CHrSyReeRewbw+aRDrMrGI5WmIY/LmEcNpAcPOyETBHREKgsWHeEQWEihiBmx5EcKAsKWZw==}
engines: {node: '>=0.12.0'}
@@ -1544,6 +1724,10 @@ packages:
resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
engines: {node: '>=12'}
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+
d3-format@3.1.0:
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
@@ -1592,6 +1776,10 @@ packages:
resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
engines: {node: '>=12'}
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+
d3-voronoi@1.1.4:
resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==}
@@ -1651,6 +1839,9 @@ packages:
supports-color:
optional: true
+ decimal.js-light@2.5.1:
+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
+
decompress-response@3.3.0:
resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
engines: {node: '>=4'}
@@ -1817,6 +2008,9 @@ packages:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'}
+ es-toolkit@1.43.0:
+ resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==}
+
es5-ext@0.10.64:
resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
engines: {node: '>=0.10'}
@@ -1886,6 +2080,9 @@ packages:
eventemitter2@6.4.7:
resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
events-listener@1.1.0:
resolution: {integrity: sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==}
@@ -2371,6 +2568,12 @@ packages:
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ immer@10.2.0:
+ resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==}
+
+ immer@11.1.0:
+ resolution: {integrity: sha512-dlzb07f5LDY+tzs+iLCSXV2yuhaYfezqyZQc+n6baLECWkOMEWxkECAOnXL0ba7lsA25fM9b2jtzpu/uxo1a7g==}
+
import-lazy@2.1.0:
resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
engines: {node: '>=4'}
@@ -3166,20 +3369,23 @@ packages:
next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
- next@12.3.7:
- resolution: {integrity: sha512-3PDn+u77s5WpbkUrslBP6SKLMeUj9cSx251LOt+yP9fgnqXV/ydny81xQsclz9R6RzCLONMCtwK2RvDdLa/mJQ==}
- engines: {node: '>=12.22.0'}
+ next@16.1.1:
+ resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==}
+ engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
- fibers: '>= 3.1.0'
- node-sass: ^6.0.0 || ^7.0.0
- react: ^17.0.2 || ^18.0.0-0
- react-dom: ^17.0.2 || ^18.0.0-0
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
sass: ^1.3.0
peerDependenciesMeta:
- fibers:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
optional: true
- node-sass:
+ babel-plugin-react-compiler:
optional: true
sass:
optional: true
@@ -3411,8 +3617,8 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.4.14:
- resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
postcss@8.5.6:
@@ -3549,10 +3755,10 @@ packages:
re2@1.22.3:
resolution: {integrity: sha512-002aE82U91DiaUA16U6vbiJusvPXn1OWiQukOxJkVUTXbzrSuQbFNHYKcGw8QK/uifRCfjl2Hd/vXYDanKkmaQ==}
- react-dom@17.0.2:
- resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==}
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
- react: 17.0.2
+ react: ^18.3.1
react-fast-compare@2.0.4:
resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==}
@@ -3580,6 +3786,18 @@ packages:
peerDependencies:
react: '*'
+ react-redux@9.2.0:
+ resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==}
+ peerDependencies:
+ '@types/react': ^18.2.25 || ^19
+ react: ^18.0 || ^19
+ redux: ^5.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ redux:
+ optional: true
+
react-vis@1.12.1:
resolution: {integrity: sha512-vH7ihTPlBD6wBuzwPoipheyJnx46kKKMXnVqdk4mv5vq+bJVC6JRYdRZSofa2030+kko99rSq/idnYnNWGr6zA==}
engines: {node: '>=14.18.0', npm: '>=6.13.0'}
@@ -3587,8 +3805,8 @@ packages:
react: ^16.8.3
react-dom: ^16.8.3
- react@17.0.2:
- resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
readable-stream@1.1.14:
@@ -3611,9 +3829,25 @@ packages:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
+ recharts@3.6.0:
+ resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
redeyed@2.1.1:
resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
+ redux-thunk@3.1.0:
+ resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==}
+ peerDependencies:
+ redux: ^5.0.0
+
+ redux@5.0.1:
+ resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
+
regexp.prototype.flags@1.5.4:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
@@ -3641,6 +3875,9 @@ packages:
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+ reselect@5.1.1:
+ resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
+
responselike@1.0.2:
resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
@@ -3717,8 +3954,8 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- scheduler@0.20.2:
- resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==}
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
semver-diff@3.1.1:
resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
@@ -3759,6 +3996,10 @@ packages:
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
shebang-command@1.2.0:
resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
engines: {node: '>=0.10.0'}
@@ -3934,13 +4175,13 @@ packages:
stubs@3.0.0:
resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==}
- styled-jsx@5.0.7:
- resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==}
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
engines: {node: '>= 12.0.0'}
peerDependencies:
'@babel/core': '*'
babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
peerDependenciesMeta:
'@babel/core':
optional: true
@@ -3976,11 +4217,6 @@ packages:
resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==}
engines: {node: '>=4'}
- swr@1.3.0:
- resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==}
- peerDependencies:
- react: ^16.11.0 || ^17.0.0 || ^18.0.0
-
tailwindcss@4.0.0:
resolution: {integrity: sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==}
@@ -4030,6 +4266,9 @@ packages:
resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==}
engines: {node: '>=0.12'}
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
@@ -4210,10 +4449,10 @@ packages:
url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
- use-sync-external-store@1.2.0:
- resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -4250,6 +4489,9 @@ packages:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
+ victory-vendor@37.3.6:
+ resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==}
+
vm2@3.10.0:
resolution: {integrity: sha512-3ggF4Bs0cw4M7Rxn19/Cv3nJi04xrgHwt4uLto+zkcZocaKwP/nKP9wPx6ggN2X0DSXxOOIc63BV1jvES19wXQ==}
engines: {node: '>=6.0'}
@@ -4505,6 +4747,11 @@ snapshots:
'@discoveryjs/json-ext@0.5.7': {}
+ '@emnapi/runtime@1.7.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@fastify/busboy@3.2.0': {}
'@firebase/ai@2.6.1(@firebase/app-types@0.9.3)(@firebase/app@0.14.6)':
@@ -4982,6 +5229,103 @@ snapshots:
yargs: 17.7.2
optional: true
+ '@img/colour@1.0.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.7.1
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
@@ -5028,45 +5372,30 @@ snapshots:
- bufferutil
- utf-8-validate
- '@next/env@12.3.7': {}
-
- '@next/swc-android-arm-eabi@12.3.4':
- optional: true
-
- '@next/swc-android-arm64@12.3.4':
- optional: true
-
- '@next/swc-darwin-arm64@12.3.4':
- optional: true
-
- '@next/swc-darwin-x64@12.3.4':
- optional: true
+ '@next/env@16.1.1': {}
- '@next/swc-freebsd-x64@12.3.4':
+ '@next/swc-darwin-arm64@16.1.1':
optional: true
- '@next/swc-linux-arm-gnueabihf@12.3.4':
+ '@next/swc-darwin-x64@16.1.1':
optional: true
- '@next/swc-linux-arm64-gnu@12.3.4':
+ '@next/swc-linux-arm64-gnu@16.1.1':
optional: true
- '@next/swc-linux-arm64-musl@12.3.4':
+ '@next/swc-linux-arm64-musl@16.1.1':
optional: true
- '@next/swc-linux-x64-gnu@12.3.4':
+ '@next/swc-linux-x64-gnu@16.1.1':
optional: true
- '@next/swc-linux-x64-musl@12.3.4':
+ '@next/swc-linux-x64-musl@16.1.1':
optional: true
- '@next/swc-win32-arm64-msvc@12.3.4':
+ '@next/swc-win32-arm64-msvc@16.1.1':
optional: true
- '@next/swc-win32-ia32-msvc@12.3.4':
- optional: true
-
- '@next/swc-win32-x64-msvc@12.3.4':
+ '@next/swc-win32-x64-msvc@16.1.1':
optional: true
'@npmcli/agent@3.0.0':
@@ -5117,6 +5446,18 @@ snapshots:
'@protobufjs/utf8@1.1.0': {}
+ '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1)':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ '@standard-schema/utils': 0.3.0
+ immer: 11.1.0
+ redux: 5.0.1
+ redux-thunk: 3.1.0(redux@5.0.1)
+ reselect: 5.1.1
+ optionalDependencies:
+ react: 18.3.1
+ react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1)
+
'@sindresorhus/is@0.14.0': {}
'@so-ric/colorspace@1.1.6':
@@ -5124,7 +5465,11 @@ snapshots:
color: 5.0.2
text-hex: 1.0.0
- '@swc/helpers@0.4.11':
+ '@standard-schema/spec@1.1.0': {}
+
+ '@standard-schema/utils@0.3.0': {}
+
+ '@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
@@ -5132,10 +5477,10 @@ snapshots:
dependencies:
defer-to-connect: 1.1.3
- '@tabler/icons-react@3.36.0(react@17.0.2)':
+ '@tabler/icons-react@3.36.0(react@18.3.1)':
dependencies:
'@tabler/icons': 3.36.0
- react: 17.0.2
+ react: 18.3.1
'@tabler/icons@3.36.0': {}
@@ -5208,11 +5553,18 @@ snapshots:
postcss: 8.5.6
tailwindcss: 4.1.18
- '@tanstack/react-table@8.21.3(react-dom@17.0.2(react@17.0.2))(react@17.0.2)':
+ '@tanstack/query-core@5.90.14': {}
+
+ '@tanstack/react-query@5.90.14(react@18.3.1)':
+ dependencies:
+ '@tanstack/query-core': 5.90.14
+ react: 18.3.1
+
+ '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@tanstack/table-core': 8.21.3
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
'@tanstack/table-core@8.21.3': {}
@@ -5256,6 +5608,30 @@ snapshots:
dependencies:
'@types/node': 20.19.24
+ '@types/d3-array@3.2.2': {}
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-ease@3.0.2': {}
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-path@3.1.1': {}
+
+ '@types/d3-scale@4.0.9':
+ dependencies:
+ '@types/d3-time': 3.0.4
+
+ '@types/d3-shape@3.1.7':
+ dependencies:
+ '@types/d3-path': 3.1.1
+
+ '@types/d3-time@3.0.4': {}
+
+ '@types/d3-timer@3.0.2': {}
+
'@types/duplexify@3.6.5':
dependencies:
'@types/node': 20.19.24
@@ -5274,9 +5650,9 @@ snapshots:
'@types/qs': 6.14.0
'@types/serve-static': 1.15.10
- '@types/hoist-non-react-statics@3.3.7(@types/react@17.0.89)':
+ '@types/hoist-non-react-statics@3.3.7(@types/react@18.3.27)':
dependencies:
- '@types/react': 17.0.89
+ '@types/react': 18.3.27
hoist-non-react-statics: 3.3.2
'@types/http-errors@2.0.5': {}
@@ -5316,15 +5692,18 @@ snapshots:
'@types/range-parser@1.2.7': {}
+ '@types/react-dom@18.3.7(@types/react@18.3.27)':
+ dependencies:
+ '@types/react': 18.3.27
+
'@types/react-vis@1.11.15':
dependencies:
- '@types/react': 17.0.89
+ '@types/react': 18.3.27
- '@types/react@17.0.89':
+ '@types/react@18.3.27':
dependencies:
'@types/prop-types': 15.7.15
- '@types/scheduler': 0.16.8
- csstype: 3.1.3
+ csstype: 3.2.3
'@types/readdir-glob@1.1.5':
dependencies:
@@ -5342,8 +5721,6 @@ snapshots:
dependencies:
'@types/node': 20.19.24
- '@types/scheduler@0.16.8': {}
-
'@types/send@0.17.6':
dependencies:
'@types/mime': 1.3.5
@@ -5370,6 +5747,8 @@ snapshots:
'@types/underscore@1.13.0': {}
+ '@types/use-sync-external-store@0.0.6': {}
+
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 20.19.24
@@ -5740,8 +6119,6 @@ snapshots:
camelcase@6.3.0: {}
- caniuse-lite@1.0.30001754: {}
-
caniuse-lite@1.0.30001761: {}
cardinal@2.1.1:
@@ -5853,6 +6230,8 @@ snapshots:
cli-width@2.2.1: {}
+ client-only@0.0.1: {}
+
cliui@7.0.4:
dependencies:
string-width: 4.2.3
@@ -5871,6 +6250,8 @@ snapshots:
clone@1.0.4: {}
+ clsx@2.1.1: {}
+
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
@@ -6011,6 +6392,8 @@ snapshots:
csstype@3.1.3: {}
+ csstype@3.2.3: {}
+
csv-streamify@3.0.4:
dependencies:
through2: 2.0.1
@@ -6076,6 +6459,8 @@ snapshots:
dependencies:
d3-array: 3.2.4
+ d3-ease@3.0.1: {}
+
d3-format@3.1.0: {}
d3-geo@3.1.1:
@@ -6123,6 +6508,8 @@ snapshots:
dependencies:
d3-array: 3.2.4
+ d3-timer@3.0.1: {}
+
d3-voronoi@1.1.4: {}
d@1.0.2:
@@ -6174,6 +6561,8 @@ snapshots:
optionalDependencies:
supports-color: 9.4.0
+ decimal.js-light@2.5.1: {}
+
decompress-response@3.3.0:
dependencies:
mimic-response: 1.0.1
@@ -6360,6 +6749,8 @@ snapshots:
hasown: 2.0.2
optional: true
+ es-toolkit@1.43.0: {}
+
es5-ext@0.10.64:
dependencies:
es6-iterator: 2.0.3
@@ -6428,6 +6819,8 @@ snapshots:
eventemitter2@6.4.7: {}
+ eventemitter3@5.0.1: {}
+
events-listener@1.1.0: {}
execa@4.1.0:
@@ -6778,14 +7171,14 @@ snapshots:
safe-buffer: 5.2.1
optional: true
- formik@2.4.9(@types/react@17.0.89)(react@17.0.2):
+ formik@2.4.9(@types/react@18.3.27)(react@18.3.1):
dependencies:
- '@types/hoist-non-react-statics': 3.3.7(@types/react@17.0.89)
+ '@types/hoist-non-react-statics': 3.3.7(@types/react@18.3.27)
deepmerge: 2.2.1
hoist-non-react-statics: 3.3.2
lodash: 4.17.21
lodash-es: 4.17.21
- react: 17.0.2
+ react: 18.3.1
react-fast-compare: 2.0.4
tiny-warning: 1.0.3
tslib: 2.8.1
@@ -7249,6 +7642,10 @@ snapshots:
ieee754@1.2.1: {}
+ immer@10.2.0: {}
+
+ immer@11.1.0: {}
+
import-lazy@2.1.0: {}
imurmurhash@0.1.4: {}
@@ -8047,30 +8444,27 @@ snapshots:
next-tick@1.1.0: {}
- next@12.3.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2):
+ next@16.1.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@next/env': 12.3.7
- '@swc/helpers': 0.4.11
- caniuse-lite: 1.0.30001754
- postcss: 8.4.14
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
- styled-jsx: 5.0.7(react@17.0.2)
- use-sync-external-store: 1.2.0(react@17.0.2)
+ '@next/env': 16.1.1
+ '@swc/helpers': 0.5.15
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.6(react@18.3.1)
optionalDependencies:
- '@next/swc-android-arm-eabi': 12.3.4
- '@next/swc-android-arm64': 12.3.4
- '@next/swc-darwin-arm64': 12.3.4
- '@next/swc-darwin-x64': 12.3.4
- '@next/swc-freebsd-x64': 12.3.4
- '@next/swc-linux-arm-gnueabihf': 12.3.4
- '@next/swc-linux-arm64-gnu': 12.3.4
- '@next/swc-linux-arm64-musl': 12.3.4
- '@next/swc-linux-x64-gnu': 12.3.4
- '@next/swc-linux-x64-musl': 12.3.4
- '@next/swc-win32-arm64-msvc': 12.3.4
- '@next/swc-win32-ia32-msvc': 12.3.4
- '@next/swc-win32-x64-msvc': 12.3.4
+ '@next/swc-darwin-arm64': 16.1.1
+ '@next/swc-darwin-x64': 16.1.1
+ '@next/swc-linux-arm64-gnu': 16.1.1
+ '@next/swc-linux-arm64-musl': 16.1.1
+ '@next/swc-linux-x64-gnu': 16.1.1
+ '@next/swc-linux-x64-musl': 16.1.1
+ '@next/swc-win32-arm64-msvc': 16.1.1
+ '@next/swc-win32-x64-msvc': 16.1.1
+ '@opentelemetry/api': 1.9.0
+ sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@@ -8298,7 +8692,7 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.4.14:
+ postcss@8.4.31:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
@@ -8473,40 +8867,48 @@ snapshots:
- supports-color
optional: true
- react-dom@17.0.2(react@17.0.2):
+ react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
- object-assign: 4.1.1
- react: 17.0.2
- scheduler: 0.20.2
+ react: 18.3.1
+ scheduler: 0.23.2
react-fast-compare@2.0.4: {}
- react-hot-toast@2.6.0(react-dom@17.0.2(react@17.0.2))(react@17.0.2):
+ react-hot-toast@2.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
csstype: 3.1.3
goober: 2.1.18(csstype@3.1.3)
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
react-is@16.13.1: {}
react-is@17.0.2: {}
- react-motion@0.5.2(react@17.0.2):
+ react-motion@0.5.2(react@18.3.1):
dependencies:
performance-now: 0.2.0
prop-types: 15.8.1
raf: 3.4.1
- react: 17.0.2
+ react: 18.3.1
- react-qr-code@2.0.18(react@17.0.2):
+ react-qr-code@2.0.18(react@18.3.1):
dependencies:
prop-types: 15.8.1
qr.js: 0.0.0
- react: 17.0.2
+ react: 18.3.1
+
+ react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1):
+ dependencies:
+ '@types/use-sync-external-store': 0.0.6
+ react: 18.3.1
+ use-sync-external-store: 1.6.0(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.27
+ redux: 5.0.1
- react-vis@1.12.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2):
+ react-vis@1.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
d3-array: 3.2.4
d3-collection: 1.0.7
@@ -8524,14 +8926,13 @@ snapshots:
deep-equal: 1.1.2
global: 4.4.0
prop-types: 15.8.1
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
- react-motion: 0.5.2(react@17.0.2)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-motion: 0.5.2(react@18.3.1)
- react@17.0.2:
+ react@18.3.1:
dependencies:
loose-envify: 1.4.0
- object-assign: 4.1.1
readable-stream@1.1.14:
dependencies:
@@ -8573,10 +8974,36 @@ snapshots:
dependencies:
picomatch: 2.3.1
+ recharts@3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@17.0.2)(react@18.3.1)(redux@5.0.1):
+ dependencies:
+ '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1)
+ clsx: 2.1.1
+ decimal.js-light: 2.5.1
+ es-toolkit: 1.43.0
+ eventemitter3: 5.0.1
+ immer: 10.2.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 17.0.2
+ react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1)
+ reselect: 5.1.1
+ tiny-invariant: 1.3.3
+ use-sync-external-store: 1.6.0(react@18.3.1)
+ victory-vendor: 37.3.6
+ transitivePeerDependencies:
+ - '@types/react'
+ - redux
+
redeyed@2.1.1:
dependencies:
esprima: 4.0.1
+ redux-thunk@3.1.0(redux@5.0.1):
+ dependencies:
+ redux: 5.0.1
+
+ redux@5.0.1: {}
+
regexp.prototype.flags@1.5.4:
dependencies:
call-bind: 1.0.8
@@ -8625,6 +9052,8 @@ snapshots:
requires-port@1.0.0: {}
+ reselect@5.1.1: {}
+
responselike@1.0.2:
dependencies:
lowercase-keys: 1.0.1
@@ -8710,10 +9139,9 @@ snapshots:
safer-buffer@2.1.2: {}
- scheduler@0.20.2:
+ scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
- object-assign: 4.1.1
semver-diff@3.1.1:
dependencies:
@@ -8772,6 +9200,38 @@ snapshots:
setprototypeof@1.2.0: {}
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
+
shebang-command@1.2.0:
dependencies:
shebang-regex: 1.0.0
@@ -8969,9 +9429,10 @@ snapshots:
stubs@3.0.0:
optional: true
- styled-jsx@5.0.7(react@17.0.2):
+ styled-jsx@5.1.6(react@18.3.1):
dependencies:
- react: 17.0.2
+ client-only: 0.0.1
+ react: 18.3.1
superstatic@7.1.0:
dependencies:
@@ -9025,10 +9486,6 @@ snapshots:
has-flag: 2.0.0
supports-color: 5.5.0
- swr@1.3.0(react@17.0.2):
- dependencies:
- react: 17.0.2
-
tailwindcss@4.0.0: {}
tailwindcss@4.1.18: {}
@@ -9099,6 +9556,8 @@ snapshots:
es5-ext: 0.10.64
next-tick: 1.1.0
+ tiny-invariant@1.3.3: {}
+
tiny-warning@1.0.3: {}
tinyglobby@0.2.15:
@@ -9292,9 +9751,9 @@ snapshots:
querystringify: 2.2.0
requires-port: 1.0.0
- use-sync-external-store@1.2.0(react@17.0.2):
+ use-sync-external-store@1.6.0(react@18.3.1):
dependencies:
- react: 17.0.2
+ react: 18.3.1
util-deprecate@1.0.2: {}
@@ -9319,6 +9778,23 @@ snapshots:
core-util-is: 1.0.2
extsprintf: 1.3.0
+ victory-vendor@37.3.6:
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/d3-ease': 3.0.2
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-scale': 4.0.9
+ '@types/d3-shape': 3.1.7
+ '@types/d3-time': 3.0.4
+ '@types/d3-timer': 3.0.2
+ d3-array: 3.2.4
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-scale: 4.0.2
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-timer: 3.0.1
+
vm2@3.10.0:
dependencies:
acorn: 8.15.0
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..3f964ce
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,28 @@
+{
+ "name": "Hemolog 2",
+ "short_name": "Hemolog",
+ "description": "Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#ffffff",
+ "orientation": "portrait-primary",
+ "icons": [
+ {
+ "src": "/images/favicon-16x16.png",
+ "sizes": "16x16",
+ "type": "image/png"
+ },
+ {
+ "src": "/images/favicon-32x32.png",
+ "sizes": "32x32",
+ "type": "image/png"
+ },
+ {
+ "src": "/images/apple-touch-icon.png",
+ "sizes": "180x180",
+ "type": "image/png"
+ }
+ ]
+}
+
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
new file mode 100644
index 0000000..3aff606
--- /dev/null
+++ b/src/app/about/page.tsx
@@ -0,0 +1,124 @@
+import Image from 'next/image'
+
+import StaticHeader from '@/components/shared/staticHeader'
+import Footer from '@/components/shared/footer'
+
+const About = (): JSX.Element => {
+ return (
+
+
+
+
+
The story so far
+
+ More than you would ever want to know about Hemolog
+
+
+
+
+
+
+
+
+
+ Let's face it, there are some exciting developments in the world
+ of Hemophilia research. Honestly, it's not just research
+ anymore. Clinical trials are happening now across the globe. Gene
+ therapy is definitely going to change things for the better, it's
+ just a matter of when it's available to all of us.
+
+
+
+ That being said, it's still important to keep track of your
+ treatments. Maybe even more now than ever. If getting on a trial
+ is something you're interested in, knowing how many bleeds you
+ were having before is really important.
+
+
+
+ Trial or not, keeping track of your treatment habits can be hard
+ and the tools we have aren't great. Hemolog is simple. You track
+ your treatments and Hemolog gives you instant feedback.
+
+
+
+ Insights are something that I always wanted to be a part of
+ Hemolog and now they're finally here.
+
+
+
+
+
+
+ High level insights that help you understand your habits
+
+
+
+
+ These insights are calculated as you log your treatments. Filter by
+ year for a comprehensive view into your treatment history. I've
+ chosen a few insights that are interesting to me. If you have
+ thoughts on what you would like to see, just let me know.
+
+
+
+
Note
+
+ Development is ongoing. Check out the{' '}
+
+ development blog
+ {' '}
+ for updates and changes.
+
+
+
+
+
+
+ Now that Hemolog is back, I hope you enjoy using it as much as I
+ have. It's up to all of us to keep each other accountable. You
+ can{' '}
+
+ view my emergency page
+ {' '}
+ at any time to verify I've been keeping up with my prophy
+ regimen.
+
+
— Michael Schultz
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default About
diff --git a/src/app/api/alert-lightstrip/route.ts b/src/app/api/alert-lightstrip/route.ts
new file mode 100644
index 0000000..06bce00
--- /dev/null
+++ b/src/app/api/alert-lightstrip/route.ts
@@ -0,0 +1,15 @@
+// NOTE(michael): this endpoint isn't used anywhere and was just an
+// exploration of the HUE api.
+import type { NextRequest } from 'next/server'
+
+const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
+
+export async function PUT(_request: NextRequest) {
+ const response = await fetch(`${REQUEST_URL}/state`, {
+ method: 'PUT',
+ body: JSON.stringify({ on: true, hue: 0 }),
+ })
+
+ const result = await response.json()
+ return Response.json(result)
+}
diff --git a/src/app/api/delete-account/route.ts b/src/app/api/delete-account/route.ts
new file mode 100644
index 0000000..0a71c6e
--- /dev/null
+++ b/src/app/api/delete-account/route.ts
@@ -0,0 +1,27 @@
+import { auth } from '@/lib/firebase-admin'
+import { deleteUserAndData } from '@/lib/admin-db/users'
+import type { NextRequest } from 'next/server'
+
+export async function DELETE(request: NextRequest) {
+ try {
+ const token = request.headers.get('token')
+
+ if (!token) {
+ throw new Error('Access denied. Missing valid token.')
+ }
+
+ const { uid } = await auth.verifyIdToken(token)
+
+ if (!uid) {
+ throw new Error('Access denied. Invalid token.')
+ }
+
+ await deleteUserAndData(uid)
+
+ return Response.json({ success: true })
+ } catch (error: unknown) {
+ const errorMessage =
+ error instanceof Error ? error.message : 'Unable to delete account.'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/pages/api/feedback.ts b/src/app/api/feedback/route.ts
similarity index 52%
rename from pages/api/feedback.ts
rename to src/app/api/feedback/route.ts
index 23ce7f3..44cc726 100644
--- a/pages/api/feedback.ts
+++ b/src/app/api/feedback/route.ts
@@ -1,14 +1,16 @@
-import { auth } from 'lib/firebase-admin'
-import { getAllFeedback } from 'lib/admin-db/feedback'
-import type { NextApiRequest, NextApiResponse } from 'next'
+import { auth } from '@/lib/firebase-admin'
+import { getAllFeedback } from '@/lib/admin-db/feedback'
+import type { NextRequest } from 'next/server'
-const feedback = async (req: NextApiRequest, res: NextApiResponse) => {
+export async function GET(request: NextRequest) {
try {
- if (!req.headers.token) {
+ const token = request.headers.get('token')
+
+ if (!token) {
throw { message: 'Access denied. Missing valid token.' }
}
- const { uid } = await auth.verifyIdToken(req.headers.token as string)
+ const { uid } = await auth.verifyIdToken(token)
if (!uid) {
throw {
message: `Invalid token`,
@@ -21,7 +23,7 @@ const feedback = async (req: NextApiRequest, res: NextApiResponse) => {
throw error
}
- return res.status(200).json(feedback)
+ return Response.json(feedback)
} catch (error: unknown) {
const errorMessage =
error &&
@@ -30,8 +32,6 @@ const feedback = async (req: NextApiRequest, res: NextApiResponse) => {
typeof error.message === 'string'
? error.message
: 'An error occurred'
- return res.status(500).send(errorMessage)
+ return Response.json({ error: errorMessage }, { status: 500 })
}
}
-
-export default feedback
diff --git a/src/app/api/flip-lightstrip/route.ts b/src/app/api/flip-lightstrip/route.ts
new file mode 100644
index 0000000..0ffacd1
--- /dev/null
+++ b/src/app/api/flip-lightstrip/route.ts
@@ -0,0 +1,45 @@
+// NOTE(michael): this endpoint isn't used anywhere and was just an
+// exploration of the HUE api.
+import type { NextRequest } from 'next/server'
+
+const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
+
+export async function PUT(request: NextRequest) {
+ const { searchParams } = new URL(request.url)
+ const onParam = searchParams.get('on')
+ let on: boolean | undefined
+
+ if (onParam) {
+ switch (onParam) {
+ case 'false': {
+ on = false
+ break
+ }
+ case 'true': {
+ on = true
+ break
+ }
+ case 'default': {
+ on = true
+ break
+ }
+ }
+ } else {
+ // Get current state and toggle
+ const stateResponse = await fetch(REQUEST_URL, {
+ method: 'GET',
+ })
+ const data = await stateResponse.json()
+ const currentState = data.state.on
+ // toggle light state
+ on = !currentState
+ }
+
+ const response = await fetch(`${REQUEST_URL}/state`, {
+ method: 'PUT',
+ body: JSON.stringify({ on: on }),
+ })
+
+ const result = await response.json()
+ return Response.json(result)
+}
diff --git a/pages/api/log-treatment.ts b/src/app/api/log-treatment/route.ts
similarity index 64%
rename from pages/api/log-treatment.ts
rename to src/app/api/log-treatment/route.ts
index e2f33f6..0d663d7 100644
--- a/pages/api/log-treatment.ts
+++ b/src/app/api/log-treatment/route.ts
@@ -1,27 +1,25 @@
import {
getRecentUserInfusionsByApiKey,
postInfusionByApiKey,
-} from 'lib/admin-db/infusions'
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const logTreatment = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'POST') {
- return res.status(405).send('Requires POST method.')
- }
+} from '@/lib/admin-db/infusions'
+import type { NextRequest } from 'next/server'
+export async function POST(request: NextRequest) {
try {
- const { apikey } = req.query
+ const { searchParams } = new URL(request.url)
+ const apikey = searchParams.get('apikey')
+
if (!apikey) {
throw { message: 'Access denied. Missing api key.' }
}
- if (!req.body) {
+ const body = await request.json()
+
+ if (!body) {
throw { message: 'Missing infusion data.' }
}
- const { infusions, error } = await getRecentUserInfusionsByApiKey(
- apikey as string
- )
+ const { infusions, error } = await getRecentUserInfusionsByApiKey(apikey)
if (error) throw error
@@ -30,12 +28,12 @@ const logTreatment = async (req: NextApiRequest, res: NextApiResponse) => {
try {
const { infusion, error } = await postInfusionByApiKey(
- apikey as string,
+ apikey,
mostRecentInfusion,
- req.body
+ body
)
if (error) throw error
- return res.status(200).json(infusion)
+ return Response.json(infusion)
} catch (error: unknown) {
const errorMessage =
error &&
@@ -44,7 +42,7 @@ const logTreatment = async (req: NextApiRequest, res: NextApiResponse) => {
typeof error.message === 'string'
? error.message
: 'An error occurred'
- return res.status(500).send(errorMessage)
+ return Response.json({ error: errorMessage }, { status: 500 })
}
} catch (error: unknown) {
const errorMessage =
@@ -54,8 +52,6 @@ const logTreatment = async (req: NextApiRequest, res: NextApiResponse) => {
typeof error.message === 'string'
? error.message
: 'An error occurred'
- return res.status(500).send(errorMessage)
+ return Response.json({ error: errorMessage }, { status: 500 })
}
}
-
-export default logTreatment
diff --git a/src/app/api/recent-treatments/route.ts b/src/app/api/recent-treatments/route.ts
new file mode 100644
index 0000000..fd59d02
--- /dev/null
+++ b/src/app/api/recent-treatments/route.ts
@@ -0,0 +1,34 @@
+import { getRecentUserInfusionsByApiKey } from '@/lib/admin-db/infusions'
+import type { NextRequest } from 'next/server'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const apikey = searchParams.get('apikey')
+ const alertid = searchParams.get('alertid')
+
+ if (!apikey && !alertid) {
+ throw { message: 'Access denied. Missing api key.' }
+ }
+
+ const { infusions, error } = await getRecentUserInfusionsByApiKey(
+ apikey || undefined,
+ alertid || undefined
+ )
+
+ if (error) {
+ throw error
+ }
+
+ return Response.json(infusions)
+ } catch (error: unknown) {
+ const errorMessage =
+ error &&
+ typeof error === 'object' &&
+ 'message' in error &&
+ typeof error.message === 'string'
+ ? error.message
+ : 'An error occurred'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/src/app/api/treatments/route.ts b/src/app/api/treatments/route.ts
new file mode 100644
index 0000000..5aa3fca
--- /dev/null
+++ b/src/app/api/treatments/route.ts
@@ -0,0 +1,30 @@
+import { getAllInfusionsByApiKey } from '@/lib/admin-db/infusions'
+import type { NextRequest } from 'next/server'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const apikey = searchParams.get('apikey')
+
+ if (!apikey) {
+ throw { message: 'Access denied. Missing api key.' }
+ }
+
+ const { infusions, error } = await getAllInfusionsByApiKey(apikey)
+
+ if (error) {
+ throw error
+ }
+
+ return Response.json(infusions)
+ } catch (error: unknown) {
+ const errorMessage =
+ error &&
+ typeof error === 'object' &&
+ 'message' in error &&
+ typeof error.message === 'string'
+ ? error.message
+ : 'An error occurred'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/src/app/changelog/[slug]/page.tsx b/src/app/changelog/[slug]/page.tsx
new file mode 100644
index 0000000..e0f29fe
--- /dev/null
+++ b/src/app/changelog/[slug]/page.tsx
@@ -0,0 +1,197 @@
+import { notFound } from 'next/navigation'
+
+import StaticHeader from '@/components/shared/staticHeader'
+import Footer from '@/components/shared/footer'
+import BlogFooter from '@/components/blog/blogFooter'
+import PostFooter from '@/components/blog/postFooter'
+
+interface PageProps {
+ params: Promise<{
+ slug: string
+ }>
+}
+
+const ChangelogPost = async ({ params }: PageProps): Promise => {
+ const { slug } = await params
+
+ // For now, redirect to 404 for unknown slugs
+ // In a real implementation, you would fetch content based on slug
+ if (
+ ![
+ 'hello-world-again',
+ 'mobile-enhancements',
+ 'monoclonal-antibodies',
+ 'raycast-extension',
+ ].includes(slug)
+ ) {
+ notFound()
+ }
+
+ const postData = getPostData(slug)
+
+ return (
+
+
+
+
+
Changelog
+
+ Development blog about new features, fixes, and updates to Hemolog
+
+
+
+
+ {postData.title}
+
+ {postData.subtitle}
+
+
+
+
+
+ {postData.updateLabel}
+
+
+
+ {postData.content}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function getPostData(slug: string) {
+ const posts = {
+ 'hello-world-again': {
+ title: 'Hello world...again',
+ subtitle: 'Hemolog is back and better than ever',
+ updateLabel: 'Update #1',
+ postId: 'post-1',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'Hello world... again',
+ image: ['https://hemolog.com/images/insights-example.png'],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ Hemolog is back! After 8 years, I've built a reincarnation of the
+ old iPhone app Hemolog. This time around, it does a bit more than
+ just storing your treatment logs. In this incarnation, Hemolog is
+ now a web app and helps you understand your logs by showing you
+ stats.
+
+
+ The original Hemolog was built with the help of a contract
+ developer. This time around I've designed and built everything from
+ the ground up with the purpose of being the best place to store your
+ infusion data and learn from it.
+
+ >
+ ),
+ },
+ 'mobile-enhancements': {
+ title: 'Mobile enhancements',
+ subtitle: 'Looks great on your desktop and mobile devices!',
+ updateLabel: 'Update #2',
+ postId: 'post-2',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'Mobile enhancements',
+ image: [
+ 'https://hemolog.com/images/changelog/iphone-hemolog-light.png',
+ ],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ I designed Hemolog to be used anywhere. That meant building a web
+ app verses an iPhone, Android, or some hybrid app.
+
+ >
+ ),
+ },
+ 'monoclonal-antibodies': {
+ title: 'A brand new treatment type',
+ subtitle:
+ "It's finally here. Monoclonal antibodies officially can treat hemophilia, giving us a new method of getting our medicine in our body and a whole lot more.",
+ updateLabel: 'Update #3',
+ postId: 'post-3',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'A brand new treatment type',
+ image: ['https://hemolog.com/images/changelog/about-you.png'],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ I never thought I'd say this, but I no longer simply{' '}
+ infuse to treat bleeds. I also{' '}
+ inject .
+
+
+ That might not sound like a huge difference off the bat, but I can
+ assure you it is. Having to find a vein all the time is now a thing
+ of the past, finally we can inject subcutaneously under the skin,
+ like so many other people. I'm so excited for what this means for
+ people with bad or damage veins and kids! It's just lessens the
+ burden so much.
+
+ >
+ ),
+ },
+ 'raycast-extension': {
+ title: 'Log treatments at the speed of light',
+ subtitle:
+ 'A brand new way to log treatments, directly from your keyboard. Now available on Mac and Windows (beta) via Raycast.',
+ updateLabel: 'Update #4',
+ postId: 'post-4',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'Log treatments at the speed of light',
+ image: ['https://hemolog.com/images/changelog/log-treatment.png'],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ One of my favorite tools to use on my Mac is{' '}
+
+ Raycast
+
+ . It's a productivity tool that lets you quickly launch apps, search
+ the web, and run commands all from your keyboard.
+
+ >
+ ),
+ },
+ }
+
+ return posts[slug as keyof typeof posts] || posts['hello-world-again']
+}
+
+export default ChangelogPost
diff --git a/src/app/changelog/page.tsx b/src/app/changelog/page.tsx
new file mode 100644
index 0000000..35cbbcd
--- /dev/null
+++ b/src/app/changelog/page.tsx
@@ -0,0 +1,226 @@
+'use client'
+
+import Image from 'next/image'
+
+import StaticHeader from '@/components/shared/staticHeader'
+import Footer from '@/components/shared/footer'
+import BlogFooter from '@/components/blog/blogFooter'
+import PostFooter from '@/components/blog/postFooter'
+
+const Changelog = (): JSX.Element => {
+ return (
+
+
+
+
+
Changelog
+
+ Development blog about new features, fixes, and updates to Hemolog
+
+
+
+
+
+
+ Log treatments at the speed of light
+
+
+ A brand new way to log treatments, directly from your keyboard.
+ Now available on Mac and Windows (beta) via{' '}
+
+ Raycast
+
+ .
+
+
+
+
+ Update #4
+
+
+
+ One of my favorite tools to use on my Mac is{' '}
+
+ Raycast
+
+ . It's a productivity tool that lets you quickly launch apps,
+ search the web, and run commands all from your keyboard.
+
+
+
+
+
+
+
+
+
+ A brand new treatment type
+
+
+ It's finally here. Monoclonal antibodies officially can treat
+ hemophilia, giving us a new method of getting our medicine in our
+ body and a whole lot more.
+
+
+
+
+ Update #3
+
+
+
+ I never thought I'd say this, but I no longer simply{' '}
+ infuse to treat bleeds. I also{' '}
+ inject .
+
+
+ That might not sound like a huge difference off the bat, but I can
+ assure you it is. Having to find a vein all the time is now a
+ thing of the past, finally we can inject subcutaneously under the
+ skin, like so many other people. I'm so excited for what this
+ means for people with bad or damage veins and kids! It's just
+ lessens the burden so much.
+
+
+
+
+
+
+
+
+ Mobile enhancements
+
+ Looks great on your desktop and mobile devices!
+
+
+
+
+ Update #2
+
+
+
+ I designed Hemolog to be used anywhere. That meant building a web
+ app verses an iPhone, Android, or some hybrid app.
+
+
+
+
+
+
+
+ Hello world...again
+
+ Hemolog is back and better than ever
+
+
+
+
+
+ Update #1
+
+
+
+ Hemolog is back! After 8 years, I've built a reincarnation of the
+ old iPhone app Hemolog. This time around, it does a bit more than
+ just storing your treatment logs. In this incarnation, Hemolog is
+ now a web app and helps you understand your logs by giving showing
+ you stats.
+
+
+ The original Hemolog was built with the help of a contract
+ developer. This time around I've designed and built everything
+ from the ground up with the purpose of being the best place to
+ store your infusion data and learn from it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Changelog
diff --git a/src/app/emergency/[alertId]/page.tsx b/src/app/emergency/[alertId]/page.tsx
new file mode 100644
index 0000000..7de9686
--- /dev/null
+++ b/src/app/emergency/[alertId]/page.tsx
@@ -0,0 +1,104 @@
+'use client'
+
+import { useState, useEffect } from 'react'
+import { useParams } from 'next/navigation'
+import Link from 'next/link'
+
+import { useEmergencyUserQuery } from '@/lib/hooks/useEmergencyUserQuery'
+import EmergencyInfo from '@/components/emergency/emergencyInfo'
+import Footer from '@/components/shared/footer'
+
+const Emergency = (): JSX.Element => {
+ const [mounted, setMounted] = useState(false)
+ const params = useParams()
+ const alertId = params.alertId as string
+ let isExample = false
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ if (alertId === 'example') {
+ isExample = true
+ }
+
+ const { person, isLoading, isError, error } = useEmergencyUserQuery(
+ isExample ? 'mike29' : alertId
+ )
+
+ // During SSR and initial hydration, show loading state to prevent mismatch
+ const displayLoading = !mounted || isLoading
+
+ return (
+
+ {/* Header */}
+
+ Emergency Info
+
+ Hemolog.com
+
+
+
+ {/* Disclaimer and Important Note */}
+
+
+ This page shows the most recent medical logs for someone with
+ hemophilia.
+ This data is self reported and may not be up-to-date.
+
+
+
+
Important
+
+ If someone has been in an accident, please call{' '}
+
+ 911
+ {' '}
+ immediately.
+
+
+
+
+ {/* Main Content */}
+
+ {displayLoading && (
+
+
+
Loading emergency info
+
+ )}
+
+ {mounted && (isError || error) && (
+
+
Error
+
+ Something went wrong. This could mean that this person no longer
+ has a Hemolog account or the app is broken.
+
+
+ )}
+
+ {mounted && !person && !displayLoading && !isError && (
+
+
Try again
+
+ Nothing could be found at this address. Please make sure the URL
+ matches the link provided on the Hemolog Emergency Card.
+
+
+ )}
+
+ {mounted && person && }
+
+
+
+ )
+}
+
+export default Emergency
diff --git a/pages/emergency/print.tsx b/src/app/emergency/print/page.tsx
similarity index 89%
rename from pages/emergency/print.tsx
rename to src/app/emergency/print/page.tsx
index 548dd17..d4efdf4 100644
--- a/pages/emergency/print.tsx
+++ b/src/app/emergency/print/page.tsx
@@ -1,6 +1,7 @@
-import Head from 'next/head'
-import Logo from 'components/logo'
-import EmergencyCard from 'components/emergencyCard'
+'use client'
+
+import Logo from '@/components/shared/logo'
+import EmergencyCard from '@/components/home/emergencyCard'
export default function Print(): JSX.Element {
// TODO(michael) Could improve this by determining the user on the server side
@@ -21,10 +22,6 @@ export default function Print(): JSX.Element {
}
`}
-
- Hemolog - Print
-
-
diff --git a/styles/globals.css b/src/app/globals.css
similarity index 100%
rename from styles/globals.css
rename to src/app/globals.css
diff --git a/pages/home.tsx b/src/app/home/page.tsx
similarity index 72%
rename from pages/home.tsx
rename to src/app/home/page.tsx
index 5267915..11ac417 100644
--- a/pages/home.tsx
+++ b/src/app/home/page.tsx
@@ -1,26 +1,19 @@
-import { useEffect } from 'react'
-import Head from 'next/head'
-import { useRouter } from 'next/router'
-import { Tabs, TabsItem } from 'components/Tabs'
+'use client'
-import Header from 'components/header'
-import Footer from 'components/footer'
-import { withAuth } from 'components/withAuth'
-import { useAuth, ProtectRoute } from 'lib/auth'
-import HomePage from 'components/homePage'
-import ProfilePage from 'components/profilePage'
-import FeedbackPage from 'components/feedbackPage'
-import { track } from 'lib/helpers'
+import { useEffect } from 'react'
+import { usePathname } from 'next/navigation'
+import { Tabs, TabsItem } from '@/components/home/Tabs'
-export async function getStaticProps() {
- return {
- props: {
- version: process.env.npm_package_version,
- },
- }
-}
+import Header from '@/components/home/header'
+import Footer from '@/components/shared/footer'
+import { withAuth } from '@/components/shared/withAuth'
+import { useAuth, ProtectRoute } from '@/lib/auth'
+import HomePage from '@/components/home/homePage'
+import ProfilePage from '@/components/home/profilePage'
+import FeedbackPage from '@/components/home/feedbackPage'
+import { track } from '@/lib/helpers'
-const Home = (props: { version: string }): JSX.Element => {
+const Home = (): JSX.Element => {
// TODO(michael) add welcome message by checking to see if this is the users
// first time logging in. Still not sure how to accomplish this.
//
@@ -49,8 +42,8 @@ const Home = (props: { version: string }): JSX.Element => {
// it here https://www.youtube.com/watch?v=NSR_Y_rm_zU
const { user } = useAuth()
- const router = useRouter()
- const { version } = props
+ const pathname = usePathname()
+ const version = process.env.npm_package_version
useEffect(() => {
if (user) {
@@ -64,15 +57,12 @@ const Home = (props: { version: string }): JSX.Element => {
return (
-
- Hemolog
-
-
+
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..5e8918b
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,85 @@
+import type { Metadata } from 'next'
+import { Providers } from './providers'
+import './globals.css'
+
+export const metadata: Metadata = {
+ title: 'Hemolog',
+ description:
+ 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.',
+ openGraph: {
+ url: 'https://hemolog.com',
+ type: 'website',
+ title: 'Hemolog 2',
+ description:
+ 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.',
+ images: [
+ {
+ url: 'https://hemolog.com/images/og-image.png',
+ },
+ ],
+ },
+ twitter: {
+ card: 'summary_large_image',
+ title: 'Hemolog 2',
+ description:
+ 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.',
+ images: [
+ {
+ url: 'https://hemolog.com/images/og-image.png',
+ },
+ ],
+ },
+ icons: {
+ apple: '/images/apple-touch-icon.png',
+ icon: [
+ {
+ url: '/images/favicon-32x32.png',
+ sizes: '32x32',
+ type: 'image/png',
+ },
+ {
+ url: '/images/favicon-16x16.png',
+ sizes: '16x16',
+ type: 'image/png',
+ },
+ ],
+ },
+ manifest: '/manifest.json',
+ other: {
+ 'mobile-web-app-capable': 'yes',
+ 'apple-mobile-web-app-capable': 'yes',
+ },
+}
+
+const googleRichResultsSchema = {
+ '@context': 'https://schema.org',
+ '@type': 'Organization',
+ url: 'https://hemolog.com',
+ logo: 'https://hemolog.com/images/hemolog-logo.png',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+
+
+
+
+ {children}
+
+
+ )
+}
diff --git a/pages/404.tsx b/src/app/not-found.tsx
similarity index 66%
rename from pages/404.tsx
rename to src/app/not-found.tsx
index d03fd74..9d2d7a9 100644
--- a/pages/404.tsx
+++ b/src/app/not-found.tsx
@@ -1,8 +1,10 @@
+'use client'
+
import { useEffect } from 'react'
-import { useRouter } from 'next/router'
-import { withAuth } from 'components/withAuth'
-import { useAuth } from 'lib/auth'
-import LoadingScreen from 'components/loadingScreen'
+import { useRouter } from 'next/navigation'
+import { withAuth } from '@/components/shared/withAuth'
+import { useAuth } from '@/lib/auth'
+import LoadingScreen from '@/components/shared/loadingScreen'
function Custom404(): JSX.Element {
const router = useRouter()
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..9c95bf4
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,57 @@
+import Link from 'next/link'
+import Image from 'next/image'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
+import DescriptionCards from '@/components/landing/descriptionCards'
+
+export default function Landing(): JSX.Element {
+ return (
+
+
+
+ {/* Background illustration */}
+
+
+
+
+ {/* Content */}
+
+
+ TREATMENT INSIGHTS
+ THAT MATTER
+
+
+ The last treatment log you'll ever need.
+
+
+
+
+ Log your treatments and get fantastic insights that help you
+ change your habits.
+
+ Sign up for free and start using the newest version of Hemolog
+ today!
+
+
+
+ Learn more about the Hemolog story...
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/providers.tsx b/src/app/providers.tsx
new file mode 100644
index 0000000..b656086
--- /dev/null
+++ b/src/app/providers.tsx
@@ -0,0 +1,24 @@
+'use client'
+
+import { Toaster } from 'react-hot-toast'
+import { ThemeProvider } from '@/lib/contexts/ThemeContext'
+import { AuthProvider } from '@/lib/auth'
+import { QueryProvider } from '@/lib/providers/query-provider'
+
+export function Providers({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
+
+ {children}
+
+
+
+ )
+}
diff --git a/src/app/signin/page.tsx b/src/app/signin/page.tsx
new file mode 100644
index 0000000..e69ea5d
--- /dev/null
+++ b/src/app/signin/page.tsx
@@ -0,0 +1,104 @@
+'use client'
+
+import { useEffect } from 'react'
+import { useRouter } from 'next/navigation'
+import Logo from '@/components/shared/logo'
+import Footer from '@/components/shared/footer'
+import { withAuth } from '@/components/shared/withAuth'
+import { useAuth } from '@/lib/auth'
+import LoadingScreen from '@/components/shared/loadingScreen'
+
+const Signin = () => {
+ const auth = useAuth()
+ const router = useRouter()
+ const version = process.env.npm_package_version
+
+ // Redirect authenticated users to home
+ useEffect(() => {
+ if (auth.user && !auth.loading) {
+ router.replace('/home')
+ }
+ }, [auth.user, auth.loading, router])
+
+ // Show loading while checking auth state or redirecting
+ if (auth.loading || auth.user) {
+ return
+ }
+
+ return (
+
+
+
+
+
+
Important
+
+ Hemolog is currently in development. Data integrity is not
+ guaranteed. Hemolog is{' '}
+
+ not
+ {' '}
+ HIPAA compliant... yada yada yada.
+
+
+
+
+
+
Register or sign in
+
+ Signing in will create an account if you don't have one yet. Don't
+ worry, Hemolog will always be free .
+
+
+
+ {!process.env.NEXT_PUBLIC_USE_EMULATORS && (
+
auth.signinWithGoogle?.('/home')}
+ disabled={auth.loading}
+ className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2'
+ >
+ {auth.loading && (
+
+ )}
+ Continue with Google
+
+ )}
+ {process.env.NEXT_PUBLIC_USE_EMULATORS && (
+
auth.signinWithTestUser?.()}
+ disabled={auth.loading}
+ className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2'
+ >
+ {auth.loading && (
+
+ )}
+ Continue with Test User
+
+ )}
+
+
+
+
+ {/*
+
+
*/}
+
+
+
+
+ )
+}
+
+export default withAuth(Signin)
diff --git a/components/blog/blogFooter.tsx b/src/components/blog/blogFooter.tsx
similarity index 93%
rename from components/blog/blogFooter.tsx
rename to src/components/blog/blogFooter.tsx
index 8cc7aff..94bf6c8 100644
--- a/components/blog/blogFooter.tsx
+++ b/src/components/blog/blogFooter.tsx
@@ -1,12 +1,14 @@
-import { useRouter } from 'next/router'
+'use client'
+
+import { useRouter } from 'next/navigation'
import Image from 'next/image'
-import { useAuth } from 'lib/auth'
+import { useAuth } from '@/lib/auth'
export default function BlogFooter(): JSX.Element {
const { user, loading } = useAuth()
-
const router = useRouter()
+
return (
diff --git a/components/blog/postFooter.tsx b/src/components/blog/postFooter.tsx
similarity index 99%
rename from components/blog/postFooter.tsx
rename to src/components/blog/postFooter.tsx
index ba270de..8714b88 100644
--- a/components/blog/postFooter.tsx
+++ b/src/components/blog/postFooter.tsx
@@ -1,3 +1,5 @@
+'use client'
+
import { IconShare } from '@tabler/icons-react'
import toast from 'react-hot-toast'
diff --git a/components/emergencyInfo.tsx b/src/components/emergency/emergencyInfo.tsx
similarity index 84%
rename from components/emergencyInfo.tsx
rename to src/components/emergency/emergencyInfo.tsx
index 0c0d233..fcc5486 100644
--- a/components/emergencyInfo.tsx
+++ b/src/components/emergency/emergencyInfo.tsx
@@ -1,7 +1,7 @@
import React from 'react'
-import InfusionTable from 'components/infusionTable'
-import type { Person } from 'lib/types/person'
-import { useAuth } from 'lib/auth'
+import InfusionTable from '@/components/home/infusionTable'
+import type { Person } from '@/lib/types/person'
+import { useAuth } from '@/lib/auth'
interface Props {
person: Person
@@ -50,11 +50,20 @@ export default function EmergencyInfo(props: Props): JSX.Element {
Most recent treatments
- {smallerThanSmall && (
- Swipe →
- )}
+
+ {smallerThanSmall && 'Swipe →'}
+
-
+ {person.uid ? (
+
+ ) : (
+
+
Warning
+
+ User ID is missing. Treatment data cannot be loaded.
+
+
+ )}
Note
diff --git a/components/Tabs.tsx b/src/components/home/Tabs.tsx
similarity index 100%
rename from components/Tabs.tsx
rename to src/components/home/Tabs.tsx
diff --git a/src/components/home/chart.tsx b/src/components/home/chart.tsx
new file mode 100644
index 0000000..927cb37
--- /dev/null
+++ b/src/components/home/chart.tsx
@@ -0,0 +1,119 @@
+import {
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ ResponsiveContainer,
+} from 'recharts'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { filterInfusions } from '@/lib/helpers'
+import { TreatmentTypeEnum } from '@/lib/db/infusions'
+
+type ChartDataEntry = {
+ month: string
+ bleed: number
+ preventative: number
+ prophy: number
+ antibody: number
+}
+
+interface ChartProps {
+ filterYear: string
+}
+
+export default function Chart(props: ChartProps): JSX.Element | null {
+ const { filterYear } = props
+ const { data } = useInfusionsQuery()
+
+ if (!data) {
+ return null
+ }
+
+ const filteredInfusions = filterInfusions(data, filterYear)
+
+ const bleeds = filteredInfusions
+ .filter((entry) => entry.type === TreatmentTypeEnum.BLEED)
+ .map((bleed) => bleed.date)
+
+ const preventative = filteredInfusions
+ .filter((entry) => entry.type === TreatmentTypeEnum.PREVENTATIVE)
+ .map((preventitive) => preventitive.date)
+
+ const prophy = filteredInfusions
+ .filter((entry) => entry.type === TreatmentTypeEnum.PROPHY)
+ .map((prophy) => prophy.date)
+
+ const antibody = filteredInfusions
+ .filter((entry) => entry.type === TreatmentTypeEnum.ANTIBODY)
+ .map((antibody) => antibody.date)
+
+ const monthNames = [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ]
+
+ // Initialize chart data with all months
+ const chartData: ChartDataEntry[] = monthNames.map((month) => ({
+ month,
+ bleed: 0,
+ preventative: 0,
+ prophy: 0,
+ antibody: 0,
+ }))
+
+ // Distribute infusions into months
+ type NumericChartKeys = 'bleed' | 'preventative' | 'prophy' | 'antibody'
+ const distributeInfusions = (infusions: string[], type: NumericChartKeys) => {
+ for (const infusion of infusions) {
+ // Extract month from YYYY-MM-DD format (zero-based index)
+ const monthIndex = Number.parseInt(infusion.split('-')[1], 10) - 1
+ if (monthIndex >= 0 && monthIndex < 12) {
+ chartData[monthIndex][type] = chartData[monthIndex][type] + 1
+ }
+ }
+ }
+
+ distributeInfusions(bleeds, 'bleed')
+ distributeInfusions(preventative, 'preventative')
+ distributeInfusions(prophy, 'prophy')
+ distributeInfusions(antibody, 'antibody')
+
+ // Calculate max Y value for proper scaling
+ const maxY = Math.max(
+ ...chartData.map(
+ (entry) =>
+ entry.bleed + entry.preventative + entry.prophy + entry.antibody
+ ),
+ 1
+ )
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/components/emergencyCard.tsx b/src/components/home/emergencyCard.tsx
similarity index 90%
rename from components/emergencyCard.tsx
rename to src/components/home/emergencyCard.tsx
index 8403006..01aaaeb 100644
--- a/components/emergencyCard.tsx
+++ b/src/components/home/emergencyCard.tsx
@@ -1,9 +1,10 @@
+'use client'
import React from 'react'
import Link from 'next/link'
import QRCode from 'react-qr-code'
-import { useAuth } from 'lib/auth'
-import useDbUser from 'lib/hooks/useDbUser'
+import { useAuth } from '@/lib/auth'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
interface Props {
forPrint?: boolean
@@ -11,7 +12,7 @@ interface Props {
export default function EmergencyCard({ forPrint }: Props): JSX.Element {
const { user } = useAuth()
- const { person } = useDbUser(user?.uid || '')
+ const { person } = useUserQuery(user?.uid)
// Check if we're on mobile - use a simple approach for now
const [isMobile, setIsMobile] = React.useState(false)
@@ -35,6 +36,7 @@ export default function EmergencyCard({ forPrint }: Props): JSX.Element {
return (
-
-
-
- {alertUrl}
-
-
+
+
{alertUrl}
Visit your page to preview what others will see.
diff --git a/components/feedbackModal.tsx b/src/components/home/feedbackModal.tsx
similarity index 96%
rename from components/feedbackModal.tsx
rename to src/components/home/feedbackModal.tsx
index e0f2086..e6e859a 100644
--- a/components/feedbackModal.tsx
+++ b/src/components/home/feedbackModal.tsx
@@ -1,9 +1,9 @@
import { useFormik } from 'formik'
import toast from 'react-hot-toast'
-import { useAuth } from 'lib/auth'
-import { createFeedback, type FeedbackType } from 'lib/db/feedback'
-import type { AttachedUserType } from 'lib/types/users'
+import { useAuth } from '@/lib/auth'
+import { createFeedback, type FeedbackType } from '@/lib/db/feedback'
+import type { AttachedUserType } from '@/lib/types/users'
interface FeedbackValues {
message: string
diff --git a/components/feedbackPage.tsx b/src/components/home/feedbackPage.tsx
similarity index 74%
rename from components/feedbackPage.tsx
rename to src/components/home/feedbackPage.tsx
index a2e8e39..6f266e9 100644
--- a/components/feedbackPage.tsx
+++ b/src/components/home/feedbackPage.tsx
@@ -1,9 +1,10 @@
-import useSWR from 'swr'
+'use client'
+
+import { useQuery } from '@tanstack/react-query'
import { format } from 'date-fns'
-import fetcher from 'lib/fetcher'
-import { useAuth } from 'lib/auth'
-import type { FeedbackType } from 'lib/db/feedback'
-import LoadingScreen from 'components/loadingScreen'
+import { useAuth } from '@/lib/auth'
+import type { FeedbackType } from '@/lib/db/feedback'
+import LoadingScreen from '@/components/shared/loadingScreen'
const handleReplyClick = (email: string) => {
window.location.assign(
@@ -11,20 +12,30 @@ const handleReplyClick = (email: string) => {
)
}
+async function fetchFeedback(token: string): Promise
{
+ const response = await fetch('/api/feedback', {
+ headers: { token },
+ })
+ if (!response.ok) {
+ throw new Error('Failed to fetch feedback')
+ }
+ return response.json()
+}
+
const FeedbackPage = () => {
const { user } = useAuth()
- const { data, error } = useSWR(
- user?.isAdmin ? ['/api/feedback', user.token] : null,
- fetcher
- )
+ const { data, isLoading, isError } = useQuery({
+ queryKey: ['feedback'],
+ queryFn: () => fetchFeedback(user?.token || ''),
+ enabled: !!user?.isAdmin && !!user?.token,
+ })
- if (error) {
+ if (isError) {
console.error({ message: 'Feedback API failed' })
-
return No data found
}
- if (!data) {
+ if (isLoading || !data) {
return
}
diff --git a/components/header.tsx b/src/components/home/header.tsx
similarity index 85%
rename from components/header.tsx
rename to src/components/home/header.tsx
index 2845b18..2668411 100644
--- a/components/header.tsx
+++ b/src/components/home/header.tsx
@@ -1,8 +1,10 @@
+'use client'
+
import React from 'react'
-import { useAuth } from 'lib/auth'
-import Logo from 'components/logo'
-import InfusionModal from 'components/infusionModal'
+import { useAuth } from '@/lib/auth'
+import Logo from '@/components/shared/logo'
+import InfusionModal from '@/components/home/infusionModal'
interface Props {
version?: string
@@ -50,17 +52,13 @@ const Header = (props: Props): JSX.Element | null => {
// }
if (user) {
- const avatarInitial =
- user.name?.charAt(0) ||
- user.displayName?.charAt(0) ||
- user.email?.charAt(0) ||
- '?'
+ const avatarInitial = user.name?.charAt(0) || user.email?.charAt(0) || '?'
return (
<>
-
+
{!isMobile && (
{
- {isMobile && (
- setInfusionModal(true)}
- className='w-full bg-green-100 hover:bg-green-200 text-green-800 px-4 py-3 rounded-lg font-medium transition-colors'
- >
- Log infusion
-
- )}
+
+ {isMobile && (
+ setInfusionModal(true)}
+ className='w-full bg-green-100 hover:bg-green-200 text-green-800 px-4 py-3 rounded-lg font-medium transition-colors'
+ >
+ Log infusion
+
+ )}
+
import('components/chart'), {
+// Lazy load Chart component (includes recharts) - only loads when needed
+const Chart = dynamic(() => import('@/components/home/chart'), {
ssr: false,
})
@@ -25,7 +27,7 @@ const HomePage = (): JSX.Element => {
return () => window.removeEventListener('resize', checkMobile)
}, [])
- const { data } = useInfusions()
+ const { data } = useInfusionsQuery()
const infusionYears = data
? data
@@ -130,9 +132,9 @@ const HomePage = (): JSX.Element => {
Treatments
- {smallerThanSmall && (
- Swipe →
- )}
+
+ {smallerThanSmall && 'Swipe →'}
+
>
diff --git a/components/infusionModal.tsx b/src/components/home/infusionModal.tsx
similarity index 91%
rename from components/infusionModal.tsx
rename to src/components/home/infusionModal.tsx
index 0fa4dc7..475ab1d 100644
--- a/components/infusionModal.tsx
+++ b/src/components/home/infusionModal.tsx
@@ -1,18 +1,17 @@
import { useFormik } from 'formik'
-import { compareDesc, format, parseISO } from 'date-fns'
+import { format } from 'date-fns'
-import { useAuth } from 'lib/auth'
-import { track } from 'lib/helpers'
+import { useAuth } from '@/lib/auth'
+import { track } from '@/lib/helpers'
import toast from 'react-hot-toast'
import {
- createInfusion,
type TreatmentType,
TreatmentTypeEnum,
type TreatmentTypeOptions,
- updateInfusion,
-} from 'lib/db/infusions'
-import type { AttachedUserType } from 'lib/types/users'
-import useInfusions from 'lib/hooks/useInfusions'
+} from '@/lib/db/infusions'
+import type { AttachedUserType } from '@/lib/types/users'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { useInfusionMutations } from '@/lib/hooks/useInfusionMutations'
interface InfusionValues {
brand: string
@@ -36,15 +35,16 @@ interface InfusionModalProps {
export default function InfusionModal(props: InfusionModalProps): JSX.Element {
const { visible, setVisible, infusion } = props
const { user } = useAuth()
- const { data: infusions } = useInfusions()
-
- // TODO:(michael) limit the firebase call instead of having
- // to return all the infusions and filtering them here
- infusions?.sort((a, b) => compareDesc(parseISO(a.date), parseISO(b.date)))
+ const { data: infusions } = useInfusionsQuery()
+ const { createInfusion, updateInfusion } = useInfusionMutations({
+ onCreateSuccess: () => closeModal(),
+ onUpdateSuccess: () => closeModal(),
+ })
+ // Infusions are already sorted by the query hook (newest first)
const previousInfusion = infusions?.[0]
- const handleCreateInfusion = async (infusion: InfusionValues) => {
+ const handleCreateInfusion = async (infusionValues: InfusionValues) => {
const infusionUser: AttachedUserType = {
email: user?.email || '',
name: user?.name || '',
@@ -53,7 +53,7 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
}
// TODO:(michael) should probably move to toLocaleString()
- const { date, brand, lot, units, cause, sites, type } = infusion
+ const { date, brand, lot, units, cause, sites, type } = infusionValues
const payload: TreatmentType = {
cause,
createdAt: new Date().toISOString(),
@@ -70,18 +70,9 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
}
createInfusion(payload)
- .then(() => {
- toast.success('Treatment logged! Hope all is well.')
- closeModal()
- })
- .catch((error: unknown) =>
- toast.error(
- `Something went wrong: ${error instanceof Error ? error.message : String(error)}`
- )
- )
}
- const handleUpdateInfusion = async (infusion: InfusionValues) => {
+ const handleUpdateInfusion = async (infusionValues: InfusionValues) => {
const infusionUser: AttachedUserType = {
email: user?.email || '',
name: user?.name || '',
@@ -89,7 +80,7 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
uid: user?.uid || '',
}
- const { uid, date, brand, lot, units, cause, sites, type } = infusion
+ const { uid, date, brand, lot, units, cause, sites, type } = infusionValues
const payload: TreatmentType = {
cause,
createdAt: new Date().toISOString(),
@@ -105,14 +96,11 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
user: infusionUser,
}
- uid
- ? updateInfusion(uid, payload)
- .then(() => {
- toast.success('Treatment updated!')
- closeModal()
- })
- .catch((error) => toast.error(`Something went wrong: ${error}`))
- : toast.error('Treatment database entry not found')
+ if (uid) {
+ updateInfusion({ uid, userUid: user?.uid || '', data: payload })
+ } else {
+ toast.error('Treatment database entry not found')
+ }
}
const closeModal = () => {
diff --git a/components/infusionTable.tsx b/src/components/home/infusionTable.tsx
similarity index 52%
rename from components/infusionTable.tsx
rename to src/components/home/infusionTable.tsx
index 5a0006e..3eb5ff9 100644
--- a/components/infusionTable.tsx
+++ b/src/components/home/infusionTable.tsx
@@ -1,4 +1,6 @@
-import { useState } from 'react'
+'use client'
+
+import { useState, useMemo } from 'react'
import { format, parseISO } from 'date-fns'
import {
useReactTable,
@@ -11,16 +13,11 @@ import {
} from '@tanstack/react-table'
import { IconChevronUp, IconChevronDown, IconDots } from '@tabler/icons-react'
-import useInfusions from 'lib/hooks/useInfusions'
-import { FirestoreStatusType } from 'lib/hooks/useFirestoreQuery'
-import {
- type TreatmentType,
- TreatmentTypeEnum,
- deleteInfusion,
-} from 'lib/db/infusions'
-import { useAuth } from 'lib/auth'
-import { filterInfusions } from 'lib/helpers'
-import toast from 'react-hot-toast'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { useInfusionMutations } from '@/lib/hooks/useInfusionMutations'
+import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/infusions'
+import { useAuth } from '@/lib/auth'
+import { filterInfusions } from '@/lib/helpers'
import InfusionModal from './infusionModal'
interface InfusionTableProps {
@@ -31,8 +28,14 @@ interface InfusionTableProps {
export default function InfusionTable(props: InfusionTableProps): JSX.Element {
const { limit, uid, filterYear } = props
- const { data: infusions, status, error } = useInfusions(limit, uid)
+ const {
+ data: infusions,
+ isLoading,
+ isError,
+ error,
+ } = useInfusionsQuery({ limit, uid })
const { user } = useAuth()
+ const { deleteInfusion } = useInfusionMutations()
const [selectedInfusion, setSelectedInfusion] = useState()
const [infusionModal, setInfusionModal] = useState(false)
const [sorting, setSorting] = useState([
@@ -45,151 +48,148 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
const isLoggedInUser = user && (!uid || uid === user.uid)
// Delete function
- const deleteRow = (uid: string) => {
- deleteInfusion(uid)
- .then(() => {
- toast.success('Treatment deleted.')
- })
- .catch((error: unknown) =>
- toast.error(
- `Something went wrong: ${error instanceof Error ? error.message : String(error)}`
- )
- )
+ const deleteRow = (infusionUid: string) => {
+ deleteInfusion({ uid: infusionUid, userUid: user?.uid || '' })
}
- // Column definitions
- const columns: ColumnDef[] = [
- {
- accessorKey: 'date',
- header: 'Date',
- cell: ({ getValue }) => {
- const dateString = getValue() as string
- const parsedDate = parseISO(dateString)
- return format(parsedDate, 'MM/dd/yyyy')
+ // Column definitions - memoized to prevent recreation on every render
+ const columns: ColumnDef[] = useMemo(() => {
+ const baseColumns: ColumnDef[] = [
+ {
+ accessorKey: 'date',
+ header: 'Date',
+ cell: ({ getValue }) => {
+ const dateString = getValue() as string
+ const parsedDate = parseISO(dateString)
+ return format(parsedDate, 'MM/dd/yyyy')
+ },
+ sortingFn: (rowA, rowB) => {
+ const dateA = parseISO(rowA.getValue('date') as string)
+ const dateB = parseISO(rowB.getValue('date') as string)
+ return dateA.getTime() - dateB.getTime()
+ },
},
- sortingFn: (rowA, rowB) => {
- const dateA = parseISO(rowA.getValue('date') as string)
- const dateB = parseISO(rowB.getValue('date') as string)
- return dateA.getTime() - dateB.getTime()
- },
- },
- {
- accessorKey: 'type',
- header: 'Reason',
- cell: ({ getValue }) => {
- const type = getValue() as TreatmentTypeEnum
- const badgeStyles = {
- [TreatmentTypeEnum.BLEED]: 'bg-red-100 text-red-800',
- [TreatmentTypeEnum.PROPHY]: 'bg-yellow-100 text-yellow-800',
- [TreatmentTypeEnum.PREVENTATIVE]: 'bg-orange-100 text-orange-800',
- [TreatmentTypeEnum.ANTIBODY]: 'bg-gray-100 text-gray-800',
- }
+ {
+ accessorKey: 'type',
+ header: 'Reason',
+ cell: ({ getValue }) => {
+ const type = getValue() as TreatmentTypeEnum
+ const badgeStyles = {
+ [TreatmentTypeEnum.BLEED]: 'bg-red-100 text-red-800',
+ [TreatmentTypeEnum.PROPHY]: 'bg-yellow-100 text-yellow-800',
+ [TreatmentTypeEnum.PREVENTATIVE]: 'bg-orange-100 text-orange-800',
+ [TreatmentTypeEnum.ANTIBODY]: 'bg-gray-100 text-gray-800',
+ }
- return (
-
- {TreatmentTypeEnum[type]}
-
- )
+ return (
+
+ {TreatmentTypeEnum[type]}
+
+ )
+ },
},
- },
- {
- accessorKey: 'sites',
- header: 'Bleed sites',
- },
- {
- accessorKey: 'cause',
- header: 'Cause',
- },
- {
- accessorKey: 'medication.brand',
- header: 'Factor',
- cell: ({ row }) => row.original.medication.brand,
- },
- {
- accessorKey: 'medication.units',
- header: 'Amount',
- cell: ({ getValue }) => {
- const units = getValue() as number
- return units ? `${units} iu` : ''
+ {
+ accessorKey: 'sites',
+ header: 'Bleed sites',
},
- },
- ]
-
- // Add actions column for logged-in users
- if (isLoggedInUser) {
- columns.push({
- id: 'actions',
- header: '',
- cell: ({ row }) => {
- const infusion = row.original
- return (
-
-
{
- // Simple dropdown implementation
- const menu = document.createElement('div')
- menu.innerHTML = `
-
-
- Update
-
-
- Delete
-
-
- `
- menu.style.position = 'absolute'
- menu.style.right = '0'
- menu.style.top = '100%'
- menu.style.zIndex = '50'
+ {
+ accessorKey: 'cause',
+ header: 'Cause',
+ },
+ {
+ accessorKey: 'medication.brand',
+ header: 'Factor',
+ cell: ({ row }) => row.original.medication.brand,
+ },
+ {
+ accessorKey: 'medication.units',
+ header: 'Amount',
+ cell: ({ getValue }) => {
+ const units = getValue() as number
+ return units ? `${units} iu` : ''
+ },
+ },
+ ]
- // Handle clicks
- const editBtn = menu.querySelector(
- '[data-action="edit"]'
- ) as HTMLButtonElement
- const deleteBtn = menu.querySelector(
- '[data-action="delete"]'
- ) as HTMLButtonElement
+ // Add actions column for logged-in users
+ if (isLoggedInUser) {
+ baseColumns.push({
+ id: 'actions',
+ header: '',
+ cell: ({ row }) => {
+ const infusion = row.original
+ return (
+
+
{
+ // Simple dropdown implementation
+ const menu = document.createElement('div')
+ menu.innerHTML = `
+
+
+ Update
+
+
+ Delete
+
+
+ `
+ menu.style.position = 'absolute'
+ menu.style.right = '0'
+ menu.style.top = '100%'
+ menu.style.zIndex = '50'
- editBtn.onclick = () => {
- setSelectedInfusion(infusion)
- setInfusionModal(true)
- document.body.removeChild(menu)
- }
+ // Handle clicks
+ const editBtn = menu.querySelector(
+ '[data-action="edit"]'
+ ) as HTMLButtonElement
+ const deleteBtn = menu.querySelector(
+ '[data-action="delete"]'
+ ) as HTMLButtonElement
- deleteBtn.onclick = () => {
- if (infusion.uid) {
- deleteRow(infusion.uid)
+ editBtn.onclick = () => {
+ setSelectedInfusion(infusion)
+ setInfusionModal(true)
+ document.body.removeChild(menu)
}
- document.body.removeChild(menu)
- }
- // Close on outside click
- const closeMenu = (e: MouseEvent) => {
- if (!menu.contains(e.target as Node)) {
+ deleteBtn.onclick = () => {
+ if (infusion.uid) {
+ deleteRow(infusion.uid)
+ }
document.body.removeChild(menu)
- document.removeEventListener('click', closeMenu)
}
- }
- document.body.appendChild(menu)
- setTimeout(
- () => document.addEventListener('click', closeMenu),
- 0
- )
- }}
- >
-
-
-
- )
- },
- })
- }
+ // Close on outside click
+ const closeMenu = (e: MouseEvent) => {
+ if (!menu.contains(e.target as Node)) {
+ document.body.removeChild(menu)
+ document.removeEventListener('click', closeMenu)
+ }
+ }
+
+ document.body.appendChild(menu)
+ setTimeout(
+ () => document.addEventListener('click', closeMenu),
+ 0
+ )
+ }}
+ >
+
+
+
+ )
+ },
+ })
+ }
+
+ return baseColumns
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isLoggedInUser, user?.uid])
// Create the table instance - must be called before any early returns
const table = useReactTable({
@@ -209,7 +209,21 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
},
})
- if (status === FirestoreStatusType.LOADING) {
+ // Handle case where uid is not available
+ if (!uid && !user?.uid) {
+ return (
+
+
+ No treatment data available
+
+
+ User information is not available to load treatments.
+
+
+ )
+ }
+
+ if (isLoading) {
return (
@@ -228,7 +242,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
)
}
- if (error) {
+ if (isError || error) {
console.error('Error fetching infusions:', error)
return (
@@ -240,14 +254,18 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
)
}
- if (status === FirestoreStatusType.ERROR && !error) {
+ // Show empty state if query completed successfully but no treatments found
+ if (!infusions || infusions.length === 0) {
+ const emptyMessage = isLoggedInUser
+ ? "You haven't logged any treatments yet. Add one by clicking 'New Treatment' above."
+ : 'This person has not logged any treatments yet.'
+
return (
-
-
Error
-
- Something went wrong accessing your treatment data. Refresh the page
- to try again.
+
+
+ No treatment data available
+
{emptyMessage}
)
}
@@ -294,7 +312,9 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
No treatments found
- Add one by clicking 'New Treatment' above.
+ {isLoggedInUser
+ ? "Add one by clicking 'New Treatment' above."
+ : 'This person has not logged any treatments yet.'}
diff --git a/components/profilePage.tsx b/src/components/home/profilePage.tsx
similarity index 83%
rename from components/profilePage.tsx
rename to src/components/home/profilePage.tsx
index 8fa5745..29354e2 100644
--- a/components/profilePage.tsx
+++ b/src/components/home/profilePage.tsx
@@ -1,23 +1,28 @@
+'use client'
+
import { useEffect, useCallback, useState } from 'react'
-import { useRouter } from 'next/router'
-
-import EmergencyCard from 'components/emergencyCard'
-import EmergencySnippet from 'components/emergencySnippet'
-import SettingsForm from 'components/settingsForm'
-import { useAuth } from 'lib/auth'
-import { updateUser } from 'lib/db/users'
-import { generateUniqueString, track } from 'lib/helpers'
+import { useRouter } from 'next/navigation'
+
+import EmergencyCard from '@/components/home/emergencyCard'
+import EmergencySnippet from '@/components/shared/emergencySnippet'
+import SettingsForm from '@/components/home/settingsForm'
+import { useAuth } from '@/lib/auth'
+import { useUserMutations } from '@/lib/hooks/useUserMutations'
+import { generateUniqueString, track } from '@/lib/helpers'
import toast from 'react-hot-toast'
-import useDbUser from 'lib/hooks/useDbUser'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
const ProfilePage = (): JSX.Element => {
const { user, signout } = useAuth()
- const { person } = useDbUser(user?.uid || '')
+ const { person } = useUserQuery(user?.uid)
+ const { updateUser } = useUserMutations()
const router = useRouter()
const [deleteModalVisible, setDeleteModalVisible] = useState(false)
const [isDeletingAccount, setIsDeletingAccount] = useState(false)
- track('Viewed Profile Page')
+ useEffect(() => {
+ track('Viewed Profile Page', {})
+ }, [])
const handleOnPrintClick = () => {
track('Clicked Print Button', { page: '/profile' })
@@ -25,20 +30,18 @@ const ProfilePage = (): JSX.Element => {
}
const handleUpdateUserApiKey = useCallback(async () => {
+ if (!user?.uid) return
const newApiKey = await generateUniqueString(20)
- updateUser(user?.uid || '', { apiKey: newApiKey })
- .then(() => {
- toast.success('API key updated!')
- })
- .catch((error) => toast.error(`Something went wrong: ${error}`))
- }, [user])
+ updateUser({ uid: user.uid, userData: { apiKey: newApiKey } })
+ }, [user?.uid, updateUser])
- // biome-ignore lint/correctness/useExhaustiveDependencies: user is needed here
+ // Only create API key once when person is loaded and doesn't have one
useEffect(() => {
- if (person && !person.apiKey) {
+ if (person && !person.apiKey && user?.uid) {
handleUpdateUserApiKey()
}
- }, [user, person, handleUpdateUserApiKey])
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [person?.apiKey, user?.uid]) // Only depend on apiKey, not the whole person object
const handleDeleteAccount = async () => {
if (!user?.token) {
@@ -48,7 +51,7 @@ const ProfilePage = (): JSX.Element => {
try {
setIsDeletingAccount(true)
- track('Confirmed Delete Account')
+ track('Confirmed Delete Account', {})
const response = await fetch('/api/delete-account', {
method: 'DELETE',
headers: {
@@ -136,7 +139,7 @@ const ProfilePage = (): JSX.Element => {
{
- track('Opened Delete Account Modal')
+ track('Opened Delete Account Modal', {})
setDeleteModalVisible(true)
}}
className='px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-lg font-medium transition-colors w-fit'
diff --git a/components/settingsForm.tsx b/src/components/home/settingsForm.tsx
similarity index 89%
rename from components/settingsForm.tsx
rename to src/components/home/settingsForm.tsx
index cba8cee..7ef6c60 100644
--- a/components/settingsForm.tsx
+++ b/src/components/home/settingsForm.tsx
@@ -1,24 +1,24 @@
import { useState } from 'react'
import { useFormik } from 'formik'
-import { useAuth } from 'lib/auth'
-import useDbUser from 'lib/hooks/useDbUser'
-import { updateUser } from 'lib/db/users'
-import { track } from 'lib/helpers'
-import toast from 'react-hot-toast'
+import { useAuth } from '@/lib/auth'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
+import { useUserMutations } from '@/lib/hooks/useUserMutations'
+import { track } from '@/lib/helpers'
const SettingsForm = (): JSX.Element => {
const { user } = useAuth()
- const { person } = useDbUser(user?.uid || '')
+ const { person } = useUserQuery(user?.uid)
+ const { updateUser } = useUserMutations()
const formik = useFormik({
initialValues: {
- hemophiliaType: person ? person.hemophiliaType : '',
- severity: person ? person.severity : '',
- factor: person ? person.factor : '',
- medication: person ? person.medication : '',
- monoclonalAntibody: person ? person.monoclonalAntibody : '',
- injectionFrequency: person ? person.injectionFrequency : '',
+ hemophiliaType: person?.hemophiliaType ?? '',
+ severity: person?.severity ?? '',
+ factor: person?.factor ? person.factor.toString() : '',
+ medication: person?.medication ?? '',
+ monoclonalAntibody: person?.monoclonalAntibody ?? '',
+ injectionFrequency: person?.injectionFrequency ?? '',
// emergencyContacts: [
// {
// name: '',
@@ -28,14 +28,9 @@ const SettingsForm = (): JSX.Element => {
},
enableReinitialize: true,
onSubmit: (values) => {
- updateUser(user?.uid || '', values)
- .then(() => {
- toast.success('Profile updated!')
- })
- .catch((error) => {
- console.error(error)
- toast.error(`Something went wrong: ${error}`)
- })
+ if (user?.uid) {
+ updateUser({ uid: user.uid, userData: values })
+ }
},
})
@@ -129,7 +124,7 @@ const SettingsForm = (): JSX.Element => {
id='hemophiliaType'
name='hemophiliaType'
className='w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent'
- value={formik.values.hemophiliaType}
+ value={formik.values.hemophiliaType ?? ''}
onChange={(e) =>
formik.setFieldValue('hemophiliaType', e.target.value)
}
@@ -154,7 +149,7 @@ const SettingsForm = (): JSX.Element => {
id='severity'
name='severity'
className='w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent'
- value={formik.values.severity}
+ value={formik.values.severity ?? ''}
onChange={(e) => formik.setFieldValue('severity', e.target.value)}
>
Select severity
@@ -177,7 +172,7 @@ const SettingsForm = (): JSX.Element => {
className='w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent'
placeholder='8'
onChange={formik.handleChange}
- value={formik.values.factor ? formik.values.factor.toString() : ''}
+ value={formik.values.factor ?? ''}
/>
@@ -194,7 +189,7 @@ const SettingsForm = (): JSX.Element => {
type='text'
className='w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent'
placeholder='Advate'
- value={formik.values.medication}
+ value={formik.values.medication ?? ''}
onChange={(e) => {
formik.setFieldValue('medication', e.target.value)
searchHandler(
@@ -225,7 +220,7 @@ const SettingsForm = (): JSX.Element => {
type='text'
className='w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent'
placeholder='Hemlibra'
- value={formik.values.monoclonalAntibody}
+ value={formik.values.monoclonalAntibody ?? ''}
onChange={(e) =>
formik.setFieldValue('monoclonalAntibody', e.target.value)
}
@@ -249,7 +244,7 @@ const SettingsForm = (): JSX.Element => {
id='injectionFrequency'
name='injectionFrequency'
className='w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent'
- value={formik.values.injectionFrequency}
+ value={formik.values.injectionFrequency ?? ''}
onChange={(e) =>
formik.setFieldValue('injectionFrequency', e.target.value)
}
diff --git a/components/statCard.tsx b/src/components/home/statCard.tsx
similarity index 96%
rename from components/statCard.tsx
rename to src/components/home/statCard.tsx
index b2fd5c4..23e4892 100644
--- a/components/statCard.tsx
+++ b/src/components/home/statCard.tsx
@@ -1,6 +1,6 @@
interface Props {
value: string | number
- label: string | React.Component
+ label: React.ReactNode
loading?: boolean
type?: 'default' | 'success' | 'warning' | 'error'
shadow?: boolean
diff --git a/components/stats.tsx b/src/components/home/stats.tsx
similarity index 87%
rename from components/stats.tsx
rename to src/components/home/stats.tsx
index 4ce196a..445a3ff 100644
--- a/components/stats.tsx
+++ b/src/components/home/stats.tsx
@@ -1,12 +1,11 @@
import _ from 'underscore'
import { useState } from 'react'
-import StatCard from 'components/statCard'
-import useInfusions from 'lib/hooks/useInfusions'
-import { FirestoreStatusType } from 'lib/hooks/useFirestoreQuery'
-import { TreatmentTypeEnum } from 'lib/db/infusions'
-import FeedbackModal from 'components/feedbackModal'
-import { filterInfusions } from 'lib/helpers'
+import StatCard from '@/components/home/statCard'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { TreatmentTypeEnum } from '@/lib/db/infusions'
+import FeedbackModal from '@/components/home/feedbackModal'
+import { filterInfusions } from '@/lib/helpers'
// TODO(michael) move types to types file
type Value = string[]
@@ -33,7 +32,7 @@ interface StatsProps {
export default function Stats(props: StatsProps): JSX.Element {
const { filterYear } = props
- const { data, status, error } = useInfusions()
+ const { data, isLoading, isError, error } = useInfusionsQuery()
const filteredInfusions = filterInfusions(data, filterYear)
@@ -42,7 +41,7 @@ export default function Stats(props: StatsProps): JSX.Element {
// the modal across multiple components my lifting it up into context.
const [feedbackModal, setFeedbackModal] = useState(false)
- if (status === FirestoreStatusType.LOADING) {
+ if (isLoading) {
return (
@@ -57,7 +56,7 @@ export default function Stats(props: StatsProps): JSX.Element {
)
}
- if (error) {
+ if (isError || error) {
return (
Error
@@ -68,18 +67,6 @@ export default function Stats(props: StatsProps): JSX.Element {
)
}
- if (status === FirestoreStatusType.ERROR && !error) {
- return (
-
-
Error
-
- Something went wrong accessing your treatment data. Refresh the page
- to try again.
-
-
- )
- }
-
// TODO(michael) there has to be a better way to understand this data without
// iterating through it so many times. Iterating through it once would be a lot better
// but doing it on the server would be even better.
diff --git a/components/descriptionCards.tsx b/src/components/landing/descriptionCards.tsx
similarity index 100%
rename from components/descriptionCards.tsx
rename to src/components/landing/descriptionCards.tsx
diff --git a/components/emergencySnippet.tsx b/src/components/shared/emergencySnippet.tsx
similarity index 100%
rename from components/emergencySnippet.tsx
rename to src/components/shared/emergencySnippet.tsx
diff --git a/components/footer.tsx b/src/components/shared/footer.tsx
similarity index 94%
rename from components/footer.tsx
rename to src/components/shared/footer.tsx
index 07324c2..4d18a45 100644
--- a/components/footer.tsx
+++ b/src/components/shared/footer.tsx
@@ -1,7 +1,9 @@
+'use client'
+
// All Geist UI components have been migrated to Tailwind
-import EmergencySnippet from 'components/emergencySnippet'
-import { useAuth } from 'lib/auth'
+import EmergencySnippet from '@/components/shared/emergencySnippet'
+import { useAuth } from '@/lib/auth'
export default function Footer(): JSX.Element {
const { user, loading } = useAuth()
diff --git a/components/loadingScreen.tsx b/src/components/shared/loadingScreen.tsx
similarity index 100%
rename from components/loadingScreen.tsx
rename to src/components/shared/loadingScreen.tsx
diff --git a/src/components/shared/logo.tsx b/src/components/shared/logo.tsx
new file mode 100644
index 0000000..5971623
--- /dev/null
+++ b/src/components/shared/logo.tsx
@@ -0,0 +1,19 @@
+import Image from 'next/image'
+import Link from 'next/link'
+
+export default function Logo() {
+ return (
+
+
+
+ )
+}
diff --git a/components/staticHeader.tsx b/src/components/shared/staticHeader.tsx
similarity index 87%
rename from components/staticHeader.tsx
rename to src/components/shared/staticHeader.tsx
index 28a7656..3e785bc 100644
--- a/components/staticHeader.tsx
+++ b/src/components/shared/staticHeader.tsx
@@ -1,11 +1,12 @@
-import { useRouter } from 'next/router'
+'use client'
-import { useAuth } from 'lib/auth'
-import Logo from 'components/logo'
+import { useRouter } from 'next/navigation'
+
+import { useAuth } from '@/lib/auth'
+import Logo from '@/components/shared/logo'
const StaticHeader = (): JSX.Element => {
const { user, loading } = useAuth()
-
const router = useRouter()
return (
diff --git a/src/components/shared/withAuth.tsx b/src/components/shared/withAuth.tsx
new file mode 100644
index 0000000..a953928
--- /dev/null
+++ b/src/components/shared/withAuth.tsx
@@ -0,0 +1,22 @@
+'use client'
+
+import type { ComponentType } from 'react'
+
+// HOC that marks a page as needing auth
+// Note: AuthProvider is now provided at the root layout level via Providers
+// This HOC is kept for backward compatibility and can be used for additional auth logic
+export function withAuth
(
+ WrappedComponent: ComponentType
+): ComponentType
{
+ const WithAuthComponent = (props: P) => {
+ // Simply render the wrapped component - AuthProvider is already at root level
+ return
+ }
+
+ // Copy display name for debugging
+ const displayName =
+ WrappedComponent.displayName || WrappedComponent.name || 'Component'
+ WithAuthComponent.displayName = `withAuth(${displayName})`
+
+ return WithAuthComponent
+}
diff --git a/global.d.ts b/src/global.d.ts
similarity index 100%
rename from global.d.ts
rename to src/global.d.ts
diff --git a/lib/admin-db/feedback.ts b/src/lib/admin-db/feedback.ts
similarity index 91%
rename from lib/admin-db/feedback.ts
rename to src/lib/admin-db/feedback.ts
index 8387d16..7e21e5a 100644
--- a/lib/admin-db/feedback.ts
+++ b/src/lib/admin-db/feedback.ts
@@ -1,6 +1,6 @@
-import { adminFirestore } from 'lib/firebase-admin'
+import { adminFirestore } from '@/lib/firebase-admin'
import { compareAsc, compareDesc, parseISO } from 'date-fns'
-import type { FeedbackType } from 'lib/db/feedback'
+import type { FeedbackType } from '@/lib/db/feedback'
async function getAllFeedback() {
try {
diff --git a/lib/admin-db/infusions.ts b/src/lib/admin-db/infusions.ts
similarity index 98%
rename from lib/admin-db/infusions.ts
rename to src/lib/admin-db/infusions.ts
index aeff44b..26e6446 100644
--- a/lib/admin-db/infusions.ts
+++ b/src/lib/admin-db/infusions.ts
@@ -1,8 +1,8 @@
-import { adminFirestore } from 'lib/firebase-admin'
+import { adminFirestore } from '@/lib/firebase-admin'
import { compareDesc, parseISO } from 'date-fns'
import { TreatmentTypeEnum, type TreatmentType } from '../db/infusions'
-import type { AttachedUserType } from 'lib/types/users'
+import type { AttachedUserType } from '@/lib/types/users'
async function getAllInfusions() {
const snapshot = await adminFirestore.collection('infusions').get()
diff --git a/lib/admin-db/users.ts b/src/lib/admin-db/users.ts
similarity index 96%
rename from lib/admin-db/users.ts
rename to src/lib/admin-db/users.ts
index 8e4e07e..3bd7827 100644
--- a/lib/admin-db/users.ts
+++ b/src/lib/admin-db/users.ts
@@ -1,4 +1,4 @@
-import { auth, adminFirestore } from 'lib/firebase-admin'
+import { auth, adminFirestore } from '@/lib/firebase-admin'
const BATCH_LIMIT = 400
diff --git a/src/lib/auth.tsx b/src/lib/auth.tsx
new file mode 100644
index 0000000..9b7d649
--- /dev/null
+++ b/src/lib/auth.tsx
@@ -0,0 +1,439 @@
+'use client'
+
+import {
+ useState,
+ useEffect,
+ useContext,
+ createContext,
+ useCallback,
+} from 'react'
+import cookie from 'js-cookie'
+import {
+ signInWithPopup,
+ signInWithEmailAndPassword,
+ createUserWithEmailAndPassword,
+ signOut as firebaseSignOut,
+ onIdTokenChanged,
+ GoogleAuthProvider,
+ type User,
+} from 'firebase/auth'
+
+import { getAuth } from '@/lib/firebase'
+import { createUser, fetchUserByUid } from '@/lib/db/users'
+import { generateUniqueString } from '@/lib/helpers'
+import LoadingScreen from '@/components/shared/loadingScreen'
+import type { UserType } from '@/lib/types/users'
+import { useRouter, usePathname } from 'next/navigation'
+
+type ContextProps = {
+ user: UserType | null
+ loading?: boolean
+ signout: () => Promise
+ signinWithGoogle: (redirect: string) => Promise
+ signinWithTestUser: () => Promise
+}
+
+const authContext = createContext>({
+ user: null,
+ loading: true, // Start with true to wait for auth state
+})
+
+export function AuthProvider({
+ children,
+}: {
+ children: React.ReactNode
+}): React.ReactElement {
+ const auth = useProvideAuth()
+ // Always provide the context with consistent initial values
+ // This ensures server and client render the same initial state
+ return {children}
+}
+
+export const useAuth = () => useContext(authContext)
+
+let globalUser: UserType | null = null
+let globalLoading = true // Start with true to wait for auth state to be determined
+let authListenerInitialized = false
+
+function useProvideAuth() {
+ const [user, setUser] = useState(globalUser)
+ const [loading, setLoading] = useState(globalLoading)
+ const [pendingRedirect, setPendingRedirect] = useState(null)
+ const router = useRouter()
+
+ // Handle pending redirects after user state is set
+ useEffect(() => {
+ if (pendingRedirect && user && !loading) {
+ router.push(pendingRedirect)
+ setPendingRedirect(null)
+ }
+ }, [user, loading, pendingRedirect, router])
+
+ const handleUser = useCallback(async (rawUser: User | null) => {
+ if (rawUser) {
+ let formattedUser: UserType
+ try {
+ formattedUser = await formatUser(rawUser)
+ } catch (error) {
+ console.error('Error formatting user:', error)
+ // If formatting fails, still set loading to false to unblock UI
+ globalLoading = false
+ setLoading(false)
+ return false
+ }
+
+ try {
+ // Fetch user data from Firestore using Firestore Lite with timeout
+ const dbUser = await withTimeout(fetchUserByUid(formattedUser.uid), 5000)
+
+ const { ...userWithoutToken } = formattedUser
+
+ if (dbUser) {
+ formattedUser.alertId = dbUser.alertId
+ formattedUser.isAdmin = (dbUser as unknown as UserType).isAdmin
+ formattedUser.apiKey = dbUser.apiKey
+ formattedUser.medication = dbUser.medication || ''
+ formattedUser.monoclonalAntibody = dbUser.monoclonalAntibody || ''
+ delete userWithoutToken.alertId
+ // Only update if document exists but might be missing fields
+ // Don't update on every auth token change to prevent loops
+ } else {
+ // Only create user document if it doesn't exist
+ await createUser(formattedUser.uid, userWithoutToken)
+ }
+ } catch (error) {
+ // Handle offline/connection/timeout errors gracefully
+ // These errors are expected when emulator isn't running, connection is temporarily unavailable,
+ // or operations take too long on page refresh
+ const errorMessage =
+ error instanceof Error ? error.message : String(error)
+ const isExpectedError =
+ errorMessage.includes('offline') ||
+ errorMessage.includes('unavailable') ||
+ errorMessage.includes('Failed to get document') ||
+ errorMessage.includes('Could not reach Cloud Firestore backend') ||
+ errorMessage.includes('Firestore not available') ||
+ errorMessage.includes('timed out')
+
+ if (isExpectedError) {
+ // Don't log these errors - they're expected in development when emulator isn't running
+ // or when connection is temporarily unavailable
+ console.warn('Firestore operation skipped:', errorMessage)
+ } else {
+ // Only log unexpected errors
+ console.error('Error handling user Firestore operations:', error)
+ }
+ // Continue even if Firestore operations fail - user can still sign in
+ // The user document will be created on next sign-in attempt or when connection is restored
+ }
+
+ globalUser = formattedUser
+ globalLoading = false
+ setUser(formattedUser)
+ setLoading(false)
+
+ cookie.set('hemolog-auth', {
+ expires: 1,
+ })
+
+ return formattedUser
+ } else {
+ globalUser = null
+ globalLoading = false
+ setUser(null)
+ setLoading(false)
+
+ cookie.remove('hemolog-auth')
+
+ return false
+ }
+ }, [])
+
+ const signinWithGoogle = async (redirect: string) => {
+ if (process.env.NEXT_PUBLIC_USE_EMULATORS) {
+ console.warn(
+ 'Google sign-in is disabled when NEXT_PUBLIC_USE_EMULATORS is enabled. Use the Test User button instead.'
+ )
+ setLoading(false)
+ return
+ }
+
+ setLoading(true)
+ const auth = getAuth()
+
+ if (!auth) {
+ console.error('Firebase auth not available for Google sign-in')
+ setLoading(false)
+ return
+ }
+
+ try {
+ const provider = new GoogleAuthProvider()
+ const result = await signInWithPopup(auth, provider)
+ await handleUser(result.user)
+
+ if (redirect) {
+ router.push(redirect)
+ }
+ } catch (error) {
+ console.error('Google sign-in error:', error)
+ setLoading(false)
+ }
+ }
+
+ const signinWithTestUser = async () => {
+ setLoading(true)
+
+ if (typeof window === 'undefined') {
+ console.error('Error: Cannot sign in on server-side')
+ setLoading(false)
+ return
+ }
+
+ const auth = getAuth()
+
+ if (!auth) {
+ console.error(
+ 'Error: Firebase auth not available. Make sure Firebase is initialized and emulator is running.'
+ )
+ setLoading(false)
+ return
+ }
+
+ const testEmail = 'michael+test@hemolog.com'
+ const testPassword = 'test123'
+
+ try {
+ const signInResponse = await signInWithEmailAndPassword(
+ auth,
+ testEmail,
+ testPassword
+ )
+ if (signInResponse.user) {
+ await handleUser(signInResponse.user)
+ // Set pending redirect - will navigate after state is updated
+ setPendingRedirect('/home')
+ return
+ }
+ } catch (signInError: unknown) {
+ const error =
+ signInError && typeof signInError === 'object' && 'code' in signInError
+ ? (signInError as { code?: string })
+ : null
+
+ const isUserNotFound =
+ error?.code === 'auth/user-not-found' ||
+ error?.code === 'auth/invalid-credential'
+
+ if (!isUserNotFound) {
+ console.error('Sign in error:', signInError)
+ setLoading(false)
+ return
+ }
+
+ try {
+ const createResponse = await createUserWithEmailAndPassword(
+ auth,
+ testEmail,
+ testPassword
+ )
+ if (createResponse.user) {
+ await handleUser(createResponse.user)
+ // Set pending redirect - will navigate after state is updated
+ setPendingRedirect('/home')
+ return
+ }
+ } catch (createError: unknown) {
+ const createErr =
+ createError &&
+ typeof createError === 'object' &&
+ 'code' in createError
+ ? (createError as { code?: string })
+ : null
+
+ if (createErr?.code === 'auth/email-already-in-use') {
+ try {
+ const retrySignIn = await signInWithEmailAndPassword(
+ auth,
+ testEmail,
+ testPassword
+ )
+ if (retrySignIn.user) {
+ await handleUser(retrySignIn.user)
+ // Set pending redirect - will navigate after state is updated
+ setPendingRedirect('/home')
+ return
+ }
+ } catch (retryError) {
+ console.error('Retry sign in error:', retryError)
+ }
+ } else {
+ console.error('Create user error:', createError)
+ }
+ setLoading(false)
+ }
+ }
+ }
+
+ const signout = async () => {
+ router.push('/signin')
+ const auth = getAuth()
+ if (!auth) {
+ await handleUser(null)
+ return
+ }
+ await firebaseSignOut(auth)
+ await handleUser(null)
+ }
+
+ useEffect(() => {
+ if (typeof window === 'undefined') {
+ // On server, keep loading true (will be set to false on client)
+ return
+ }
+
+ const auth = getAuth()
+
+ if (!auth) {
+ globalLoading = false
+ setLoading(false)
+ return
+ }
+
+ if (globalUser && !user) {
+ setUser(globalUser)
+ setLoading(false)
+ return
+ }
+
+ if (authListenerInitialized) {
+ // Sync state with global state if it changed
+ if (user !== globalUser) {
+ setUser(globalUser)
+ setLoading(globalLoading)
+ }
+ return
+ }
+
+ // Initialize auth listener - it will call handleUser when auth state is determined
+ // This restores the user from Firebase Auth persistence on page refresh
+ // The listener fires immediately with the current user (if any) and then on changes
+ authListenerInitialized = true
+ const unsubscribe = onIdTokenChanged(auth, (firebaseUser) => {
+ // This will be called immediately with current user (or null) and then on changes
+ // Wrap in async IIFE to properly handle errors and prevent unhandled rejections
+ ;(async () => {
+ try {
+ await handleUser(firebaseUser)
+ } catch (error) {
+ console.error('Error in auth state handler:', error)
+ // Ensure loading state is set to false even if handleUser fails
+ globalLoading = false
+ setLoading(false)
+ }
+ })()
+ })
+
+ return () => {
+ unsubscribe()
+ authListenerInitialized = false
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [handleUser]) // Only depend on handleUser, not user, to prevent re-initialization
+
+ return {
+ user,
+ loading,
+ signinWithGoogle,
+ signinWithTestUser,
+ signout,
+ }
+}
+
+// Helper to add timeout to a promise
+function withTimeout(promise: Promise, timeoutMs: number): Promise {
+ return Promise.race([
+ promise,
+ new Promise((_, reject) =>
+ setTimeout(
+ () => reject(new Error(`Operation timed out after ${timeoutMs}ms`)),
+ timeoutMs
+ )
+ ),
+ ])
+}
+
+const formatUser = async (rawUser: User): Promise => {
+ let token = ''
+ try {
+ // Add 5 second timeout to token retrieval to prevent hanging on page refresh
+ const idTokenResult = await withTimeout(rawUser.getIdTokenResult(), 5000)
+ token = idTokenResult.token
+ } catch (error) {
+ // Token retrieval failed or timed out, continue without token
+ console.warn('Token retrieval failed:', error instanceof Error ? error.message : 'Unknown error')
+ }
+
+ const alertId = await generateUniqueString(6)
+
+ return {
+ alertId,
+ email: rawUser.email || '',
+ name: rawUser.displayName || '',
+ photoUrl: rawUser.photoURL || undefined,
+ provider: rawUser.providerData?.[0]?.providerId || 'password',
+ token: token || '',
+ uid: rawUser.uid,
+ }
+}
+
+export function ProtectRoute({
+ children,
+}: {
+ children: React.ReactNode
+}): React.ReactElement | null {
+ const { user, loading } = useAuth()
+ const pathname = usePathname()
+ const router = useRouter()
+ const [isRedirecting, setIsRedirecting] = useState(false)
+
+ // Handle redirect in useEffect to avoid updating Router during render
+ useEffect(() => {
+ // Don't redirect if we're already redirecting or if we're on an allowed page
+ if (
+ isRedirecting ||
+ pathname === '/signin' ||
+ pathname.includes('emergency')
+ ) {
+ return
+ }
+
+ if (!loading && !user) {
+ setIsRedirecting(true)
+ router.replace('/signin')
+ }
+ }, [loading, user, pathname, router, isRedirecting])
+
+ // Reset redirecting flag when user becomes available
+ useEffect(() => {
+ if (user) {
+ setIsRedirecting(false)
+ }
+ }, [user])
+
+ if (loading && !user) {
+ return
+ }
+
+ if (!user) {
+ // Allow access to signin and emergency pages
+ if (pathname === '/signin' || pathname.includes('emergency')) {
+ return <>{children}>
+ }
+
+ // Show loading screen while redirecting
+ return
+ }
+
+ return <>{children}>
+}
diff --git a/lib/contexts/ThemeContext.tsx b/src/lib/contexts/ThemeContext.tsx
similarity index 100%
rename from lib/contexts/ThemeContext.tsx
rename to src/lib/contexts/ThemeContext.tsx
diff --git a/src/lib/db/feedback.ts b/src/lib/db/feedback.ts
new file mode 100644
index 0000000..da79989
--- /dev/null
+++ b/src/lib/db/feedback.ts
@@ -0,0 +1,32 @@
+import {
+ createDocument,
+ deleteDocument,
+ updateDocument,
+} from '@/lib/firestore-lite'
+import type { AttachedUserType } from '@/lib/types/users'
+
+export interface FeedbackType {
+ uid?: string
+ createdAt: string
+ message: string
+ user: AttachedUserType
+}
+
+// Create a new feedback document
+export async function createFeedback(data: FeedbackType): Promise {
+ const docId = await createDocument('feedback', data)
+ return docId
+}
+
+// Delete a feedback document (hard delete)
+export async function deleteFeedback(uid: string): Promise {
+ await deleteDocument('feedback', uid)
+}
+
+// Update a feedback document
+export async function updateFeedback(
+ uid: string,
+ newValues: Partial
+): Promise {
+ await updateDocument('feedback', uid, newValues)
+}
diff --git a/src/lib/db/infusions.ts b/src/lib/db/infusions.ts
new file mode 100644
index 0000000..444b0d6
--- /dev/null
+++ b/src/lib/db/infusions.ts
@@ -0,0 +1,71 @@
+import {
+ createDocument,
+ updateDocument,
+ softDeleteDocument,
+ getDocuments,
+ where,
+} from '@/lib/firestore-lite'
+import type { AttachedUserType } from '@/lib/types/users'
+
+export enum TreatmentTypeEnum {
+ PROPHY = 'PROPHY',
+ BLEED = 'BLEED',
+ PREVENTATIVE = 'PREVENTATIVE',
+ ANTIBODY = 'ANTIBODY',
+}
+
+export type TreatmentTypeOptions =
+ | TreatmentTypeEnum.PROPHY
+ | TreatmentTypeEnum.BLEED
+ | TreatmentTypeEnum.PREVENTATIVE
+ | TreatmentTypeEnum.ANTIBODY
+
+export interface Medication {
+ brand: string
+ costPerUnit?: number
+ lot?: string
+ units: number
+}
+
+export interface TreatmentType {
+ deletedAt: string | null
+ uid?: string
+ cause: string
+ createdAt: string
+ date: string
+ medication: Medication
+ sites: string
+ type: TreatmentTypeOptions
+ user: AttachedUserType
+}
+
+// Create a new infusion document
+export async function createInfusion(data: TreatmentType): Promise {
+ const docId = await createDocument('infusions', data)
+ return docId
+}
+
+// Soft delete an infusion (sets deletedAt timestamp)
+export async function deleteInfusion(uid: string): Promise {
+ await softDeleteDocument('infusions', uid)
+}
+
+// Update an infusion document
+export async function updateInfusion(
+ uid: string,
+ newValues: Partial
+): Promise {
+ await updateDocument('infusions', uid, newValues)
+}
+
+// Fetch infusions for a user (used by TanStack Query)
+export async function fetchInfusions(
+ userUid: string
+): Promise {
+ const infusions = await getDocuments(
+ 'infusions',
+ where('user.uid', '==', userUid),
+ where('deletedAt', '==', null)
+ )
+ return infusions
+}
diff --git a/src/lib/db/users.ts b/src/lib/db/users.ts
new file mode 100644
index 0000000..8841e7d
--- /dev/null
+++ b/src/lib/db/users.ts
@@ -0,0 +1,71 @@
+import {
+ setDocument,
+ getDocument,
+ getDocuments,
+ where,
+ limit,
+} from '@/lib/firestore-lite'
+import type { UserType } from '../types/users'
+import type { Person } from '../types/person'
+
+// Helper to add timeout to a promise
+function withTimeout(promise: Promise, timeoutMs: number): Promise {
+ return Promise.race([
+ promise,
+ new Promise((_, reject) =>
+ setTimeout(
+ () => reject(new Error(`Operation timed out after ${timeoutMs}ms`)),
+ timeoutMs
+ )
+ ),
+ ])
+}
+
+// Create or update a user document
+export async function createUser(
+ uid: string,
+ userData: Partial
+): Promise {
+ // Remove token from userData as it shouldn't be stored in Firestore
+ // biome-ignore lint/correctness/noUnusedVariables: token is intentionally extracted and discarded
+ const { token, ...dataWithoutToken } = userData
+
+ try {
+ // Create or update user document with 10 second timeout
+ await withTimeout(
+ setDocument('users', uid, { uid, ...dataWithoutToken }),
+ 10000 // 10 second timeout
+ )
+
+ console.log('User document created/updated:', uid)
+ } catch (error) {
+ console.error('Error creating/updating user document:', error)
+ throw error
+ }
+}
+
+// Update a user document
+export async function updateUser(
+ uid: string,
+ userData: Partial
+): Promise {
+ await setDocument('users', uid, userData, true)
+}
+
+// Fetch a user by UID (used by TanStack Query)
+export async function fetchUserByUid(uid: string): Promise {
+ const user = await getDocument('users', uid)
+ return user
+}
+
+// Fetch a user by alertId (used for emergency access)
+export async function fetchUserByAlertId(
+ alertId: string
+): Promise {
+ const users = await getDocuments(
+ 'users',
+ where('alertId', '==', alertId),
+ limit(1)
+ )
+ return users.length > 0 ? users[0] : null
+}
diff --git a/lib/firebase-admin.ts b/src/lib/firebase-admin.ts
similarity index 100%
rename from lib/firebase-admin.ts
rename to src/lib/firebase-admin.ts
diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts
new file mode 100644
index 0000000..db4ae85
--- /dev/null
+++ b/src/lib/firebase.ts
@@ -0,0 +1,78 @@
+// firebase.ts
+// Initializes firebase across app for authentication only
+// Firestore operations are now handled by firestore-lite.ts
+
+import { initializeApp, getApps, type FirebaseApp } from 'firebase/app'
+import {
+ getAuth as getFirebaseAuth,
+ connectAuthEmulator,
+ type Auth,
+} from 'firebase/auth'
+
+const firebaseConfig = {
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY || 'development',
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || 'localhost',
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || 'hemolog',
+}
+
+let firebaseApp: FirebaseApp | null = null
+let authInstance: Auth | null = null
+let authEmulatorConnected = false
+
+function getApp(): FirebaseApp | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ if (!firebaseApp) {
+ const apps = getApps()
+ if (apps.length === 0) {
+ firebaseApp = initializeApp(firebaseConfig)
+ } else {
+ firebaseApp = apps[0]
+ }
+ }
+
+ return firebaseApp
+}
+
+export function getAuth(): Auth | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ const app = getApp()
+ if (!app) {
+ return null
+ }
+
+ if (!authInstance) {
+ authInstance = getFirebaseAuth(app)
+
+ // Connect to emulator if developing locally
+ const useEmulators =
+ process.env.NEXT_PUBLIC_USE_EMULATORS === 'true' ||
+ process.env.NEXT_PUBLIC_USE_EMULATORS === '1'
+
+ if (useEmulators && !authEmulatorConnected) {
+ try {
+ connectAuthEmulator(authInstance, 'http://localhost:9099', {
+ disableWarnings: true,
+ })
+ authEmulatorConnected = true
+ } catch (error) {
+ // If emulator is already connected, Firebase throws an error
+ // We can safely ignore it, but log other errors for debugging
+ if (
+ error instanceof Error &&
+ !error.message.includes('already been called')
+ ) {
+ console.warn('Auth emulator connection warning:', error.message)
+ }
+ authEmulatorConnected = true // Mark as connected even if error occurred
+ }
+ }
+ }
+
+ return authInstance
+}
diff --git a/src/lib/firestore-lite.ts b/src/lib/firestore-lite.ts
new file mode 100644
index 0000000..fc49bb0
--- /dev/null
+++ b/src/lib/firestore-lite.ts
@@ -0,0 +1,228 @@
+// firestore-lite.ts
+// Lightweight Firestore client using REST API via firebase/firestore/lite
+// This replaces the full Firestore SDK to reduce bundle size and eliminate WebSocket issues
+
+import { initializeApp, getApps, type FirebaseApp } from 'firebase/app'
+import {
+ getFirestore,
+ connectFirestoreEmulator,
+ collection,
+ doc,
+ getDoc,
+ getDocs,
+ setDoc,
+ updateDoc,
+ deleteDoc,
+ addDoc,
+ query,
+ where,
+ limit,
+ orderBy,
+ type Firestore,
+ type QueryConstraint,
+ type DocumentData,
+ type WithFieldValue,
+} from 'firebase/firestore/lite'
+
+const firebaseConfig = {
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY || 'development',
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || 'localhost',
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || 'hemolog',
+}
+
+let firebaseApp: FirebaseApp | null = null
+let firestoreInstance: Firestore | null = null
+let emulatorConnected = false
+
+function getApp(): FirebaseApp | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ if (!firebaseApp) {
+ const apps = getApps()
+ if (apps.length === 0) {
+ firebaseApp = initializeApp(firebaseConfig)
+ } else {
+ firebaseApp = apps[0]
+ }
+ }
+
+ return firebaseApp
+}
+
+export function getFirestoreLite(): Firestore | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ const app = getApp()
+ if (!app) {
+ return null
+ }
+
+ if (!firestoreInstance) {
+ firestoreInstance = getFirestore(app)
+
+ // Connect to emulator if in development mode
+ const useEmulators =
+ process.env.NEXT_PUBLIC_USE_EMULATORS === 'true' ||
+ process.env.NEXT_PUBLIC_USE_EMULATORS === '1' ||
+ window.location.hostname === 'localhost'
+
+ if (useEmulators && !emulatorConnected) {
+ try {
+ connectFirestoreEmulator(firestoreInstance, 'localhost', 8082)
+ emulatorConnected = true
+ console.log('✓ Connected to Firestore Lite emulator at localhost:8082')
+ } catch (error) {
+ if (
+ error instanceof Error &&
+ error.message.includes('already been called')
+ ) {
+ emulatorConnected = true
+ } else {
+ console.warn(
+ 'Firestore Lite emulator connection warning:',
+ error instanceof Error ? error.message : String(error)
+ )
+ emulatorConnected = true
+ }
+ }
+ }
+ }
+
+ return firestoreInstance
+}
+
+// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
+function cleanUndefined(obj: T): Partial {
+ return Object.fromEntries(
+ Object.entries(obj).filter(([, v]) => v !== undefined)
+ ) as Partial
+}
+
+// Generic document fetch by ID
+export async function getDocument(
+ collectionName: string,
+ docId: string
+): Promise<(T & { id: string }) | null> {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const docRef = doc(collection(db, collectionName), docId)
+ const docSnap = await getDoc(docRef)
+
+ if (!docSnap.exists()) {
+ return null
+ }
+
+ return { id: docSnap.id, ...docSnap.data() } as T & { id: string }
+}
+
+// Generic collection query
+export async function getDocuments(
+ collectionName: string,
+ ...queryConstraints: QueryConstraint[]
+): Promise<(T & { id: string })[]> {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const collectionRef = collection(db, collectionName)
+ const q = query(collectionRef, ...queryConstraints)
+ const querySnapshot = await getDocs(q)
+
+ return querySnapshot.docs.map((docSnap) => ({
+ id: docSnap.id,
+ ...docSnap.data(),
+ })) as (T & { id: string })[]
+}
+
+// Create a new document with auto-generated ID
+export async function createDocument(
+ collectionName: string,
+ data: WithFieldValue
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const cleanData = cleanUndefined(data as object)
+ const collectionRef = collection(db, collectionName)
+ const docRef = await addDoc(collectionRef, cleanData)
+
+ // Update the document with its own ID (common pattern for this app)
+ await setDoc(docRef, { uid: docRef.id, ...cleanData }, { merge: true })
+
+ return docRef.id
+}
+
+// Create or update a document with a specific ID
+export async function setDocument(
+ collectionName: string,
+ docId: string,
+ data: WithFieldValue,
+ merge = true
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const cleanData = cleanUndefined(data as object)
+ const docRef = doc(collection(db, collectionName), docId)
+ await setDoc(docRef, cleanData, { merge })
+}
+
+// Update specific fields of a document
+export async function updateDocument(
+ collectionName: string,
+ docId: string,
+ data: Partial
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const cleanData = cleanUndefined(data as object)
+ const docRef = doc(collection(db, collectionName), docId)
+ await updateDoc(docRef, cleanData)
+}
+
+// Delete a document (hard delete)
+export async function deleteDocument(
+ collectionName: string,
+ docId: string
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const docRef = doc(collection(db, collectionName), docId)
+ await deleteDoc(docRef)
+}
+
+// Soft delete a document (set deletedAt timestamp)
+export async function softDeleteDocument(
+ collectionName: string,
+ docId: string
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const docRef = doc(collection(db, collectionName), docId)
+ await setDoc(docRef, { deletedAt: new Date().toISOString() }, { merge: true })
+}
+
+// Re-export query helpers for building constraints
+export { collection, doc, query, where, limit, orderBy }
+export type { QueryConstraint, DocumentData }
diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts
new file mode 100644
index 0000000..8e703bd
--- /dev/null
+++ b/src/lib/helpers.ts
@@ -0,0 +1,33 @@
+// Placeholder - need to restore from git
+export async function generateUniqueString(length: number): Promise {
+ return Math.random()
+ .toString(36)
+ .substring(2, 2 + length)
+}
+
+export function track(event: string, data: Record) {
+ console.log('track', event, data)
+}
+
+import type { TreatmentType } from './db/infusions'
+
+export function filterInfusions(
+ infusions: TreatmentType[] | undefined,
+ filterYear: string
+): TreatmentType[] {
+ if (!infusions) {
+ return []
+ }
+
+ if (filterYear === 'All time') {
+ return infusions
+ }
+
+ return infusions.filter((infusion) => {
+ if (!infusion.date) {
+ return false
+ }
+ const infusionYear = new Date(infusion.date).getFullYear().toString()
+ return infusionYear === filterYear
+ })
+}
diff --git a/src/lib/hooks/useEmergencyUserQuery.ts b/src/lib/hooks/useEmergencyUserQuery.ts
new file mode 100644
index 0000000..d17a851
--- /dev/null
+++ b/src/lib/hooks/useEmergencyUserQuery.ts
@@ -0,0 +1,52 @@
+import { useQuery } from '@tanstack/react-query'
+import { fetchUserByAlertId } from '@/lib/db/users'
+import type { Person } from '@/lib/types/person'
+
+// Query key factory for emergency users (by alertId)
+export const emergencyUserKeys = {
+ all: ['users', 'alertId'] as const,
+ detail: (alertId: string) => [...emergencyUserKeys.all, alertId] as const,
+}
+
+interface UseEmergencyUserQueryOptions {
+ enabled?: boolean
+}
+
+interface EmergencyUserQueryResult {
+ person: Person | null
+ isLoading: boolean
+ isError: boolean
+ error: Error | null
+ refetch: () => void
+}
+
+export function useEmergencyUserQuery(
+ alertId: string | string[] | undefined,
+ options: UseEmergencyUserQueryOptions = {}
+): EmergencyUserQueryResult {
+ // Normalize alertId to string
+ const normalizedAlertId = Array.isArray(alertId) ? alertId[0] : alertId
+ const { enabled = true } = options
+
+ const query = useQuery({
+ queryKey: emergencyUserKeys.detail(normalizedAlertId ?? ''),
+ queryFn: async () => {
+ if (!normalizedAlertId) {
+ return null
+ }
+ return fetchUserByAlertId(normalizedAlertId)
+ },
+ enabled: enabled && !!normalizedAlertId,
+ staleTime: 60 * 1000, // 1 minute (emergency data doesn't change often)
+ })
+
+ return {
+ person: query.data ?? null,
+ isLoading: query.isLoading,
+ isError: query.isError,
+ error: query.error,
+ refetch: query.refetch,
+ }
+}
+
+export default useEmergencyUserQuery
diff --git a/src/lib/hooks/useFeedbackMutations.ts b/src/lib/hooks/useFeedbackMutations.ts
new file mode 100644
index 0000000..3d8ef9f
--- /dev/null
+++ b/src/lib/hooks/useFeedbackMutations.ts
@@ -0,0 +1,100 @@
+import { useMutation } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+import {
+ createFeedback,
+ deleteFeedback,
+ updateFeedback,
+ type FeedbackType,
+} from '@/lib/db/feedback'
+
+interface UseFeedbackMutationsOptions {
+ onCreateSuccess?: (docId: string) => void
+ onDeleteSuccess?: () => void
+ onUpdateSuccess?: () => void
+ onError?: (error: Error) => void
+}
+
+export function useFeedbackMutations(
+ options: UseFeedbackMutationsOptions = {}
+) {
+ const { onCreateSuccess, onDeleteSuccess, onUpdateSuccess, onError } = options
+
+ // Create feedback mutation
+ const createMutation = useMutation({
+ mutationFn: async (data: FeedbackType) => {
+ const docId = await createFeedback(data)
+ return docId
+ },
+ onError: (error) => {
+ toast.error(
+ `Failed to submit feedback: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: (docId) => {
+ toast.success('Thank you for your feedback!')
+ onCreateSuccess?.(docId)
+ },
+ })
+
+ // Delete feedback mutation
+ const deleteMutation = useMutation({
+ mutationFn: async (uid: string) => {
+ await deleteFeedback(uid)
+ return uid
+ },
+ onError: (error) => {
+ toast.error(
+ `Failed to delete feedback: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ onDeleteSuccess?.()
+ },
+ })
+
+ // Update feedback mutation
+ const updateMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ data,
+ }: {
+ uid: string
+ data: Partial
+ }) => {
+ await updateFeedback(uid, data)
+ return { uid, data }
+ },
+ onError: (error) => {
+ toast.error(
+ `Failed to update feedback: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ onUpdateSuccess?.()
+ },
+ })
+
+ return {
+ createFeedback: createMutation.mutate,
+ createFeedbackAsync: createMutation.mutateAsync,
+ isCreating: createMutation.isPending,
+
+ deleteFeedback: deleteMutation.mutate,
+ deleteFeedbackAsync: deleteMutation.mutateAsync,
+ isDeleting: deleteMutation.isPending,
+
+ updateFeedback: updateMutation.mutate,
+ updateFeedbackAsync: updateMutation.mutateAsync,
+ isUpdating: updateMutation.isPending,
+
+ isPending:
+ createMutation.isPending ||
+ deleteMutation.isPending ||
+ updateMutation.isPending,
+ }
+}
+
+export default useFeedbackMutations
diff --git a/src/lib/hooks/useInfusionMutations.ts b/src/lib/hooks/useInfusionMutations.ts
new file mode 100644
index 0000000..4feca52
--- /dev/null
+++ b/src/lib/hooks/useInfusionMutations.ts
@@ -0,0 +1,197 @@
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+import {
+ createInfusion,
+ updateInfusion,
+ deleteInfusion,
+ type TreatmentType,
+} from '@/lib/db/infusions'
+import { infusionKeys } from './useInfusionsQuery'
+
+interface UseInfusionMutationsOptions {
+ onCreateSuccess?: (docId: string) => void
+ onUpdateSuccess?: () => void
+ onDeleteSuccess?: () => void
+ onError?: (error: Error) => void
+}
+
+export function useInfusionMutations(
+ options: UseInfusionMutationsOptions = {}
+) {
+ const queryClient = useQueryClient()
+ const { onCreateSuccess, onUpdateSuccess, onDeleteSuccess, onError } = options
+
+ // Create infusion mutation with optimistic update
+ const createMutation = useMutation({
+ mutationFn: async (data: TreatmentType) => {
+ const docId = await createInfusion(data)
+ return docId
+ },
+ onMutate: async (newInfusion) => {
+ // Cancel any outgoing refetches
+ await queryClient.cancelQueries({ queryKey: infusionKeys.all })
+
+ // Snapshot the previous value
+ const userUid = newInfusion.user.uid
+ const previousInfusions = queryClient.getQueryData(
+ infusionKeys.list(userUid)
+ )
+
+ // Optimistically update with a temporary ID
+ const optimisticInfusion: TreatmentType = {
+ ...newInfusion,
+ uid: `temp-${Date.now()}`,
+ }
+
+ queryClient.setQueryData(
+ infusionKeys.list(userUid),
+ (old) => (old ? [optimisticInfusion, ...old] : [optimisticInfusion])
+ )
+
+ return { previousInfusions, userUid }
+ },
+ onError: (error, _newInfusion, context) => {
+ // Rollback on error
+ if (context?.previousInfusions !== undefined) {
+ queryClient.setQueryData(
+ infusionKeys.list(context.userUid),
+ context.previousInfusions
+ )
+ }
+ toast.error(
+ `Failed to create treatment: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: (docId) => {
+ toast.success('Treatment logged! Hope all is well.')
+ onCreateSuccess?.(docId)
+ },
+ onSettled: (_data, _error, variables) => {
+ // Refetch to ensure consistency
+ queryClient.invalidateQueries({
+ queryKey: infusionKeys.list(variables.user.uid),
+ })
+ },
+ })
+
+ // Update infusion mutation with optimistic update
+ const updateMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ userUid,
+ data,
+ }: {
+ uid: string
+ userUid: string
+ data: Partial
+ }) => {
+ await updateInfusion(uid, data)
+ return { uid, userUid, data }
+ },
+ onMutate: async ({ uid, userUid, data }) => {
+ await queryClient.cancelQueries({ queryKey: infusionKeys.all })
+
+ const previousInfusions = queryClient.getQueryData(
+ infusionKeys.list(userUid)
+ )
+
+ // Optimistically update
+ queryClient.setQueryData(
+ infusionKeys.list(userUid),
+ (old) =>
+ old?.map((infusion) =>
+ infusion.uid === uid ? { ...infusion, ...data } : infusion
+ ) ?? []
+ )
+
+ return { previousInfusions, userUid }
+ },
+ onError: (error, _variables, context) => {
+ if (context?.previousInfusions !== undefined) {
+ queryClient.setQueryData(
+ infusionKeys.list(context.userUid),
+ context.previousInfusions
+ )
+ }
+ toast.error(
+ `Failed to update treatment: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ toast.success('Treatment updated!')
+ onUpdateSuccess?.()
+ },
+ onSettled: (_data, _error, variables) => {
+ queryClient.invalidateQueries({
+ queryKey: infusionKeys.list(variables.userUid),
+ })
+ },
+ })
+
+ // Delete infusion mutation with optimistic update (soft delete)
+ const deleteMutation = useMutation({
+ mutationFn: async ({ uid, userUid }: { uid: string; userUid: string }) => {
+ await deleteInfusion(uid)
+ return { uid, userUid }
+ },
+ onMutate: async ({ uid, userUid }) => {
+ await queryClient.cancelQueries({ queryKey: infusionKeys.all })
+
+ const previousInfusions = queryClient.getQueryData(
+ infusionKeys.list(userUid)
+ )
+
+ // Optimistically remove from list
+ queryClient.setQueryData(
+ infusionKeys.list(userUid),
+ (old) => old?.filter((infusion) => infusion.uid !== uid) ?? []
+ )
+
+ return { previousInfusions, userUid }
+ },
+ onError: (error, _variables, context) => {
+ if (context?.previousInfusions !== undefined) {
+ queryClient.setQueryData(
+ infusionKeys.list(context.userUid),
+ context.previousInfusions
+ )
+ }
+ toast.error(
+ `Failed to delete treatment: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ toast.success('Treatment deleted')
+ onDeleteSuccess?.()
+ },
+ onSettled: (_data, _error, variables) => {
+ queryClient.invalidateQueries({
+ queryKey: infusionKeys.list(variables.userUid),
+ })
+ },
+ })
+
+ return {
+ createInfusion: createMutation.mutate,
+ createInfusionAsync: createMutation.mutateAsync,
+ isCreating: createMutation.isPending,
+
+ updateInfusion: updateMutation.mutate,
+ updateInfusionAsync: updateMutation.mutateAsync,
+ isUpdating: updateMutation.isPending,
+
+ deleteInfusion: deleteMutation.mutate,
+ deleteInfusionAsync: deleteMutation.mutateAsync,
+ isDeleting: deleteMutation.isPending,
+
+ isPending:
+ createMutation.isPending ||
+ updateMutation.isPending ||
+ deleteMutation.isPending,
+ }
+}
+
+export default useInfusionMutations
diff --git a/src/lib/hooks/useInfusionsQuery.ts b/src/lib/hooks/useInfusionsQuery.ts
new file mode 100644
index 0000000..d98586f
--- /dev/null
+++ b/src/lib/hooks/useInfusionsQuery.ts
@@ -0,0 +1,65 @@
+import { useQuery } from '@tanstack/react-query'
+import { compareDesc } from 'date-fns'
+import { useAuth } from '@/lib/auth'
+import { fetchInfusions, type TreatmentType } from '@/lib/db/infusions'
+
+// Query key factory for infusions
+export const infusionKeys = {
+ all: ['infusions'] as const,
+ list: (uid: string) => [...infusionKeys.all, uid] as const,
+}
+
+interface UseInfusionsQueryOptions {
+ limit?: number
+ uid?: string
+ // Polling interval in ms (default: no polling)
+ refetchInterval?: number
+}
+
+interface InfusionQueryResult {
+ data: TreatmentType[]
+ isLoading: boolean
+ isError: boolean
+ error: Error | null
+ refetch: () => void
+}
+
+export function useInfusionsQuery(
+ options: UseInfusionsQueryOptions = {}
+): InfusionQueryResult {
+ const { limit: maxItems, uid: overrideUid, refetchInterval } = options
+ const { user } = useAuth()
+ const userUid = overrideUid ?? user?.uid
+
+ const query = useQuery({
+ queryKey: infusionKeys.list(userUid ?? ''),
+ queryFn: async () => {
+ if (!userUid) {
+ return []
+ }
+ return fetchInfusions(userUid)
+ },
+ enabled: !!userUid,
+ refetchInterval,
+ // Keep data fresh
+ staleTime: 10 * 1000, // 10 seconds
+ })
+
+ // Sort infusions by date (newest first) and apply limit
+ const sortedData = (query.data ?? [])
+ .slice()
+ .sort((a, b) => compareDesc(new Date(a.date), new Date(b.date)))
+
+ const limitedData = maxItems ? sortedData.slice(0, maxItems) : sortedData
+
+ return {
+ data: limitedData,
+ isLoading: query.isLoading,
+ isError: query.isError,
+ error: query.error,
+ refetch: query.refetch,
+ }
+}
+
+// Hook alias for backward compatibility
+export default useInfusionsQuery
diff --git a/src/lib/hooks/useUserMutations.ts b/src/lib/hooks/useUserMutations.ts
new file mode 100644
index 0000000..2298195
--- /dev/null
+++ b/src/lib/hooks/useUserMutations.ts
@@ -0,0 +1,105 @@
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+import { createUser, updateUser } from '@/lib/db/users'
+import { userKeys } from './useUserQuery'
+import type { UserType } from '@/lib/types/users'
+import type { Person } from '@/lib/types/person'
+
+interface UseUserMutationsOptions {
+ onCreateSuccess?: () => void
+ onUpdateSuccess?: () => void
+ onError?: (error: Error) => void
+}
+
+export function useUserMutations(options: UseUserMutationsOptions = {}) {
+ const queryClient = useQueryClient()
+ const { onCreateSuccess, onUpdateSuccess, onError } = options
+
+ // Create user mutation
+ const createMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ userData,
+ }: {
+ uid: string
+ userData: Partial
+ }) => {
+ await createUser(uid, userData)
+ return { uid, userData }
+ },
+ onError: (error) => {
+ console.error('Failed to create user:', error)
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: ({ uid }) => {
+ queryClient.invalidateQueries({ queryKey: userKeys.detail(uid) })
+ onCreateSuccess?.()
+ },
+ })
+
+ // Update user mutation with optimistic update
+ const updateMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ userData,
+ }: {
+ uid: string
+ userData: Partial
+ }) => {
+ await updateUser(uid, userData)
+ return { uid, userData }
+ },
+ onMutate: async ({ uid, userData }) => {
+ await queryClient.cancelQueries({ queryKey: userKeys.detail(uid) })
+
+ const previousUser = queryClient.getQueryData(
+ userKeys.detail(uid)
+ )
+
+ // Optimistically update
+ if (previousUser) {
+ queryClient.setQueryData(userKeys.detail(uid), {
+ ...previousUser,
+ ...userData,
+ })
+ }
+
+ return { previousUser, uid }
+ },
+ onError: (error, _variables, context) => {
+ if (context?.previousUser !== undefined) {
+ queryClient.setQueryData(
+ userKeys.detail(context.uid),
+ context.previousUser
+ )
+ }
+ toast.error(
+ `Failed to update profile: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ toast.success('Profile updated!')
+ onUpdateSuccess?.()
+ },
+ onSettled: (_data, _error, variables) => {
+ queryClient.invalidateQueries({
+ queryKey: userKeys.detail(variables.uid),
+ })
+ },
+ })
+
+ return {
+ createUser: createMutation.mutate,
+ createUserAsync: createMutation.mutateAsync,
+ isCreating: createMutation.isPending,
+
+ updateUser: updateMutation.mutate,
+ updateUserAsync: updateMutation.mutateAsync,
+ isUpdating: updateMutation.isPending,
+
+ isPending: createMutation.isPending || updateMutation.isPending,
+ }
+}
+
+export default useUserMutations
diff --git a/src/lib/hooks/useUserQuery.ts b/src/lib/hooks/useUserQuery.ts
new file mode 100644
index 0000000..3dc3d54
--- /dev/null
+++ b/src/lib/hooks/useUserQuery.ts
@@ -0,0 +1,53 @@
+import { useQuery } from '@tanstack/react-query'
+import { fetchUserByUid } from '@/lib/db/users'
+import type { Person } from '@/lib/types/person'
+
+// Query key factory for users
+export const userKeys = {
+ all: ['users'] as const,
+ detail: (uid: string) => [...userKeys.all, uid] as const,
+}
+
+interface UseUserQueryOptions {
+ enabled?: boolean
+}
+
+interface UserQueryResult {
+ person: Person | null
+ isLoading: boolean
+ isError: boolean
+ error: Error | null
+ refetch: () => void
+}
+
+export function useUserQuery(
+ uid: string | string[] | undefined,
+ options: UseUserQueryOptions = {}
+): UserQueryResult {
+ // Normalize uid to string
+ const normalizedUid = Array.isArray(uid) ? uid[0] : uid
+ const { enabled = true } = options
+
+ const query = useQuery({
+ queryKey: userKeys.detail(normalizedUid ?? ''),
+ queryFn: async () => {
+ if (!normalizedUid) {
+ return null
+ }
+ return fetchUserByUid(normalizedUid)
+ },
+ enabled: enabled && !!normalizedUid,
+ staleTime: 30 * 1000, // 30 seconds
+ })
+
+ return {
+ person: query.data ?? null,
+ isLoading: query.isLoading,
+ isError: query.isError,
+ error: query.error,
+ refetch: query.refetch,
+ }
+}
+
+// Alias for backward compatibility with useDbUser
+export default useUserQuery
diff --git a/src/lib/providers/query-provider.tsx b/src/lib/providers/query-provider.tsx
new file mode 100644
index 0000000..a2384d1
--- /dev/null
+++ b/src/lib/providers/query-provider.tsx
@@ -0,0 +1,59 @@
+'use client'
+
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { useState, type ReactNode } from 'react'
+
+// Create a stable QueryClient configuration
+function makeQueryClient() {
+ return new QueryClient({
+ defaultOptions: {
+ queries: {
+ // Data is considered fresh for 30 seconds
+ staleTime: 30 * 1000,
+ // Cache data for 5 minutes
+ gcTime: 5 * 60 * 1000,
+ // Retry failed requests up to 2 times
+ retry: 2,
+ // Don't refetch on window focus by default (can enable per-query)
+ refetchOnWindowFocus: false,
+ // Refetch on reconnect
+ refetchOnReconnect: true,
+ },
+ mutations: {
+ // Retry failed mutations once
+ retry: 1,
+ },
+ },
+ })
+}
+
+// Singleton for browser, but create new for each SSR request
+let browserQueryClient: QueryClient | undefined
+
+function getQueryClient() {
+ if (typeof window === 'undefined') {
+ // Server: always make a new query client
+ return makeQueryClient()
+ }
+ // Browser: make a new query client if we don't already have one
+ if (!browserQueryClient) {
+ browserQueryClient = makeQueryClient()
+ }
+ return browserQueryClient
+}
+
+interface QueryProviderProps {
+ children: ReactNode
+}
+
+export function QueryProvider({ children }: QueryProviderProps) {
+ // Use useState to ensure the same client is used across re-renders
+ const [queryClient] = useState(() => getQueryClient())
+
+ return (
+ {children}
+ )
+}
+
+// Export the query client getter for use in mutations that need direct access
+export { getQueryClient }
diff --git a/src/lib/seed.ts b/src/lib/seed.ts
new file mode 100644
index 0000000..fec5e85
--- /dev/null
+++ b/src/lib/seed.ts
@@ -0,0 +1,215 @@
+// seed.ts
+// Script to populate Firebase DB with test user data for alertId 'mike29'
+// Run with: NEXT_PUBLIC_USE_EMULATORS=true npx tsx src/lib/seed.ts
+//
+// IMPORTANT: This script only works with Firebase emulators for safety.
+// It will refuse to run if emulators are not enabled.
+
+import { adminFirestore } from './firebase-admin'
+import type { Person } from './types/person'
+import {
+ TreatmentTypeEnum,
+ type TreatmentType,
+ type TreatmentTypeOptions,
+} from './db/infusions'
+import type { AttachedUserType } from './types/users'
+
+// Safety check: Only allow running with emulators
+function checkEmulatorMode() {
+ const useEmulators = process.env.NEXT_PUBLIC_USE_EMULATORS === 'true'
+ const firestoreEmulatorHost = process.env.FIRESTORE_EMULATOR_HOST
+
+ if (!useEmulators) {
+ console.error(
+ '❌ ERROR: This seed script can only run with Firebase emulators enabled.'
+ )
+ console.error('')
+ console.error('To run this script, set NEXT_PUBLIC_USE_EMULATORS=true:')
+ console.error(' NEXT_PUBLIC_USE_EMULATORS=true npx tsx src/lib/seed.ts')
+ console.error('')
+ console.error('Make sure Firebase emulators are running:')
+ console.error(' pnpm firebase:dev')
+ process.exit(1)
+ }
+
+ if (!firestoreEmulatorHost && !process.env.FIREBASE_AUTH_EMULATOR_HOST) {
+ // Set emulator hosts if not already set (for safety)
+ process.env.FIRESTORE_EMULATOR_HOST = 'localhost:8082'
+ process.env.FIREBASE_AUTH_EMULATOR_HOST = 'localhost:9099'
+ console.log('✓ Emulator hosts configured')
+ }
+
+ console.log('✓ Running in emulator mode (safe for local development)')
+ console.log('')
+}
+
+// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
+function cleanUndefined(obj: T): Partial {
+ return Object.fromEntries(
+ Object.entries(obj).filter(([, v]) => v !== undefined)
+ ) as Partial
+}
+
+async function seedInfusions(
+ user: AttachedUserType,
+ medicationBrand: string,
+ count: number = 10
+): Promise {
+ const infusionTypes: TreatmentTypeOptions[] = [
+ TreatmentTypeEnum.ANTIBODY,
+ TreatmentTypeEnum.PROPHY,
+ TreatmentTypeEnum.BLEED,
+ TreatmentTypeEnum.PREVENTATIVE,
+ ]
+
+ const sites = ['Left arm', 'Right arm', 'Left leg', 'Right leg', 'Stomach']
+ const causes = ['', 'Minor cut', 'Bruise', 'Joint pain', 'Preventive']
+
+ const now = new Date()
+ const infusions: TreatmentType[] = []
+
+ for (let i = 0; i < count; i++) {
+ // Spread infusions over the last 30 days
+ const daysAgo = Math.floor((i / count) * 30)
+ const infusionDate = new Date(now)
+ infusionDate.setDate(infusionDate.getDate() - daysAgo)
+
+ const dateStr = infusionDate.toISOString().slice(0, 10)
+ const createdAt = infusionDate.toISOString()
+
+ const type = infusionTypes[Math.floor(Math.random() * infusionTypes.length)]
+ const site = sites[Math.floor(Math.random() * sites.length)]
+ const cause = causes[Math.floor(Math.random() * causes.length)]
+
+ // Vary units between 2000-4000
+ const units = Math.floor(Math.random() * 2000) + 2000
+
+ const infusion: TreatmentType = {
+ deletedAt: null,
+ cause,
+ createdAt,
+ date: dateStr,
+ medication: {
+ brand: medicationBrand,
+ units,
+ lot: `LOT${Math.floor(Math.random() * 10000)}`,
+ },
+ sites: site,
+ type,
+ user,
+ }
+
+ infusions.push(infusion)
+ }
+
+ // Sort by date (oldest first) for more realistic ordering
+ infusions.sort((a, b) => a.date.localeCompare(b.date))
+
+ // Create infusions in Firestore
+ for (const infusion of infusions) {
+ const cleanData = cleanUndefined(infusion)
+ const docRef = await adminFirestore.collection('infusions').add(cleanData)
+ await docRef.set({ uid: docRef.id, ...cleanData }, { merge: true })
+ }
+
+ console.log(`✓ Created ${count} infusions for user ${user.name}`)
+}
+
+async function seedUser() {
+ const seedUserData = {
+ name: 'Seed User',
+ hemophiliaType: 'A',
+ severity: 'Moderate',
+ medication: 'Advate',
+ injectionFrequency: 'Every 3 days',
+ factor: 8,
+ }
+
+ // Seed user is separate from test sign-in user
+ // This user is for seeding data only, not for authentication
+ const alertId = 'mike29'
+ const seedEmail = `seed-${alertId}@hemolog.com`
+
+ try {
+ let userUid: string
+ let userDocData: Person
+
+ // Check if user document already exists by alertId
+ const existingUserQuery = await adminFirestore
+ .collection('users')
+ .where('alertId', '==', alertId)
+ .limit(1)
+ .get()
+
+ if (!existingUserQuery.empty) {
+ const existingDoc = existingUserQuery.docs[0]
+ userUid = existingDoc.id
+ userDocData = existingDoc.data() as Person
+ console.log(
+ `✓ Seed user with alertId '${alertId}' already exists with uid: ${userUid}`
+ )
+ console.log('Updating existing seed user document...')
+
+ // Ensure uid field matches document ID for consistency
+ const userData: Partial = {
+ alertId,
+ uid: userUid,
+ ...seedUserData,
+ }
+
+ const cleanData = cleanUndefined(userData)
+ await existingDoc.ref.update(cleanData)
+ // Update userDocData to reflect the updated data
+ userDocData = { ...userDocData, ...cleanData } as Person
+ console.log(`✓ Updated seed user document with alertId '${alertId}'`)
+ } else {
+ // Create new seed user document
+ // Use a consistent UID for the seed user (not tied to Firebase Auth)
+ userUid = `seed-uid-${alertId}`
+
+ const userData: Person = {
+ alertId,
+ uid: userUid,
+ ...seedUserData,
+ }
+
+ const cleanData = cleanUndefined(userData)
+ await adminFirestore.collection('users').doc(userUid).set(cleanData)
+ userDocData = userData
+ console.log(
+ `✓ Created seed user document with alertId '${alertId}' and uid '${userUid}'`
+ )
+ console.log('User data:', JSON.stringify(cleanData, null, 2))
+ }
+
+ // Create AttachedUserType for infusions
+ // Ensure uid matches what's stored in the Person document
+ const attachedUser: AttachedUserType = {
+ uid: userDocData.uid || userUid,
+ name: seedUserData.name,
+ email: seedEmail,
+ photoUrl: userDocData.photoUrl || '',
+ }
+
+ console.log(`Creating infusions with user.uid: ${attachedUser.uid}`)
+ console.log(`Person document uid: ${userDocData.uid}`)
+
+ // Create 10 infusions
+ await seedInfusions(attachedUser, seedUserData.medication, 10)
+ } catch (error) {
+ console.error('Error seeding user:', error)
+ process.exit(1)
+ }
+}
+
+// Run the seed function
+checkEmulatorMode()
+seedUser()
+ .then(() => {
+ console.log('Seed completed successfully')
+ process.exit(0)
+ })
+ .catch((error) => {
+ console.error('Seed failed:', error)
+ process.exit(1)
+ })
diff --git a/lib/types/person.ts b/src/lib/types/person.ts
similarity index 100%
rename from lib/types/person.ts
rename to src/lib/types/person.ts
diff --git a/lib/types/users.ts b/src/lib/types/users.ts
similarity index 72%
rename from lib/types/users.ts
rename to src/lib/types/users.ts
index b1cdabc..1dadacd 100644
--- a/lib/types/users.ts
+++ b/src/lib/types/users.ts
@@ -1,22 +1,21 @@
-export interface AttachedUserType {
+// Placeholder - need to restore from git
+export interface UserType {
+ uid: string
email: string
name: string
+ alertId?: string
+ isAdmin?: boolean
+ apiKey?: string
+ medication?: string
+ monoclonalAntibody?: string
photoUrl?: string
- uid: string
+ provider?: string
+ token?: string
}
-export interface UserType {
- alertId?: string
- displayName?: string
+export interface AttachedUserType {
email: string
- isAdmin?: boolean
name: string
- photoUrl?: string
- medication?: string
- monoclonalAntibody?: string
- injectionFrequency?: string
- provider: string
- token: string
+ photoUrl: string
uid: string
- apiKey?: string
}
diff --git a/switch-rules.sh b/src/scripts/switch-rules.sh
similarity index 63%
rename from switch-rules.sh
rename to src/scripts/switch-rules.sh
index a083d72..1b3639b 100755
--- a/switch-rules.sh
+++ b/src/scripts/switch-rules.sh
@@ -1,14 +1,17 @@
#!/bin/bash
# Script to switch between development and production Firestore rules
+# Get the project root directory (two levels up from this script)
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
if [ "$1" = "dev" ]; then
echo "Switching to development rules..."
- cp firestore.dev.rules firestore.rules
+ cp "$PROJECT_ROOT/firebase/firestore.dev.rules" "$PROJECT_ROOT/firebase/firestore.rules"
echo "✅ Using development rules (allows all operations)"
elif [ "$1" = "prod" ]; then
echo "Switching to production rules..."
- cp firestore.prod.rules firestore.rules
+ cp "$PROJECT_ROOT/firebase/firestore.prod.rules" "$PROJECT_ROOT/firebase/firestore.rules"
echo "✅ Using production rules (requires authentication)"
else
echo "Usage: $0 [dev|prod]"
@@ -19,3 +22,4 @@ fi
echo "Restart your Firebase emulators for changes to take effect:"
echo " pnpm run firebase"
+
diff --git a/tsconfig.json b/tsconfig.json
index afa7418..415aaec 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"lib": [
"dom",
"dom.iterable",
@@ -20,13 +20,25 @@
"skipLibCheck": true,
"strict": true,
"target": "es6",
- "incremental": true
+ "incremental": true,
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ]
+ },
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
},
"include": [
"next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- "next.config.js"
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "next.config.js",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules",
From b15c1da4737ee6f8d8c901a2418b73f15110c390 Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Sun, 28 Dec 2025 23:17:30 -0800
Subject: [PATCH 04/15] remove unused deps, replace twitter url with bluesky,
fix auth
---
package.json | 7 +-
pnpm-lock.yaml | 5178 +------------------------
src/components/blog/postFooter.tsx | 3 +-
src/components/home/infusionTable.tsx | 16 +-
src/components/home/profilePage.tsx | 3 +-
src/components/shared/footer.tsx | 3 +-
src/lib/auth.tsx | 30 +-
src/lib/db/users.ts | 3 +-
src/lib/helpers.ts | 5 +-
9 files changed, 235 insertions(+), 5013 deletions(-)
diff --git a/package.json b/package.json
index b3d5e79..4066c96 100644
--- a/package.json
+++ b/package.json
@@ -37,20 +37,19 @@
"underscore": "^1.13.7"
},
"devDependencies": {
- "@biomejs/biome": "2.3.5",
+ "@biomejs/biome": "2.3.10",
"@next/bundle-analyzer": "^16.1.1",
"@tabler/icons-react": "^3.36.0",
"@tailwindcss/postcss": "^4.1.18",
- "@testing-library/cypress": "^8.0.7",
+ "@testing-library/cypress": "^10.1.0",
"@types/js-cookie": "^2.2.7",
"@types/node": "^22.19.3",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@types/underscore": "^1.13.0",
"autoprefixer": "^10.4.23",
- "cypress": "^10.11.0",
+ "cypress": "^15.8.1",
"dotenv": "^17.2.3",
- "firebase-tools": "^9.23.3",
"husky": "^7.0.4",
"lint-staged": "^12.5.0",
"react-hot-toast": "^2.6.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 782d2f1..af505b0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,15 +26,9 @@ importers:
formik:
specifier: ^2.4.9
version: 2.4.9(@types/react@18.3.27)(react@18.3.1)
- isomorphic-unfetch:
- specifier: ^3.1.0
- version: 3.1.0(encoding@0.1.13)
js-cookie:
specifier: ^2.2.1
version: 2.2.1
- nanoid:
- specifier: ^3.3.11
- version: 3.3.11
next:
specifier: ^16.1.1
version: 16.1.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -47,9 +41,6 @@ importers:
react-qr-code:
specifier: ^2.0.18
version: 2.0.18(react@18.3.1)
- react-vis:
- specifier: ^1.12.1
- version: 1.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
recharts:
specifier: ^3.6.0
version: 3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@17.0.2)(react@18.3.1)(redux@5.0.1)
@@ -58,8 +49,8 @@ importers:
version: 1.13.7
devDependencies:
'@biomejs/biome':
- specifier: 2.3.5
- version: 2.3.5
+ specifier: 2.3.10
+ version: 2.3.10
'@next/bundle-analyzer':
specifier: ^16.1.1
version: 16.1.1
@@ -70,8 +61,8 @@ importers:
specifier: ^4.1.18
version: 4.1.18
'@testing-library/cypress':
- specifier: ^8.0.7
- version: 8.0.7(cypress@10.11.0)
+ specifier: ^10.1.0
+ version: 10.1.0(cypress@15.8.1)
'@types/js-cookie':
specifier: ^2.2.7
version: 2.2.7
@@ -84,9 +75,6 @@ importers:
'@types/react-dom':
specifier: ^18.0.0
version: 18.3.7(@types/react@18.3.27)
- '@types/react-vis':
- specifier: ^1.11.15
- version: 1.11.15
'@types/underscore':
specifier: ^1.13.0
version: 1.13.0
@@ -94,14 +82,11 @@ importers:
specifier: ^10.4.23
version: 10.4.23(postcss@8.5.6)
cypress:
- specifier: ^10.11.0
- version: 10.11.0
+ specifier: ^15.8.1
+ version: 15.8.1
dotenv:
specifier: ^17.2.3
version: 17.2.3
- firebase-tools:
- specifier: ^9.23.3
- version: 9.23.3(encoding@0.1.13)
husky:
specifier: ^7.0.4
version: 7.0.4
@@ -124,9 +109,6 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
- '@apidevtools/json-schema-ref-parser@9.1.2':
- resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==}
-
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
@@ -139,77 +121,66 @@ packages:
resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
- '@biomejs/biome@2.3.5':
- resolution: {integrity: sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg==}
+ '@biomejs/biome@2.3.10':
+ resolution: {integrity: sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ==}
engines: {node: '>=14.21.3'}
hasBin: true
- '@biomejs/cli-darwin-arm64@2.3.5':
- resolution: {integrity: sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw==}
+ '@biomejs/cli-darwin-arm64@2.3.10':
+ resolution: {integrity: sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [darwin]
- '@biomejs/cli-darwin-x64@2.3.5':
- resolution: {integrity: sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA==}
+ '@biomejs/cli-darwin-x64@2.3.10':
+ resolution: {integrity: sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [darwin]
- '@biomejs/cli-linux-arm64-musl@2.3.5':
- resolution: {integrity: sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg==}
+ '@biomejs/cli-linux-arm64-musl@2.3.10':
+ resolution: {integrity: sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-arm64@2.3.5':
- resolution: {integrity: sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw==}
+ '@biomejs/cli-linux-arm64@2.3.10':
+ resolution: {integrity: sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-x64-musl@2.3.5':
- resolution: {integrity: sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg==}
+ '@biomejs/cli-linux-x64-musl@2.3.10':
+ resolution: {integrity: sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-linux-x64@2.3.5':
- resolution: {integrity: sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g==}
+ '@biomejs/cli-linux-x64@2.3.10':
+ resolution: {integrity: sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-win32-arm64@2.3.5':
- resolution: {integrity: sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA==}
+ '@biomejs/cli-win32-arm64@2.3.10':
+ resolution: {integrity: sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [win32]
- '@biomejs/cli-win32-x64@2.3.5':
- resolution: {integrity: sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ==}
+ '@biomejs/cli-win32-x64@2.3.10':
+ resolution: {integrity: sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [win32]
- '@colors/colors@1.5.0':
- resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
- engines: {node: '>=0.1.90'}
-
- '@colors/colors@1.6.0':
- resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
- engines: {node: '>=0.1.90'}
-
- '@cypress/request@2.88.12':
- resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==}
+ '@cypress/request@3.0.9':
+ resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==}
engines: {node: '>= 6'}
'@cypress/xvfb@1.2.4':
resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
- '@dabh/diagnostics@2.0.8':
- resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
-
'@discoveryjs/json-ext@0.5.7':
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
@@ -461,22 +432,10 @@ packages:
resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==}
engines: {node: '>=14.0.0'}
- '@google-cloud/paginator@3.0.7':
- resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==}
- engines: {node: '>=10'}
-
'@google-cloud/paginator@5.0.2':
resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==}
engines: {node: '>=14.0.0'}
- '@google-cloud/precise-date@2.0.4':
- resolution: {integrity: sha512-nOB+mZdevI/1Si0QAfxWfzzIqFdc7wrO+DYePFvgbOoMtvX+XfFTINNt7e9Zg66AbDbWCPRnikU+6f5LTm9Wyg==}
- engines: {node: '>=10.4.0'}
-
- '@google-cloud/projectify@2.1.1':
- resolution: {integrity: sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==}
- engines: {node: '>=10'}
-
'@google-cloud/projectify@4.0.0':
resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==}
engines: {node: '>=14.0.0'}
@@ -485,10 +444,6 @@ packages:
resolution: {integrity: sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==}
engines: {node: '>=10'}
- '@google-cloud/pubsub@2.19.4':
- resolution: {integrity: sha512-+aZxq6N5XGarQS3xGXjKSRFy4TB+3PMpI0CBmSrcC59g3TB5nmwps3pv/KkdLa0Cd+CPHDdfrEW1uSrGBMLICw==}
- engines: {node: '>=10'}
-
'@google-cloud/storage@7.18.0':
resolution: {integrity: sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==}
engines: {node: '>=14'}
@@ -497,19 +452,10 @@ packages:
resolution: {integrity: sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==}
engines: {node: '>=12.10.0'}
- '@grpc/grpc-js@1.6.12':
- resolution: {integrity: sha512-JmvQ03OTSpVd9JTlj/K3IWHSz4Gk/JMLUTtW7Zb0KvO1LcOYGATh5cNuRYzCAeDR3O8wq+q8FZe97eO9MBrkUw==}
- engines: {node: ^8.13.0 || >=10.10.0}
-
'@grpc/grpc-js@1.9.15':
resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==}
engines: {node: ^8.13.0 || >=10.10.0}
- '@grpc/proto-loader@0.6.9':
- resolution: {integrity: sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==}
- engines: {node: '>=6'}
- hasBin: true
-
'@grpc/proto-loader@0.7.15':
resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==}
engines: {node: '>=6'}
@@ -657,14 +603,6 @@ packages:
cpu: [x64]
os: [win32]
- '@isaacs/cliui@8.0.2':
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
-
- '@isaacs/fs-minipass@4.0.1':
- resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
- engines: {node: '>=18.0.0'}
-
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -684,9 +622,6 @@ packages:
'@js-sdsl/ordered-map@4.4.2':
resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
- '@jsdevtools/ono@7.1.3':
- resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
-
'@next/bundle-analyzer@16.1.1':
resolution: {integrity: sha512-aNJy301GGH8k36rDgrYdnyYEdjRQg6csMi1njzqHo+3qyZvOOWMHSv+p7SztNTzP5RU2KRwX0pPwYBtDcE+vVA==}
@@ -741,26 +676,10 @@ packages:
cpu: [x64]
os: [win32]
- '@npmcli/agent@3.0.0':
- resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- '@npmcli/fs@4.0.0':
- resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
- '@opentelemetry/semantic-conventions@1.38.0':
- resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==}
- engines: {node: '>=14'}
-
- '@pkgjs/parseargs@0.11.0':
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
-
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
@@ -805,13 +724,6 @@ packages:
react-redux:
optional: true
- '@sindresorhus/is@0.14.0':
- resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
- engines: {node: '>=6'}
-
- '@so-ric/colorspace@1.1.6':
- resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
-
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -821,10 +733,6 @@ packages:
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
- '@szmarczak/http-timer@1.1.2':
- resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
- engines: {node: '>=6'}
-
'@tabler/icons-react@3.36.0':
resolution: {integrity: sha512-sSZ00bEjTdTTskVFykq294RJq+9cFatwy4uYa78HcYBCXU1kSD1DIp5yoFsQXmybkIOKCjp18OnhAYk553UIfQ==}
peerDependencies:
@@ -940,27 +848,20 @@ packages:
resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
engines: {node: '>=12'}
- '@testing-library/cypress@8.0.7':
- resolution: {integrity: sha512-3HTV725rOS+YHve/gD9coZp/UcPK5xhr4H0GMnq/ni6USdtzVtSOG9WBFtd8rYnrXk8rrGD+0toRFYouJNIG0Q==}
+ '@testing-library/cypress@10.1.0':
+ resolution: {integrity: sha512-tNkNtYRqPQh71xXKuMizr146zlellawUfDth7A/urYU4J66g0VGZ063YsS0gqS79Z58u1G/uo9UxN05qvKXMag==}
engines: {node: '>=12', npm: '>=6'}
peerDependencies:
- cypress: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
-
- '@testing-library/dom@8.20.1':
- resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==}
- engines: {node: '>=12'}
+ cypress: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
- '@tootallnate/once@1.1.2':
- resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
- engines: {node: '>= 6'}
+ '@testing-library/dom@10.4.1':
+ resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
+ engines: {node: '>=18'}
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
- '@types/archiver@5.3.4':
- resolution: {integrity: sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==}
-
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@@ -1000,9 +901,6 @@ packages:
'@types/d3-timer@3.0.2':
resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
- '@types/duplexify@3.6.5':
- resolution: {integrity: sha512-fB56ACzlW91UdZ5F3VXplVMDngO8QaX5Y2mjvADtN01TT2TMy4WjF0Lg+tFDvt4uMBeTe4SgaD+qCrA7dL5/tA==}
-
'@types/express-serve-static-core@4.19.7':
resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==}
@@ -1020,15 +918,9 @@ packages:
'@types/js-cookie@2.2.7':
resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
- '@types/json-schema@7.0.15':
- resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-
'@types/jsonwebtoken@9.0.10':
resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==}
- '@types/keyv@3.1.4':
- resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
-
'@types/long@4.0.2':
resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
@@ -1038,9 +930,6 @@ packages:
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@14.18.63':
- resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==}
-
'@types/node@20.19.24':
resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==}
@@ -1061,21 +950,12 @@ packages:
peerDependencies:
'@types/react': ^18.0.0
- '@types/react-vis@1.11.15':
- resolution: {integrity: sha512-0feNthHy/GnkCRPagPKkAnZmKQY1rI+OelD/ASdI7z+PMCfcmPLTi7nLrduIojxGAOWBiIgyH3YX1Ix7GWpAag==}
-
'@types/react@18.3.27':
resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==}
- '@types/readdir-glob@1.1.5':
- resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==}
-
'@types/request@2.48.13':
resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==}
- '@types/responselike@1.0.3':
- resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
-
'@types/send@0.17.6':
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
@@ -1091,12 +971,12 @@ packages:
'@types/sizzle@2.3.10':
resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==}
+ '@types/tmp@0.2.6':
+ resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==}
+
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
- '@types/triple-beam@1.3.5':
- resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
-
'@types/underscore@1.13.0':
resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==}
@@ -1106,22 +986,10 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
- JSONStream@1.3.5:
- resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
- hasBin: true
-
- abbrev@3.0.1:
- resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
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-walk@8.3.4:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
@@ -1143,36 +1011,14 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
- ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
- ansi-align@3.0.1:
- resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
-
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
- ansi-escapes@3.2.0:
- resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==}
- engines: {node: '>=4'}
-
ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
- ansi-regex@2.1.1:
- resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
- engines: {node: '>=0.10.0'}
-
- ansi-regex@3.0.1:
- resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
- engines: {node: '>=4'}
-
- ansi-regex@4.1.1:
- resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
- engines: {node: '>=6'}
-
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -1181,14 +1027,6 @@ packages:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
- ansi-styles@2.2.1:
- resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
- engines: {node: '>=0.10.0'}
-
- ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -1201,57 +1039,16 @@ packages:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
- ansicolors@0.3.2:
- resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
-
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
arch@2.2.0:
resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
- archiver-utils@2.1.0:
- resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
- engines: {node: '>= 6'}
-
- archiver-utils@3.0.4:
- resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==}
- engines: {node: '>= 10'}
-
- archiver@5.3.2:
- resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==}
- engines: {node: '>= 10'}
-
- argparse@1.0.10:
- resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
-
- argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-
- aria-query@5.1.3:
- resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
-
- 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==}
-
- array-flatten@3.0.0:
- resolution: {integrity: sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==}
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
arrify@2.0.1:
resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
engines: {node: '>=8'}
- as-array@1.0.0:
- resolution: {integrity: sha512-yTEVeqmnVlLJV0j8IAz/mcMGbr88+yX9SqTxyFc1HJwmW8Zy347jEmWFIg34MRqCUS8CXRKy8a8B/9BaoYDW2w==}
-
- as-array@2.0.0:
- resolution: {integrity: sha512-1Sd1LrodN0XYxYeZcN1J4xYZvmvTwD5tDWaPUGPIzH1mFsmzsPnVtd2exWhecMjtZk/wYWjNZJiD3b1SLCeJqg==}
-
asn1@0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
@@ -1259,10 +1056,6 @@ packages:
resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
engines: {node: '>=0.8'}
- ast-types@0.13.4:
- resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==}
- engines: {node: '>=4'}
-
astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
@@ -1270,12 +1063,6 @@ packages:
async-retry@1.3.3:
resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
- async@1.5.2:
- resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==}
-
- async@3.2.6:
- resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
-
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
@@ -1290,19 +1077,12 @@ packages:
peerDependencies:
postcss: ^8.1.0
- available-typed-arrays@1.0.7:
- resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
- engines: {node: '>= 0.4'}
-
aws-sign2@0.7.0:
resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
aws4@1.13.2:
resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1310,63 +1090,18 @@ packages:
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
hasBin: true
- basic-auth-connect@1.1.0:
- resolution: {integrity: sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q==}
-
- basic-auth@2.0.1:
- resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
- engines: {node: '>= 0.8'}
-
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
- big-integer@1.6.52:
- resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
- engines: {node: '>=0.6'}
-
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'}
-
- binary@0.3.0:
- resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==}
-
- bl@4.1.0:
- resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
-
- blakejs@1.2.1:
- resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==}
-
blob-util@2.0.2:
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
- bluebird@3.4.7:
- resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==}
-
bluebird@3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
- 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}
-
- boxen@4.2.0:
- resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==}
- engines: {node: '>=8'}
-
- boxen@5.1.2:
- resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
- engines: {node: '>=10'}
-
- 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'}
@@ -1382,29 +1117,9 @@ packages:
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
- buffer-indexof-polyfill@1.0.2:
- resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==}
- engines: {node: '>=0.10'}
-
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
- buffers@0.1.1:
- resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==}
- engines: {node: '>=0.2.0'}
-
- bytes@3.1.2:
- resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
- engines: {node: '>= 0.8'}
-
- cacache@19.0.1:
- resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- cacheable-request@6.1.0:
- resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
- engines: {node: '>=8'}
-
cachedir@2.4.0:
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
engines: {node: '>=6'}
@@ -1413,114 +1128,36 @@ packages:
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'}
- call-me-maybe@1.0.2:
- resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
-
- camelcase@5.3.1:
- resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
- engines: {node: '>=6'}
-
- camelcase@6.3.0:
- resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
- engines: {node: '>=10'}
-
caniuse-lite@1.0.30001761:
resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
- cardinal@2.1.1:
- resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
- hasBin: true
-
caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
- chainsaw@0.1.0:
- resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==}
-
- chalk@1.1.3:
- resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
- engines: {node: '>=0.10.0'}
-
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
-
- chalk@3.0.0:
- resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
- engines: {node: '>=8'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- chardet@0.7.0:
- resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
-
- check-more-types@2.24.0:
- resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
- engines: {node: '>= 0.8.0'}
-
- chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
-
- chownr@1.1.4:
- resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
-
- chownr@3.0.0:
- resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
- engines: {node: '>=18'}
-
- ci-info@2.0.0:
- resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
-
- ci-info@3.9.0:
- resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ ci-info@4.3.1:
+ resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==}
engines: {node: '>=8'}
- cjson@0.3.3:
- resolution: {integrity: sha512-yKNcXi/Mvi5kb1uK0sahubYiyfUO2EUgOp4NcY9+8NX5Xmc+4yeNogZuLFkpLBBj7/QI9MjRUIuXrV9XOw5kVg==}
- engines: {node: '>= 0.3.0'}
-
clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
- cli-boxes@2.2.1:
- resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
- engines: {node: '>=6'}
-
- cli-color@1.4.0:
- resolution: {integrity: sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==}
-
- cli-cursor@2.1.0:
- resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
- engines: {node: '>=4'}
-
cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
- cli-spinners@2.9.2:
- resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
- engines: {node: '>=6'}
-
- cli-table3@0.6.5:
- resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ cli-table3@0.6.1:
+ resolution: {integrity: sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==}
engines: {node: 10.* || >= 12.*}
- cli-table@0.3.11:
- resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==}
- engines: {node: '>= 0.2.0'}
-
cli-truncate@2.1.0:
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
engines: {node: '>=8'}
@@ -1529,76 +1166,37 @@ packages:
resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- cli-width@2.2.1:
- resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
-
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
- cliui@7.0.4:
- resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
-
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
- clone-response@1.0.3:
- resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
-
- clone@1.0.4:
- resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
- engines: {node: '>=0.8'}
-
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
- color-convert@3.1.2:
- resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==}
- engines: {node: '>=14.6'}
-
- color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- color-name@2.0.2:
- resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==}
- engines: {node: '>=12.20'}
-
- color-string@2.1.2:
- resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==}
- engines: {node: '>=18'}
-
- color@5.0.2:
- resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==}
- engines: {node: '>=18'}
-
colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
- colors@1.0.3:
- resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==}
+ colors@1.4.0:
+ resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
engines: {node: '>=0.1.90'}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
- commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
-
- commander@5.1.0:
- resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
+ commander@6.2.1:
+ resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
engines: {node: '>= 6'}
commander@7.2.0:
@@ -1613,117 +1211,32 @@ packages:
resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
engines: {node: '>=4.0.0'}
- compare-semver@1.1.0:
- resolution: {integrity: sha512-AENcdfhxsMCzzl+QRdOwMQeA8tZBEEacAmA4pGPoyco27G9sIaM98WNYkcToC9O0wIx1vE+1ErmaM4t0/fXhMw==}
-
- compress-commons@4.1.2:
- resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==}
- engines: {node: '>= 10'}
-
- 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'}
-
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
- configstore@5.0.1:
- resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
- engines: {node: '>=8'}
-
- connect@3.7.0:
- resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
- engines: {node: '>= 0.10.0'}
-
- 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'}
-
- 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-util-is@1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
- core-util-is@1.0.3:
- resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-
- cors@2.8.5:
- resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
- engines: {node: '>= 0.10'}
-
- crc-32@1.2.2:
- resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
- engines: {node: '>=0.8'}
- hasBin: true
-
- crc32-stream@4.0.3:
- resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==}
- engines: {node: '>= 10'}
-
- cross-env@5.2.1:
- resolution: {integrity: sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==}
- engines: {node: '>=4.0'}
- hasBin: true
-
- cross-spawn@6.0.6:
- resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==}
- engines: {node: '>=4.8'}
-
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'}
-
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
- csv-streamify@3.0.4:
- resolution: {integrity: sha512-IQkxN0zu0gym8/5CHrSyReeRewbw+aRDrMrGI5WmIY/LmEcNpAcPOyETBHREKgsWHeEQWEihiBmx5EcKAsKWZw==}
- engines: {node: '>=0.12.0'}
- hasBin: true
-
- cypress@10.11.0:
- resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==}
- engines: {node: '>=12.0.0'}
+ cypress@15.8.1:
+ resolution: {integrity: sha512-ogc62stTQGh1395ipKxfCE5hQuSApTzeH5e0d9U6m7wYO9HQeCpgnkYtBtd0MbkN2Fnch5Od2mX9u4hoTlrH4Q==}
+ engines: {node: ^20.1.0 || ^22.0.0 || >=24.0.0}
hasBin: true
- d3-array@2.12.1:
- resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
-
d3-array@3.2.4:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
- d3-collection@1.0.7:
- resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==}
-
d3-color@3.1.0:
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
- d3-contour@4.0.2:
- resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
- engines: {node: '>=12'}
-
d3-ease@3.0.1:
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
@@ -1732,38 +1245,18 @@ packages:
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
- d3-geo@3.1.1:
- resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
- engines: {node: '>=12'}
-
- d3-hexbin@0.2.2:
- resolution: {integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==}
-
- d3-hierarchy@3.1.2:
- resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
- engines: {node: '>=12'}
-
d3-interpolate@3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
- d3-path@1.0.9:
- resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
-
d3-path@3.1.0:
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
engines: {node: '>=12'}
- d3-sankey@0.12.3:
- resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
-
d3-scale@4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
- d3-shape@1.3.7:
- resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
-
d3-shape@3.2.0:
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
engines: {node: '>=12'}
@@ -1780,21 +1273,10 @@ packages:
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
engines: {node: '>=12'}
- d3-voronoi@1.1.4:
- resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==}
-
- d@1.0.2:
- resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==}
- engines: {node: '>=0.12'}
-
dashdash@1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
- data-uri-to-buffer@3.0.1:
- resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==}
- engines: {node: '>= 6'}
-
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -1805,14 +1287,6 @@ packages:
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
- 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:
@@ -1821,15 +1295,6 @@ packages:
supports-color:
optional: true
- debug@4.3.1:
- resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -1842,61 +1307,17 @@ packages:
decimal.js-light@2.5.1:
resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
- decompress-response@3.3.0:
- resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
- engines: {node: '>=4'}
-
- deep-equal@1.1.2:
- resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
- engines: {node: '>= 0.4'}
-
- deep-equal@2.2.3:
- resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
- engines: {node: '>= 0.4'}
-
- deep-extend@0.6.0:
- resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
- engines: {node: '>=4.0.0'}
-
- deep-freeze@0.0.1:
- resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==}
-
- deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-
deepmerge@2.2.1:
resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==}
engines: {node: '>=0.10.0'}
- defaults@1.0.4:
- resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
-
- defer-to-connect@1.1.3:
- resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
-
- define-data-property@1.1.4:
- resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
- engines: {node: '>= 0.4'}
-
- define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
-
- degenerator@3.0.4:
- resolution: {integrity: sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==}
- engines: {node: '>= 6'}
-
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'}
-
- destroy@1.2.0:
- resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
- engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
@@ -1905,31 +1326,14 @@ packages:
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
- dom-walk@0.1.2:
- resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
-
- dot-prop@5.3.0:
- resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
- engines: {node: '>=8'}
-
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
- dotenv@6.2.0:
- resolution: {integrity: sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==}
- engines: {node: '>=6'}
-
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
- duplexer2@0.1.4:
- resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
-
- duplexer3@0.1.5:
- resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
-
duplexer@0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
@@ -1945,9 +1349,6 @@ packages:
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
- ee-first@1.1.1:
- resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
-
electron-to-chromium@1.5.267:
resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
@@ -1957,17 +1358,6 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
- enabled@2.0.0:
- resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
-
- 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'}
-
encoding@0.1.13:
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
@@ -1982,13 +1372,6 @@ packages:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
- env-paths@2.2.1:
- resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
- engines: {node: '>=6'}
-
- err-code@2.0.3:
- resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
-
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -1997,9 +1380,6 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-get-iterator@1.1.3:
- resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
-
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
@@ -2011,31 +1391,10 @@ packages:
es-toolkit@1.43.0:
resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==}
- es5-ext@0.10.64:
- resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
- engines: {node: '>=0.10'}
-
- es6-iterator@2.0.3:
- resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
-
- es6-symbol@3.1.4:
- resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
- engines: {node: '>=0.12'}
-
- es6-weak-map@2.0.3:
- resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==}
-
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
- escape-goat@2.1.1:
- resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
- engines: {node: '>=8'}
-
- escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
escape-string-regexp@1.0.5:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
@@ -2044,35 +1403,6 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- escodegen@1.14.3:
- resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==}
- engines: {node: '>=4.0'}
- hasBin: true
-
- esniff@2.0.1:
- resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
- engines: {node: '>=0.10'}
-
- esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
- hasBin: true
-
- estraverse@4.3.0:
- resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
- engines: {node: '>=4.0'}
-
- 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-emitter@0.3.5:
- resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
-
event-target-shim@5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'}
@@ -2083,9 +1413,6 @@ packages:
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
- events-listener@1.1.0:
- resolution: {integrity: sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==}
-
execa@4.1.0:
resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
engines: {node: '>=10'}
@@ -2098,34 +1425,9 @@ packages:
resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
engines: {node: '>=4'}
- exegesis-express@2.0.1:
- resolution: {integrity: sha512-8ORl1YRygYGPdR+zcClMqzaU+JQuvdNIw/s0RNwYluxNecEHkDEcXFmO6A5T79p7e48KI8iXJYt6KIn4Z9z4bg==}
- engines: {node: '>=6.0.0', npm: '>5.0.0'}
-
- exegesis@2.5.7:
- resolution: {integrity: sha512-Y0gEY3hgoLa80aMUm8rhhlIW3/KWo4uqN5hKJqok2GLh3maZjRLRC+p0gj33Jw3upAOKOXeRgScT5rtRoMyxwQ==}
- engines: {node: '>=6.0.0', npm: '>5.0.0'}
-
- exit-code@1.0.2:
- resolution: {integrity: sha512-U80QYrKun5np62yRqG6geNRP5TZKU2HF73Bb6IE3XjDHXKlserAdP14tIaP3W9J6ezv84DwbpbRTAtu4FsKcgw==}
-
- exponential-backoff@3.1.3:
- resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
-
- express@4.21.2:
- resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
- engines: {node: '>= 0.10.0'}
-
- ext@1.7.0:
- resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
-
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- external-editor@3.1.0:
- resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
- engines: {node: '>=4'}
-
extract-zip@2.0.1:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
@@ -2142,18 +1444,6 @@ packages:
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- 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-text-encoding@1.0.6:
- resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==}
-
- fast-url-parser@1.1.3:
- resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
-
fast-xml-parser@4.5.3:
resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
hasBin: true
@@ -2165,158 +1455,54 @@ packages:
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
-
- fecha@4.2.3:
- resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
-
- figures@2.0.0:
- resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==}
- engines: {node: '>=4'}
-
figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
- file-uri-to-path@2.0.0:
- resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==}
- engines: {node: '>= 6'}
-
- filesize@6.4.0:
- resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==}
- engines: {node: '>= 0.4.0'}
-
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
- finalhandler@1.1.2:
- resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
- engines: {node: '>= 0.8'}
-
- finalhandler@1.3.1:
- resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
- engines: {node: '>= 0.8'}
-
firebase-admin@12.7.0:
resolution: {integrity: sha512-raFIrOyTqREbyXsNkSHyciQLfv8AUZazehPaQS1lZBSCDYW74FYXU0nQZa3qHI4K+hawohlDbywZ4+qce9YNxA==}
engines: {node: '>=14'}
- firebase-tools@9.23.3:
- resolution: {integrity: sha512-J1S/T96rL3vKObDtTuBkop9JtW3vYnfwyU83NopiuOy9oPBRxFkitgzk034qGrpGyZvDA6Do6ZHI50taB3hrEg==}
- engines: {node: '>= 10.13'}
- hasBin: true
-
firebase@12.7.0:
resolution: {integrity: sha512-ZBZg9jFo8uH4Emd7caOqtalKJfDGHnHQSrCPiqRAdTFQd0wL3ERilUBfhnhBLnlernugkN/o7nJa0p+sE71Izg==}
- flat-arguments@1.0.2:
- resolution: {integrity: sha512-ZIkB09bqQdKP9buPOiZcS/4HK3q992C5q62qAE72d0xWAXfaSbP840BZYUBgHRkzdx6jYRIpKT4ur+Nay/JRlg==}
-
- fn.name@1.1.0:
- resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
-
- 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'}
-
forever-agent@0.6.1:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
- form-data@2.3.3:
- resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
- engines: {node: '>= 0.12'}
-
form-data@2.5.5:
resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==}
engines: {node: '>= 0.12'}
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
formik@2.4.9:
resolution: {integrity: sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==}
peerDependencies:
react: '>=16.8.0'
- forwarded@0.2.0:
- resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
- engines: {node: '>= 0.6'}
-
fraction.js@5.3.4:
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
- fresh@0.5.2:
- resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
- engines: {node: '>= 0.6'}
-
- fs-constants@1.0.0:
- resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-
- fs-extra@5.0.0:
- resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==}
-
- fs-extra@8.1.0:
- resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
- engines: {node: '>=6 <7 || >=8'}
-
fs-extra@9.1.0:
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
engines: {node: '>=10'}
- fs-minipass@1.2.7:
- resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==}
-
- fs-minipass@3.0.3:
- resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
-
- 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]
-
- fstream@1.0.12:
- resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==}
- engines: {node: '>=0.6'}
- deprecated: This package is no longer supported.
-
- ftp@0.3.10:
- resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==}
- engines: {node: '>=0.8.0'}
-
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
functional-red-black-tree@1.0.1:
resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
- 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'}
@@ -2333,10 +1519,6 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
- get-stream@4.1.0:
- resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
- engines: {node: '>=6'}
-
get-stream@5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
@@ -2345,67 +1527,22 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
- get-uri@3.0.2:
- resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==}
- engines: {node: '>= 6'}
-
- getos@3.2.1:
- resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
-
getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
- glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
-
- glob-slash@1.0.0:
- resolution: {integrity: sha512-ZwFh34WZhZX28ntCMAP1mwyAJkn8+Omagvt/GvA+JQM/qgT0+MR2NPF3vhvgdshfdvDyGZXs8fPXW84K32Wjuw==}
-
- glob-slasher@1.0.1:
- resolution: {integrity: sha512-5MUzqFiycIKLMD1B0dYOE4hGgLLUZUNGGYO4BExdwT32wUwW3DBOE7lMQars7vB1q43Fb3Tyt+HmgLKsJhDYdg==}
-
- glob@10.4.5:
- resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
- hasBin: true
-
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- global-dirs@2.1.0:
- resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
- engines: {node: '>=8'}
-
global-dirs@3.0.1:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
- global@4.4.0:
- resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
-
goober@2.1.18:
resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==}
peerDependencies:
csstype: ^3.0.10
- google-auth-library@6.1.6:
- resolution: {integrity: sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==}
- engines: {node: '>=10'}
-
- 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@2.30.3:
- resolution: {integrity: sha512-Zsd6hbJBMvAcJS3cYpAsmupvfsxygFR2meUZJcGeR7iUqYHCR/1Hf2aQNB9srrlXQMm91pNiUvW0Kz6Qld8QkA==}
- engines: {node: '>=10'}
- hasBin: true
-
google-gax@4.6.1:
resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==}
engines: {node: '>=14'}
@@ -2414,27 +1551,13 @@ packages:
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'}
- got@9.6.0:
- resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
- engines: {node: '>=8.6'}
-
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- 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'}
@@ -2443,38 +1566,10 @@ packages:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
- har-schema@2.0.0:
- resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
- engines: {node: '>=4'}
-
- har-validator@5.1.5:
- resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
- engines: {node: '>=6'}
- deprecated: this library is no longer supported
-
- has-ansi@2.0.0:
- resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
- engines: {node: '>=0.10.0'}
-
- has-bigints@1.1.0:
- resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
- engines: {node: '>= 0.4'}
-
- has-flag@2.0.0:
- resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==}
- engines: {node: '>=0.10.0'}
-
- 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-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
@@ -2483,8 +1578,8 @@ packages:
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
- has-yarn@2.1.0:
- resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
+ hasha@5.2.2:
+ resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==}
engines: {node: '>=8'}
hasown@2.0.2:
@@ -2494,43 +1589,21 @@ packages:
hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
- home-dir@1.0.0:
- resolution: {integrity: sha512-PPAP0BMY72XQ0sYwFow8EgHwUYfptkZusnZEGHkBjdKRXIYcVFsbEViqU4k8VrJWf0m7wMr9gscQX9klJYh7zg==}
-
html-entities@2.6.0:
resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
- http-cache-semantics@4.2.0:
- resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
-
- http-errors@2.0.0:
- resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
- engines: {node: '>= 0.8'}
-
http-parser-js@0.5.10:
resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
- http-proxy-agent@4.0.1:
- resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
- engines: {node: '>= 6'}
-
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'}
-
- http-signature@1.2.0:
- resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
- engines: {node: '>=0.8', npm: '>=1.3.7'}
-
- http-signature@1.3.6:
- resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
+ http-signature@1.4.0:
+ resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==}
engines: {node: '>=0.10'}
https-proxy-agent@5.0.1:
@@ -2554,10 +1627,6 @@ packages:
engines: {node: '>=12'}
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'}
@@ -2574,113 +1643,21 @@ packages:
immer@11.1.0:
resolution: {integrity: sha512-dlzb07f5LDY+tzs+iLCSXV2yuhaYfezqyZQc+n6baLECWkOMEWxkECAOnXL0ba7lsA25fM9b2jtzpu/uxo1a7g==}
- import-lazy@2.1.0:
- resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
- engines: {node: '>=4'}
-
- 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'}
- 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==}
- ini@1.3.7:
- resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==}
-
- ini@1.3.8:
- resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
-
ini@2.0.0:
resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
engines: {node: '>=10'}
- inquirer@6.3.1:
- resolution: {integrity: sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==}
- engines: {node: '>=6.0.0'}
-
- install-artifact-from-github@1.4.0:
- resolution: {integrity: sha512-+y6WywKZREw5rq7U2jvr2nmZpT7cbWbQQ0N/qfcseYnzHFz2cZz1Et52oY+XttYuYeTkI8Y+R2JNWj68MpQFSg==}
- hasBin: true
-
- internal-slot@1.1.0:
- resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
- engines: {node: '>= 0.4'}
-
- internmap@1.0.1:
- resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
-
internmap@2.0.3:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
- ip-address@10.1.0:
- resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
- engines: {node: '>= 12'}
-
- ip-regex@4.3.0:
- resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==}
- engines: {node: '>=8'}
-
- ip@1.1.9:
- resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==}
-
- 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-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-ci@2.0.0:
- resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
- hasBin: true
-
- is-ci@3.0.1:
- resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
- hasBin: true
-
- is-date-object@1.1.0:
- resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
- engines: {node: '>= 0.4'}
-
- is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- is-fullwidth-code-point@2.0.0:
- resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
- engines: {node: '>=4'}
-
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -2689,42 +1666,14 @@ packages:
resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
engines: {node: '>=12'}
- is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
-
- is-installed-globally@0.3.2:
- resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==}
- engines: {node: '>=8'}
-
is-installed-globally@0.4.0:
resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
engines: {node: '>=10'}
- is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
-
- is-npm@4.0.0:
- resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==}
- engines: {node: '>=8'}
-
- is-npm@5.0.0:
- resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==}
- engines: {node: '>=10'}
-
- 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@2.0.0:
- resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
- engines: {node: '>=8'}
-
is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
@@ -2733,36 +1682,10 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
- is-promise@2.2.2:
- resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
-
- is-regex@1.2.1:
- resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
- engines: {node: '>= 0.4'}
-
- 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-ended@0.1.4:
- resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==}
-
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-typedarray@1.0.0:
resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
@@ -2770,63 +1693,16 @@ packages:
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
engines: {node: '>=10'}
- is-url@1.2.4:
- resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
-
- is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
-
- is-weakset@2.0.4:
- resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
- engines: {node: '>= 0.4'}
-
- is-wsl@1.1.0:
- resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
- engines: {node: '>=4'}
-
- is-yarn-global@0.3.0:
- resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
-
- is2@2.0.9:
- resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==}
- engines: {node: '>=v0.10.0'}
-
- isarray@0.0.1:
- resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
-
- isarray@1.0.0:
- resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-
- isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- isexe@3.1.1:
- resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
- engines: {node: '>=16'}
-
- isomorphic-unfetch@3.1.0:
- resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==}
-
isstream@0.1.2:
resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
- jackspeak@3.4.3:
- resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
-
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
- jju@1.4.0:
- resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
-
- join-path@1.1.1:
- resolution: {integrity: sha512-jnt9OC34sLXMLJ6YfPQ2ZEKrR9mB5ZbSnQb4LPaOx1c5rTzxpR33L18jjp0r75mGGTJmsil3qwN1B5IBeTnSSA==}
-
jose@4.15.9:
resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
@@ -2836,70 +1712,29 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- js-yaml@3.14.1:
- resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
- hasBin: true
-
- js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
- hasBin: true
-
jsbn@0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
json-bigint@1.0.0:
resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
- json-buffer@3.0.0:
- resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
-
- json-parse-helpfulerror@1.0.3:
- resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==}
-
- json-ptr@2.2.0:
- resolution: {integrity: sha512-w9f6/zhz4kykltXMG7MLJWMajxiPj0q+uzQPR1cggNAE/sXoq/C5vjUb/7QNcC3rJsVIIKy37ALTXy1O+3c8QQ==}
-
- 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-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
- jsonfile@4.0.0:
- resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
-
jsonfile@6.2.0:
resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
- jsonparse@1.3.1:
- resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
- engines: {'0': node >= 0.2.0}
-
- jsonwebtoken@8.5.1:
- resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==}
- engines: {node: '>=4', npm: '>=1.4.28'}
-
jsonwebtoken@9.0.3:
resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==}
engines: {node: '>=12', npm: '>=6'}
- jsprim@1.4.2:
- resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
- engines: {node: '>=0.6.0'}
-
jsprim@2.0.2:
resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
engines: {'0': node >=0.6.0}
- jwa@1.4.2:
- resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
-
jwa@2.0.1:
resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
@@ -2907,41 +1742,12 @@ packages:
resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==}
engines: {node: '>=14'}
- jws@3.2.2:
- resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
-
jws@4.0.0:
resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
jws@4.0.1:
resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==}
- keyv@3.1.0:
- resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
-
- kuler@2.0.0:
- resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
-
- latest-version@5.1.0:
- resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
- engines: {node: '>=8'}
-
- lazy-ass@1.6.0:
- resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
- engines: {node: '> 0.8'}
-
- lazystream@1.0.1:
- resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
- engines: {node: '>= 0.6.3'}
-
- leven@3.1.0:
- resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
- engines: {node: '>=6'}
-
- levn@0.3.0:
- resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
- engines: {node: '>= 0.8.0'}
-
lightningcss-android-arm64@1.30.2:
resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
engines: {node: '>= 12.0.0'}
@@ -3024,9 +1830,6 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
hasBin: true
- listenercount@1.0.1:
- resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==}
-
listr2@3.14.0:
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
engines: {node: '>=10.0.0'}
@@ -3048,39 +1851,15 @@ packages:
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
- lodash._isnative@2.4.1:
- resolution: {integrity: sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==}
-
- lodash._objecttypes@2.4.1:
- resolution: {integrity: sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==}
-
- lodash._shimkeys@2.4.1:
- resolution: {integrity: sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA==}
-
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.defaults@4.2.0:
- resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
-
- lodash.difference@4.5.0:
- resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
-
- lodash.flatten@4.4.0:
- resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
-
lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
- lodash.isarguments@2.4.1:
- resolution: {integrity: sha512-CyMQjsJqDgXL8M2xYAP6V2dlVXli8IhWXLsk19uXxiL9/qISjzQXyWtxsumR2q4CnR9FjCnxpuIO1d9KSKBcyA==}
-
- lodash.isarguments@3.1.0:
- resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
-
lodash.isboolean@3.0.3:
resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
@@ -3090,40 +1869,18 @@ packages:
lodash.isnumber@3.0.3:
resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
- lodash.isobject@2.4.1:
- resolution: {integrity: sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==}
-
- lodash.isobject@3.0.2:
- resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==}
-
lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
lodash.isstring@4.0.1:
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
- lodash.keys@2.4.1:
- resolution: {integrity: sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g==}
-
lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
- lodash.snakecase@4.1.1:
- resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
-
- lodash.union@4.6.0:
- resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
-
- lodash.values@2.4.1:
- resolution: {integrity: sha512-fQwubKvj2Nox2gy6YnjFm8C1I6MIlzKUtBB+Pj7JGtloGqDDL5CPRr4DUUFWPwXWwAl2k3f4C3Aw8H1qAPB9ww==}
-
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- log-symbols@2.2.0:
- resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==}
- engines: {node: '>=4'}
-
log-symbols@4.1.0:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
@@ -3132,13 +1889,6 @@ packages:
resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
engines: {node: '>=10'}
- logform@2.7.0:
- resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
- engines: {node: '>= 12.0.0'}
-
- long@4.0.0:
- resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==}
-
long@5.3.2:
resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
@@ -3146,20 +1896,6 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
- lowercase-keys@1.0.1:
- resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
- engines: {node: '>=0.10.0'}
-
- lowercase-keys@2.0.0:
- resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
- engines: {node: '>=8'}
-
- lru-cache@10.4.3:
- resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
-
- 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'}
@@ -3167,9 +1903,6 @@ packages:
lru-memoizer@2.3.0:
resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==}
- lru-queue@0.1.0:
- resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==}
-
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -3177,46 +1910,13 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
- make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
-
- make-fetch-happen@14.0.3:
- resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- marked-terminal@3.3.0:
- resolution: {integrity: sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A==}
- peerDependencies:
- marked: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0
-
- marked@0.7.0:
- resolution: {integrity: sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==}
- engines: {node: '>=0.10.0'}
- hasBin: true
-
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'}
-
- memoizee@0.4.17:
- resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==}
- engines: {node: '>=0.12'}
-
- 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==}
- 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'}
@@ -3225,150 +1925,34 @@ packages:
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@2.6.0:
- resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
- engines: {node: '>=4.0.0'}
- hasBin: true
-
mime@3.0.0:
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
engines: {node: '>=10.0.0'}
hasBin: true
- mimic-fn@1.2.0:
- resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
- engines: {node: '>=4'}
-
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
- mimic-response@1.0.1:
- resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
- engines: {node: '>=4'}
-
- min-document@2.19.2:
- resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==}
-
- 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-collect@2.0.1:
- resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minipass-fetch@4.0.1:
- resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- minipass-flush@1.0.5:
- resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
- engines: {node: '>= 8'}
-
- minipass-pipeline@1.2.4:
- resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==}
- engines: {node: '>=8'}
-
- minipass-sized@1.0.3:
- resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==}
- engines: {node: '>=8'}
-
- minipass@2.9.0:
- resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==}
-
- minipass@3.3.6:
- resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
- engines: {node: '>=8'}
-
- minipass@7.1.2:
- resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minizlib@1.3.3:
- resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
-
- minizlib@3.1.0:
- resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
- engines: {node: '>= 18'}
-
- mkdirp@0.5.6:
- resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
- hasBin: true
-
- morgan@1.10.1:
- resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==}
- engines: {node: '>= 0.8.0'}
-
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
- ms@2.0.0:
- resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- mute-stream@0.0.7:
- resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==}
-
- nan@2.23.1:
- resolution: {integrity: sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==}
-
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nash@3.0.0:
- resolution: {integrity: sha512-M5SahEycXUmko3zOvsBkF6p94CWLhnyy9hfpQ9Qzp+rQkQ8D1OaTlfTl1OBWktq9Fak3oDXKU+ev7tiMaMu+1w==}
-
- 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'}
-
- negotiator@1.0.0:
- resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
- engines: {node: '>= 0.6'}
-
- netmask@2.0.2:
- resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
- engines: {node: '>= 0.4.0'}
-
- next-tick@1.1.0:
- resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
-
next@16.1.1:
resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==}
engines: {node: '>=20.9.0'}
@@ -3390,12 +1974,6 @@ packages:
sass:
optional: true
- nice-try@1.0.5:
- resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
-
- node-emoji@1.11.0:
- resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
-
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
@@ -3409,34 +1987,17 @@ packages:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
engines: {node: '>= 6.13.0'}
- node-gyp@11.5.0:
- resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
- hasBin: true
-
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
- nopt@8.1.0:
- resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
- engines: {node: ^18.17.0 || >=20.5.0}
- hasBin: true
-
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
- normalize-url@4.5.1:
- resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
- engines: {node: '>=8'}
-
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
- oauth-sign@0.9.0:
- resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
-
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -3449,78 +2010,20 @@ packages:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
- object-is@1.1.6:
- resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
- 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-finished@2.3.0:
- resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
- engines: {node: '>= 0.8'}
-
- 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==}
- one-time@1.0.0:
- resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
-
- onetime@2.0.1:
- resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==}
- engines: {node: '>=4'}
-
onetime@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
- open@6.4.0:
- resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==}
- engines: {node: '>=8'}
-
- openapi3-ts@2.0.2:
- resolution: {integrity: sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==}
-
opener@1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
- optionator@0.8.3:
- resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
- engines: {node: '>= 0.8.0'}
-
- ora@3.4.0:
- resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==}
- engines: {node: '>=6'}
-
- os-tmpdir@1.0.2:
- resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
- engines: {node: '>=0.10.0'}
-
ospath@1.2.2:
resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
- p-cancelable@1.1.0:
- resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
- engines: {node: '>=6'}
-
- p-defer@3.0.0:
- resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==}
- engines: {node: '>=8'}
-
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
@@ -3529,60 +2032,13 @@ packages:
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
engines: {node: '>=10'}
- p-map@7.0.4:
- resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
- engines: {node: '>=18'}
-
- pac-proxy-agent@5.0.0:
- resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==}
- engines: {node: '>= 8'}
-
- pac-resolver@5.0.1:
- resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==}
- engines: {node: '>= 8'}
-
- package-json-from-dist@1.0.1:
- resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
-
- package-json@6.5.0:
- resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
- engines: {node: '>=8'}
-
- parseurl@1.3.3:
- resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
- engines: {node: '>= 0.8'}
-
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
- path-key@2.0.1:
- resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
- engines: {node: '>=4'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
- path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
-
- path-to-regexp@0.1.12:
- resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
-
- path-to-regexp@0.1.7:
- resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
-
- path-to-regexp@1.9.0:
- resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==}
-
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
- performance-now@0.2.0:
- resolution: {integrity: sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==}
-
performance-now@2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
@@ -3593,10 +2049,6 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
- picomatch@4.0.3:
- resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
- engines: {node: '>=12'}
-
pidtree@0.5.0:
resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==}
engines: {node: '>=0.10'}
@@ -3606,14 +2058,6 @@ packages:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
- portfinder@1.0.38:
- resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==}
- engines: {node: '>= 10.12'}
-
- possible-typed-array-names@1.1.0:
- resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
- engines: {node: '>= 0.4'}
-
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@@ -3625,14 +2069,6 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
- prelude-ls@1.1.2:
- resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
- engines: {node: '>= 0.8.0'}
-
- prepend-http@2.0.0:
- resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
- engines: {node: '>=4'}
-
pretty-bytes@5.6.0:
resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
engines: {node: '>=6'}
@@ -3641,120 +2077,34 @@ packages:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
- proc-log@5.0.0:
- resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- process-nextick-args@1.0.7:
- resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==}
-
- process-nextick-args@2.0.1:
- resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
-
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'}
-
- promise-breaker@5.0.0:
- resolution: {integrity: sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==}
-
- promise-retry@2.0.1:
- resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
- engines: {node: '>=10'}
-
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
- proto3-json-serializer@0.1.9:
- resolution: {integrity: sha512-A60IisqvnuI45qNRygJjrnNjX2TMdQGMY+57tR3nul3ZgO2zXkR9OGR8AXxJhkqx84g0FTnrfi3D5fWMSdANdQ==}
-
proto3-json-serializer@2.0.2:
resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
engines: {node: '>=14.0.0'}
- protobufjs@6.11.2:
- resolution: {integrity: sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==}
- hasBin: true
-
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@5.0.0:
- resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==}
- engines: {node: '>= 8'}
-
proxy-from-env@1.0.0:
resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
- proxy-from-env@1.1.0:
- resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
-
- psl@1.15.0:
- resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
-
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
- 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'}
-
- pupa@2.1.1:
- resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
- engines: {node: '>=8'}
-
qr.js@0.0.0:
resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==}
- qs@6.10.4:
- resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==}
- engines: {node: '>=0.6'}
-
- qs@6.13.0:
- resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
- engines: {node: '>=0.6'}
-
qs@6.14.0:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
- qs@6.5.3:
- resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
- engines: {node: '>=0.6'}
-
- querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
-
- raf@3.4.1:
- resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
-
- 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'}
-
- rc@1.2.8:
- resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
- hasBin: true
-
- re2@1.22.3:
- resolution: {integrity: sha512-002aE82U91DiaUA16U6vbiJusvPXn1OWiQukOxJkVUTXbzrSuQbFNHYKcGw8QK/uifRCfjl2Hd/vXYDanKkmaQ==}
-
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
@@ -3776,11 +2126,6 @@ packages:
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
- react-motion@0.5.2:
- resolution: {integrity: sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==}
- peerDependencies:
- react: ^0.14.9 || ^15.3.0 || ^16.0.0
-
react-qr-code@2.0.18:
resolution: {integrity: sha512-v1Jqz7urLMhkO6jkgJuBYhnqvXagzceg3qJUWayuCK/c6LTIonpWbwxR1f1APGd4xrW/QcQEovNrAojbUz65Tg==}
peerDependencies:
@@ -3798,37 +2143,14 @@ packages:
redux:
optional: true
- react-vis@1.12.1:
- resolution: {integrity: sha512-vH7ihTPlBD6wBuzwPoipheyJnx46kKKMXnVqdk4mv5vq+bJVC6JRYdRZSofa2030+kko99rSq/idnYnNWGr6zA==}
- engines: {node: '>=14.18.0', npm: '>=6.13.0'}
- peerDependencies:
- react: ^16.8.3
- react-dom: ^16.8.3
-
react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
- readable-stream@1.1.14:
- resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
-
- readable-stream@2.0.6:
- resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==}
-
- readable-stream@2.3.8:
- resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
-
readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
- readdir-glob@1.1.3:
- resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
-
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
-
recharts@3.6.0:
resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==}
engines: {node: '>=18'}
@@ -3837,9 +2159,6 @@ packages:
react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- redeyed@2.1.1:
- resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
-
redux-thunk@3.1.0:
resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==}
peerDependencies:
@@ -3848,59 +2167,24 @@ packages:
redux@5.0.1:
resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
- regexp.prototype.flags@1.5.4:
- resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
- engines: {node: '>= 0.4'}
-
- registry-auth-token@4.2.2:
- resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==}
- engines: {node: '>=6.0.0'}
-
- registry-url@5.1.0:
- resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
- engines: {node: '>=8'}
-
request-progress@3.0.0:
resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
- request@2.88.2:
- resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
- engines: {node: '>= 6'}
- deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
-
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
- requires-port@1.0.0:
- resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-
reselect@5.1.1:
resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
- responselike@1.0.2:
- resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
-
- restore-cursor@2.0.0:
- resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==}
- engines: {node: '>=4'}
-
restore-cursor@3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
- 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.12.0:
- resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
- engines: {node: '>= 4'}
-
retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'}
@@ -3908,110 +2192,31 @@ packages:
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
- rimraf@2.7.1:
- resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
- deprecated: Rimraf versions prior to v4 are no longer supported
- hasBin: true
-
- rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- deprecated: Rimraf versions prior to v4 are no longer supported
- hasBin: true
-
- router@1.3.8:
- resolution: {integrity: sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==}
- engines: {node: '>= 0.8'}
-
- rsvp@4.8.5:
- resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==}
- engines: {node: 6.* || >= 7.*}
-
- run-async@2.4.1:
- resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
- engines: {node: '>=0.12.0'}
-
- rxjs@6.6.7:
- resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
- engines: {npm: '>=2.0.0'}
-
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
- safe-buffer@5.1.2:
- resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
-
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
- 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==}
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
- semver-diff@3.1.1:
- resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
- engines: {node: '>=8'}
-
- 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.3:
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
engines: {node: '>=10'}
hasBin: true
- send@0.19.0:
- resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
- engines: {node: '>= 0.8.0'}
-
- 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'}
-
- setimmediate@1.0.5:
- resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
-
- setprototypeof@1.2.0:
- resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
-
sharp@0.34.5:
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- shebang-command@1.2.0:
- resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
- engines: {node: '>=0.10.0'}
-
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
- shebang-regex@1.0.0:
- resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
- engines: {node: '>=0.10.0'}
-
shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
@@ -4035,10 +2240,6 @@ packages:
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'}
-
sirv@2.0.4:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
@@ -4055,75 +2256,25 @@ packages:
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
engines: {node: '>=12'}
- smart-buffer@4.2.0:
- resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
- engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
-
- socks-proxy-agent@5.0.1:
- resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==}
- engines: {node: '>= 6'}
-
- 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'}
-
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
- sprintf-js@1.0.3:
- resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
-
sshpk@1.18.0:
resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
engines: {node: '>=0.10.0'}
hasBin: true
- ssri@12.0.0:
- resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ stream-events@1.0.5:
+ resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
- stack-trace@0.0.10:
- resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
-
- statuses@1.5.0:
- resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
- engines: {node: '>= 0.6'}
-
- statuses@2.0.1:
- resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
- engines: {node: '>= 0.8'}
-
- 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==}
+ stream-shift@1.0.3:
+ resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
- string-length@1.0.1:
- resolution: {integrity: sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==}
- engines: {node: '>=0.10.0'}
-
- string-width@2.1.1:
- resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==}
- engines: {node: '>=4'}
-
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -4132,27 +2283,9 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
- string_decoder@0.10.31:
- resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
-
- string_decoder@1.1.1:
- resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
-
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
- strip-ansi@3.0.1:
- resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
- engines: {node: '>=0.10.0'}
-
- strip-ansi@4.0.0:
- resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
- engines: {node: '>=4'}
-
- strip-ansi@5.2.0:
- resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
- engines: {node: '>=6'}
-
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -4165,10 +2298,6 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
- strip-json-comments@2.0.1:
- resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
- engines: {node: '>=0.10.0'}
-
strnum@1.1.2:
resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
@@ -4188,19 +2317,6 @@ packages:
babel-plugin-macros:
optional: true
- superstatic@7.1.0:
- resolution: {integrity: sha512-yBU8iw07nM3Bu4jFc8lnKwLey0cj61OaGmFJZcYC2X+kEpXVmXzERJ3OTAHZAESe1OTeNIuWadt81U5IULGGAA==}
- engines: {node: '>= 8.6.0'}
- hasBin: true
-
- supports-color@2.0.0:
- resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
- engines: {node: '>=0.8.0'}
-
- 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'}
@@ -4213,9 +2329,11 @@ packages:
resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==}
engines: {node: '>=12'}
- supports-hyperlinks@1.0.1:
- resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==}
- engines: {node: '>=4'}
+ systeminformation@5.28.3:
+ resolution: {integrity: sha512-crbaZrBH3TpTbqc0PKFqnUFHdAJOxV9UhF3KCGSrf+YP+SkoMHmxU2Nr9yIG2xgCr4645Z9Ec4GHQQQ7kGX/HA==}
+ engines: {node: '>=8.0.0'}
+ os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
+ hasBin: true
tailwindcss@4.0.0:
resolution: {integrity: sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==}
@@ -4227,131 +2345,61 @@ packages:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'}
- tar-stream@2.2.0:
- resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
- engines: {node: '>=6'}
-
- tar@4.4.19:
- resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==}
- engines: {node: '>=4.5'}
-
- tar@7.5.2:
- resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==}
- engines: {node: '>=18'}
-
- tcp-port-used@1.0.2:
- resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==}
-
teeny-request@9.0.0:
resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==}
engines: {node: '>=14'}
- term-size@2.2.1:
- resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
- engines: {node: '>=8'}
-
- text-hex@1.0.0:
- resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
-
throttleit@1.0.1:
resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==}
- through2@2.0.1:
- resolution: {integrity: sha512-/vp02SIbpmVHapNMjox4hDBzykPdAOmH5y3INcKaxGfpEPSCMqzdWXyGfqPYyxoBLo1JpxBrlh3Z9esv0vWUYw==}
-
through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
- timers-ext@0.1.8:
- resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==}
- engines: {node: '>=0.12'}
-
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
- tinyglobby@0.2.15:
- resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
- engines: {node: '>=12.0.0'}
+ tldts-core@6.1.86:
+ resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
- tmp@0.0.33:
- resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
- engines: {node: '>=0.6.0'}
+ tldts@6.1.86:
+ resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
+ hasBin: true
tmp@0.2.5:
resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
- to-readable-stream@1.0.0:
- resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
- engines: {node: '>=6'}
-
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'}
-
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
- tough-cookie@2.5.0:
- resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
- engines: {node: '>=0.8'}
-
- tough-cookie@4.1.4:
- resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
- engines: {node: '>=6'}
-
- toxic@1.0.1:
- resolution: {integrity: sha512-WI3rIGdcaKULYg7KVoB0zcjikqvcYYvcuT6D89bFPz2rVR0Rl0PK6x8/X62rtdLtBKIE985NzVf/auTtGegIIg==}
+ tough-cookie@5.1.2:
+ resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
+ engines: {node: '>=16'}
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
- traverse@0.3.9:
- resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==}
-
- triple-beam@1.4.1:
- resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
- engines: {node: '>= 14.0.0'}
-
- tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ tree-kill@1.2.2:
+ resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+ hasBin: true
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- tsscmp@1.0.6:
- resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
- engines: {node: '>=0.6.x'}
-
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
- tweetnacl@1.0.3:
- resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==}
-
- tweetsodium@0.0.5:
- resolution: {integrity: sha512-T3aXZtx7KqQbutTtBfn+P5By3HdBuB1eCoGviIrRJV2sXeToxv2X2cv5RvYqgG26PSnN5m3fYixds22Gkfd11w==}
- deprecated: 'tweetsodium is deprecated and unmaintained. Please consider using libsodium.js, maintained by the same author as libsodium: https://github.com/jedisct1/libsodium.js'
-
- type-check@0.3.2:
- resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
- engines: {node: '>= 0.8.0'}
-
- type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
-
type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
@@ -4360,16 +2408,6 @@ packages:
resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
engines: {node: '>=8'}
- type-is@1.6.18:
- resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
- engines: {node: '>= 0.6'}
-
- type@2.7.3:
- resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
-
- typedarray-to-buffer@3.1.5:
- resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
-
typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
@@ -4381,74 +2419,20 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
- unfetch@4.2.0:
- resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==}
-
- unique-filename@4.0.0:
- resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- unique-slug@5.0.0:
- resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- unique-string@2.0.0:
- resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
- engines: {node: '>=8'}
-
- universal-analytics@0.4.23:
- resolution: {integrity: sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==}
-
- universalify@0.1.2:
- resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
- engines: {node: '>= 4.0.0'}
-
- universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
-
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'}
-
untildify@4.0.0:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
- unzipper@0.10.14:
- resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==}
-
update-browserslist-db@1.2.3:
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
- update-notifier@4.1.3:
- resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==}
- engines: {node: '>=8'}
-
- update-notifier@5.1.0:
- resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==}
- engines: {node: '>=10'}
-
- uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
-
- url-join@0.0.1:
- resolution: {integrity: sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw==}
-
- url-parse-lax@3.0.0:
- resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
- engines: {node: '>=4'}
-
- url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
-
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
@@ -4457,19 +2441,10 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- utils-merge@1.0.1:
- resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
- engines: {node: '>= 0.4.0'}
-
uuid@10.0.0:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
hasBin: true
- uuid@3.4.0:
- resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
- deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
- hasBin: true
-
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -4478,13 +2453,6 @@ packages:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
- valid-url@1.0.9:
- resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==}
-
- vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
-
verror@1.10.0:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
@@ -4492,14 +2460,6 @@ packages:
victory-vendor@37.3.6:
resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==}
- vm2@3.10.0:
- resolution: {integrity: sha512-3ggF4Bs0cw4M7Rxn19/Cv3nJi04xrgHwt4uLto+zkcZocaKwP/nKP9wPx6ggN2X0DSXxOOIc63BV1jvES19wXQ==}
- engines: {node: '>=6.0'}
- hasBin: true
-
- wcwidth@1.0.1:
- resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
-
web-vitals@4.2.4:
resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
@@ -4522,48 +2482,11 @@ packages:
whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
- which-boxed-primitive@1.1.1:
- resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
- 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@1.3.1:
- resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
- hasBin: true
-
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
- which@5.0.0:
- resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
- hasBin: true
-
- widest-line@3.1.0:
- resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
- engines: {node: '>=8'}
-
- winston-transport@4.9.0:
- resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
- engines: {node: '>= 12.0.0'}
-
- winston@3.18.3:
- resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==}
- engines: {node: '>= 12.0.0'}
-
- word-wrap@1.2.5:
- resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
- engines: {node: '>=0.10.0'}
-
wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
@@ -4572,16 +2495,9 @@ packages:
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==}
-
ws@7.5.10:
resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
engines: {node: '>=8.3.0'}
@@ -4594,47 +2510,21 @@ packages:
utf-8-validate:
optional: true
- xdg-basedir@4.0.0:
- resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
- engines: {node: '>=8'}
-
- xregexp@2.0.0:
- resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==}
-
- xtend@4.0.2:
- resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
- engines: {node: '>=0.4'}
-
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==}
- yallist@5.0.0:
- resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
- engines: {node: '>=18'}
-
yaml@1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
- yargs-parser@20.2.9:
- resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
- engines: {node: '>=10'}
-
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
- yargs@16.2.0:
- resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
- engines: {node: '>=10'}
-
yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
@@ -4646,21 +2536,10 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- zip-stream@4.1.1:
- resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
- engines: {node: '>= 10'}
-
snapshots:
'@alloc/quick-lru@5.2.0': {}
- '@apidevtools/json-schema-ref-parser@9.1.2':
- dependencies:
- '@jsdevtools/ono': 7.1.3
- '@types/json-schema': 7.0.15
- call-me-maybe: 1.0.2
- js-yaml: 4.1.0
-
'@babel/code-frame@7.27.1':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
@@ -4671,47 +2550,42 @@ snapshots:
'@babel/runtime@7.28.4': {}
- '@biomejs/biome@2.3.5':
+ '@biomejs/biome@2.3.10':
optionalDependencies:
- '@biomejs/cli-darwin-arm64': 2.3.5
- '@biomejs/cli-darwin-x64': 2.3.5
- '@biomejs/cli-linux-arm64': 2.3.5
- '@biomejs/cli-linux-arm64-musl': 2.3.5
- '@biomejs/cli-linux-x64': 2.3.5
- '@biomejs/cli-linux-x64-musl': 2.3.5
- '@biomejs/cli-win32-arm64': 2.3.5
- '@biomejs/cli-win32-x64': 2.3.5
-
- '@biomejs/cli-darwin-arm64@2.3.5':
- optional: true
+ '@biomejs/cli-darwin-arm64': 2.3.10
+ '@biomejs/cli-darwin-x64': 2.3.10
+ '@biomejs/cli-linux-arm64': 2.3.10
+ '@biomejs/cli-linux-arm64-musl': 2.3.10
+ '@biomejs/cli-linux-x64': 2.3.10
+ '@biomejs/cli-linux-x64-musl': 2.3.10
+ '@biomejs/cli-win32-arm64': 2.3.10
+ '@biomejs/cli-win32-x64': 2.3.10
- '@biomejs/cli-darwin-x64@2.3.5':
+ '@biomejs/cli-darwin-arm64@2.3.10':
optional: true
- '@biomejs/cli-linux-arm64-musl@2.3.5':
+ '@biomejs/cli-darwin-x64@2.3.10':
optional: true
- '@biomejs/cli-linux-arm64@2.3.5':
+ '@biomejs/cli-linux-arm64-musl@2.3.10':
optional: true
- '@biomejs/cli-linux-x64-musl@2.3.5':
+ '@biomejs/cli-linux-arm64@2.3.10':
optional: true
- '@biomejs/cli-linux-x64@2.3.5':
+ '@biomejs/cli-linux-x64-musl@2.3.10':
optional: true
- '@biomejs/cli-win32-arm64@2.3.5':
+ '@biomejs/cli-linux-x64@2.3.10':
optional: true
- '@biomejs/cli-win32-x64@2.3.5':
+ '@biomejs/cli-win32-arm64@2.3.10':
optional: true
- '@colors/colors@1.5.0':
+ '@biomejs/cli-win32-x64@2.3.10':
optional: true
- '@colors/colors@1.6.0': {}
-
- '@cypress/request@2.88.12':
+ '@cypress/request@3.0.9':
dependencies:
aws-sign2: 0.7.0
aws4: 1.13.2
@@ -4719,16 +2593,16 @@ snapshots:
combined-stream: 1.0.8
extend: 3.0.2
forever-agent: 0.6.1
- form-data: 2.3.3
- http-signature: 1.3.6
+ form-data: 4.0.5
+ http-signature: 1.4.0
is-typedarray: 1.0.0
isstream: 0.1.2
json-stringify-safe: 5.0.1
mime-types: 2.1.35
performance-now: 2.1.0
- qs: 6.10.4
+ qs: 6.14.0
safe-buffer: 5.2.1
- tough-cookie: 4.1.4
+ tough-cookie: 5.1.2
tunnel-agent: 0.6.0
uuid: 8.3.2
@@ -4739,12 +2613,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@dabh/diagnostics@2.0.8':
- dependencies:
- '@so-ric/colorspace': 1.1.6
- enabled: 2.0.0
- kuler: 2.0.0
-
'@discoveryjs/json-ext@0.5.7': {}
'@emnapi/runtime@1.7.1':
@@ -5127,46 +2995,17 @@ snapshots:
- supports-color
optional: true
- '@google-cloud/paginator@3.0.7':
- dependencies:
- arrify: 2.0.1
- extend: 3.0.2
-
'@google-cloud/paginator@5.0.2':
dependencies:
arrify: 2.0.1
extend: 3.0.2
optional: true
- '@google-cloud/precise-date@2.0.4': {}
-
- '@google-cloud/projectify@2.1.1': {}
-
'@google-cloud/projectify@4.0.0':
optional: true
- '@google-cloud/promisify@2.0.4': {}
-
- '@google-cloud/pubsub@2.19.4(encoding@0.1.13)':
- dependencies:
- '@google-cloud/paginator': 3.0.7
- '@google-cloud/precise-date': 2.0.4
- '@google-cloud/projectify': 2.1.1
- '@google-cloud/promisify': 2.0.4
- '@opentelemetry/api': 1.9.0
- '@opentelemetry/semantic-conventions': 1.38.0
- '@types/duplexify': 3.6.5
- '@types/long': 4.0.2
- arrify: 2.0.1
- extend: 3.0.2
- google-auth-library: 7.14.1(encoding@0.1.13)
- google-gax: 2.30.3(encoding@0.1.13)
- is-stream-ended: 0.1.4
- lodash.snakecase: 4.1.1
- p-defer: 3.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
+ '@google-cloud/promisify@2.0.4':
+ optional: true
'@google-cloud/storage@7.18.0(encoding@0.1.13)':
dependencies:
@@ -5196,24 +3035,11 @@ snapshots:
'@js-sdsl/ordered-map': 4.4.2
optional: true
- '@grpc/grpc-js@1.6.12':
- dependencies:
- '@grpc/proto-loader': 0.7.15
- '@types/node': 20.19.24
-
'@grpc/grpc-js@1.9.15':
dependencies:
'@grpc/proto-loader': 0.7.15
'@types/node': 20.19.24
- '@grpc/proto-loader@0.6.9':
- dependencies:
- '@types/long': 4.0.2
- lodash.camelcase: 4.3.0
- long: 4.0.0
- protobufjs: 6.11.2
- yargs: 16.2.0
-
'@grpc/proto-loader@0.7.15':
dependencies:
lodash.camelcase: 4.3.0
@@ -5326,21 +3152,6 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
- '@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
- optional: true
-
- '@isaacs/fs-minipass@4.0.1':
- dependencies:
- minipass: 7.1.2
- optional: true
-
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -5363,8 +3174,6 @@ snapshots:
'@js-sdsl/ordered-map@4.4.2':
optional: true
- '@jsdevtools/ono@7.1.3': {}
-
'@next/bundle-analyzer@16.1.1':
dependencies:
webpack-bundle-analyzer: 4.10.1
@@ -5398,27 +3207,7 @@ snapshots:
'@next/swc-win32-x64-msvc@16.1.1':
optional: true
- '@npmcli/agent@3.0.0':
- dependencies:
- agent-base: 7.1.4
- http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
- lru-cache: 10.4.3
- socks-proxy-agent: 8.0.5
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- '@npmcli/fs@4.0.0':
- dependencies:
- semver: 7.7.3
- optional: true
-
- '@opentelemetry/api@1.9.0': {}
-
- '@opentelemetry/semantic-conventions@1.38.0': {}
-
- '@pkgjs/parseargs@0.11.0':
+ '@opentelemetry/api@1.9.0':
optional: true
'@polka/url@1.0.0-next.29': {}
@@ -5458,13 +3247,6 @@ snapshots:
react: 18.3.1
react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1)
- '@sindresorhus/is@0.14.0': {}
-
- '@so-ric/colorspace@1.1.6':
- dependencies:
- color: 5.0.2
- text-hex: 1.0.0
-
'@standard-schema/spec@1.1.0': {}
'@standard-schema/utils@0.3.0': {}
@@ -5473,10 +3255,6 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@szmarczak/http-timer@1.1.2':
- dependencies:
- defer-to-connect: 1.1.3
-
'@tabler/icons-react@3.36.0(react@18.3.1)':
dependencies:
'@tabler/icons': 3.36.0
@@ -5568,32 +3346,26 @@ snapshots:
'@tanstack/table-core@8.21.3': {}
- '@testing-library/cypress@8.0.7(cypress@10.11.0)':
+ '@testing-library/cypress@10.1.0(cypress@15.8.1)':
dependencies:
'@babel/runtime': 7.28.4
- '@testing-library/dom': 8.20.1
- cypress: 10.11.0
+ '@testing-library/dom': 10.4.1
+ cypress: 15.8.1
- '@testing-library/dom@8.20.1':
+ '@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.1.3
- chalk: 4.1.2
+ 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
- '@tootallnate/once@1.1.2': {}
-
'@tootallnate/once@2.0.0':
optional: true
- '@types/archiver@5.3.4':
- dependencies:
- '@types/readdir-glob': 1.1.5
-
'@types/aria-query@5.0.4': {}
'@types/body-parser@1.19.6':
@@ -5632,10 +3404,6 @@ snapshots:
'@types/d3-timer@3.0.2': {}
- '@types/duplexify@3.6.5':
- dependencies:
- '@types/node': 20.19.24
-
'@types/express-serve-static-core@4.19.7':
dependencies:
'@types/node': 20.19.24
@@ -5659,25 +3427,18 @@ snapshots:
'@types/js-cookie@2.2.7': {}
- '@types/json-schema@7.0.15': {}
-
'@types/jsonwebtoken@9.0.10':
dependencies:
'@types/ms': 2.1.0
'@types/node': 20.19.24
- '@types/keyv@3.1.4':
- dependencies:
- '@types/node': 20.19.24
-
- '@types/long@4.0.2': {}
+ '@types/long@4.0.2':
+ optional: true
'@types/mime@1.3.5': {}
'@types/ms@2.1.0': {}
- '@types/node@14.18.63': {}
-
'@types/node@20.19.24':
dependencies:
undici-types: 6.21.0
@@ -5696,19 +3457,11 @@ snapshots:
dependencies:
'@types/react': 18.3.27
- '@types/react-vis@1.11.15':
- dependencies:
- '@types/react': 18.3.27
-
'@types/react@18.3.27':
dependencies:
'@types/prop-types': 15.7.15
csstype: 3.2.3
- '@types/readdir-glob@1.1.5':
- dependencies:
- '@types/node': 20.19.24
-
'@types/request@2.48.13':
dependencies:
'@types/caseless': 0.12.5
@@ -5717,10 +3470,6 @@ snapshots:
form-data: 2.5.5
optional: true
- '@types/responselike@1.0.3':
- dependencies:
- '@types/node': 20.19.24
-
'@types/send@0.17.6':
dependencies:
'@types/mime': 1.3.5
@@ -5740,36 +3489,24 @@ snapshots:
'@types/sizzle@2.3.10': {}
+ '@types/tmp@0.2.6': {}
+
'@types/tough-cookie@4.0.5':
optional: true
- '@types/triple-beam@1.3.5': {}
-
'@types/underscore@1.13.0': {}
'@types/use-sync-external-store@0.0.6': {}
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 20.19.24
- optional: true
-
- JSONStream@1.3.5:
- dependencies:
- jsonparse: 1.3.1
- through: 2.3.8
-
- abbrev@3.0.1:
+ '@types/node': 22.19.3
optional: true
abort-controller@3.0.0:
dependencies:
event-target-shim: 5.0.1
-
- accepts@1.3.8:
- dependencies:
- mime-types: 2.1.35
- negotiator: 0.6.3
+ optional: true
acorn-walk@8.3.4:
dependencies:
@@ -5782,6 +3519,7 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
+ optional: true
agent-base@7.1.4:
optional: true
@@ -5791,41 +3529,16 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
- 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
-
- ansi-align@3.0.1:
- dependencies:
- string-width: 4.2.3
-
ansi-colors@4.1.3: {}
- ansi-escapes@3.2.0: {}
-
ansi-escapes@4.3.2:
dependencies:
type-fest: 0.21.3
- ansi-regex@2.1.1: {}
-
- ansi-regex@3.0.1: {}
-
- ansi-regex@4.1.1: {}
-
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {}
- ansi-styles@2.2.1: {}
-
- ansi-styles@3.2.1:
- dependencies:
- color-convert: 1.9.3
-
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
@@ -5834,90 +3547,21 @@ snapshots:
ansi-styles@6.2.3: {}
- ansicolors@0.3.2: {}
+ arch@2.2.0: {}
- anymatch@3.1.3:
+ aria-query@5.3.0:
dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
+ dequal: 2.0.3
- arch@2.2.0: {}
+ arrify@2.0.1:
+ optional: true
- archiver-utils@2.1.0:
- dependencies:
- glob: 7.2.3
- graceful-fs: 4.2.11
- lazystream: 1.0.1
- lodash.defaults: 4.2.0
- lodash.difference: 4.5.0
- lodash.flatten: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.union: 4.6.0
- normalize-path: 3.0.0
- readable-stream: 2.3.8
-
- archiver-utils@3.0.4:
- dependencies:
- glob: 7.2.3
- graceful-fs: 4.2.11
- lazystream: 1.0.1
- lodash.defaults: 4.2.0
- lodash.difference: 4.5.0
- lodash.flatten: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.union: 4.6.0
- normalize-path: 3.0.0
- readable-stream: 3.6.2
-
- archiver@5.3.2:
- dependencies:
- archiver-utils: 2.1.0
- async: 3.2.6
- buffer-crc32: 0.2.13
- readable-stream: 3.6.2
- readdir-glob: 1.1.3
- tar-stream: 2.2.0
- zip-stream: 4.1.1
-
- argparse@1.0.10:
- dependencies:
- sprintf-js: 1.0.3
-
- argparse@2.0.1: {}
-
- aria-query@5.1.3:
- dependencies:
- deep-equal: 2.2.3
-
- array-buffer-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.4
- is-array-buffer: 3.0.5
-
- array-flatten@1.1.1: {}
-
- array-flatten@3.0.0: {}
-
- arrify@2.0.1: {}
-
- as-array@1.0.0:
- dependencies:
- lodash.isarguments: 2.4.1
- lodash.isobject: 2.4.1
- lodash.values: 2.4.1
-
- as-array@2.0.0: {}
-
- asn1@0.2.6:
+ asn1@0.2.6:
dependencies:
safer-buffer: 2.1.2
assert-plus@1.0.0: {}
- ast-types@0.13.4:
- dependencies:
- tslib: 2.8.1
-
astral-regex@2.0.0: {}
async-retry@1.3.3:
@@ -5925,10 +3569,6 @@ snapshots:
retry: 0.13.1
optional: true
- async@1.5.2: {}
-
- async@3.2.6: {}
-
asynckit@0.4.0: {}
at-least-node@1.0.0: {}
@@ -5942,105 +3582,25 @@ snapshots:
postcss: 8.5.6
postcss-value-parser: 4.2.0
- available-typed-arrays@1.0.7:
- dependencies:
- possible-typed-array-names: 1.1.0
-
aws-sign2@0.7.0: {}
aws4@1.13.2: {}
- balanced-match@1.0.2: {}
-
base64-js@1.5.1: {}
baseline-browser-mapping@2.9.11: {}
- basic-auth-connect@1.1.0:
- dependencies:
- tsscmp: 1.0.6
-
- basic-auth@2.0.1:
- dependencies:
- safe-buffer: 5.1.2
-
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
- big-integer@1.6.52: {}
-
- bignumber.js@9.3.1: {}
-
- binary-extensions@2.3.0: {}
-
- binary@0.3.0:
- dependencies:
- buffers: 0.1.1
- chainsaw: 0.1.0
-
- bl@4.1.0:
- dependencies:
- buffer: 5.7.1
- inherits: 2.0.4
- readable-stream: 3.6.2
-
- blakejs@1.2.1: {}
+ bignumber.js@9.3.1:
+ optional: true
blob-util@2.0.2: {}
- bluebird@3.4.7: {}
-
bluebird@3.7.2: {}
- body-parser@1.20.3:
- 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.13.0
- raw-body: 2.5.2
- type-is: 1.6.18
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
-
- boxen@4.2.0:
- dependencies:
- ansi-align: 3.0.1
- camelcase: 5.3.1
- chalk: 3.0.0
- cli-boxes: 2.2.1
- string-width: 4.2.3
- term-size: 2.2.1
- type-fest: 0.8.1
- widest-line: 3.1.0
-
- boxen@5.1.2:
- dependencies:
- ansi-align: 3.0.1
- camelcase: 6.3.0
- chalk: 4.1.2
- cli-boxes: 2.2.1
- string-width: 4.2.3
- type-fest: 0.20.2
- widest-line: 3.1.0
- wrap-ansi: 7.0.0
-
- brace-expansion@1.1.12:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
- brace-expansion@2.0.2:
- dependencies:
- balanced-match: 1.0.2
-
braces@3.0.3:
dependencies:
fill-range: 7.1.1
@@ -6057,43 +3617,11 @@ snapshots:
buffer-equal-constant-time@1.0.1: {}
- buffer-indexof-polyfill@1.0.2: {}
-
buffer@5.7.1:
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
- buffers@0.1.1: {}
-
- bytes@3.1.2: {}
-
- cacache@19.0.1:
- dependencies:
- '@npmcli/fs': 4.0.0
- fs-minipass: 3.0.3
- glob: 10.4.5
- lru-cache: 10.4.3
- minipass: 7.1.2
- minipass-collect: 2.0.1
- minipass-flush: 1.0.5
- minipass-pipeline: 1.2.4
- p-map: 7.0.4
- ssri: 12.0.0
- tar: 7.5.2
- unique-filename: 4.0.0
- optional: true
-
- cacheable-request@6.1.0:
- dependencies:
- clone-response: 1.0.3
- get-stream: 5.2.0
- http-cache-semantics: 4.2.0
- keyv: 3.1.0
- lowercase-keys: 2.0.0
- normalize-url: 4.5.1
- responselike: 1.0.2
-
cachedir@2.4.0: {}
call-bind-apply-helpers@1.0.2:
@@ -6101,122 +3629,33 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
- call-bind@1.0.8:
- dependencies:
- 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-bound@1.0.4:
dependencies:
call-bind-apply-helpers: 1.0.2
get-intrinsic: 1.3.0
- call-me-maybe@1.0.2: {}
-
- camelcase@5.3.1: {}
-
- camelcase@6.3.0: {}
-
caniuse-lite@1.0.30001761: {}
- cardinal@2.1.1:
- dependencies:
- ansicolors: 0.3.2
- redeyed: 2.1.1
-
caseless@0.12.0: {}
- chainsaw@0.1.0:
- dependencies:
- traverse: 0.3.9
-
- chalk@1.1.3:
- dependencies:
- ansi-styles: 2.2.1
- escape-string-regexp: 1.0.5
- has-ansi: 2.0.0
- strip-ansi: 3.0.1
- supports-color: 2.0.0
-
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
-
- chalk@3.0.0:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- chardet@0.7.0: {}
-
- check-more-types@2.24.0: {}
-
- chokidar@3.6.0:
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
-
- chownr@1.1.4: {}
-
- chownr@3.0.0:
- optional: true
-
- ci-info@2.0.0: {}
-
- ci-info@3.9.0: {}
-
- cjson@0.3.3:
- dependencies:
- json-parse-helpfulerror: 1.0.3
+ ci-info@4.3.1: {}
clean-stack@2.2.0: {}
- cli-boxes@2.2.1: {}
-
- cli-color@1.4.0:
- dependencies:
- ansi-regex: 2.1.1
- d: 1.0.2
- es5-ext: 0.10.64
- es6-iterator: 2.0.3
- memoizee: 0.4.17
- timers-ext: 0.1.8
-
- cli-cursor@2.1.0:
- dependencies:
- restore-cursor: 2.0.0
-
cli-cursor@3.1.0:
dependencies:
restore-cursor: 3.1.0
- cli-spinners@2.9.2: {}
-
- cli-table3@0.6.5:
+ cli-table3@0.6.1:
dependencies:
string-width: 4.2.3
optionalDependencies:
- '@colors/colors': 1.5.0
-
- cli-table@0.3.11:
- dependencies:
- colors: 1.0.3
+ colors: 1.4.0
cli-truncate@2.1.0:
dependencies:
@@ -6228,68 +3667,32 @@ snapshots:
slice-ansi: 5.0.0
string-width: 5.1.2
- cli-width@2.2.1: {}
-
client-only@0.0.1: {}
- cliui@7.0.4:
- dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
-
cliui@8.0.1:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
- clone-response@1.0.3:
- dependencies:
- mimic-response: 1.0.1
-
- clone@1.0.4: {}
-
clsx@2.1.1: {}
- color-convert@1.9.3:
- dependencies:
- color-name: 1.1.3
-
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- color-convert@3.1.2:
- dependencies:
- color-name: 2.0.2
-
- color-name@1.1.3: {}
-
color-name@1.1.4: {}
- color-name@2.0.2: {}
-
- color-string@2.1.2:
- dependencies:
- color-name: 2.0.2
-
- color@5.0.2:
- dependencies:
- color-convert: 3.1.2
- color-string: 2.1.2
-
colorette@2.0.20: {}
- colors@1.0.3: {}
+ colors@1.4.0:
+ optional: true
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
- commander@4.1.1: {}
-
- commander@5.1.0: {}
+ commander@6.2.1: {}
commander@7.2.0: {}
@@ -6297,124 +3700,35 @@ snapshots:
common-tags@1.8.2: {}
- compare-semver@1.1.0:
- dependencies:
- semver: 5.7.2
-
- compress-commons@4.1.2:
- dependencies:
- buffer-crc32: 0.2.13
- crc32-stream: 4.0.3
- normalize-path: 3.0.0
- readable-stream: 3.6.2
-
- compressible@2.0.18:
- dependencies:
- mime-db: 1.54.0
-
- compression@1.8.1:
- dependencies:
- bytes: 3.1.2
- compressible: 2.0.18
- debug: 2.6.9
- negotiator: 0.6.4
- on-headers: 1.1.0
- safe-buffer: 5.2.1
- vary: 1.1.2
- transitivePeerDependencies:
- - supports-color
-
- concat-map@0.0.1: {}
-
- configstore@5.0.1:
- dependencies:
- dot-prop: 5.3.0
- graceful-fs: 4.2.11
- make-dir: 3.1.0
- unique-string: 2.0.0
- write-file-atomic: 3.0.3
- xdg-basedir: 4.0.0
-
- connect@3.7.0:
- dependencies:
- debug: 2.6.9
- finalhandler: 1.1.2
- parseurl: 1.3.3
- utils-merge: 1.0.1
- transitivePeerDependencies:
- - supports-color
-
- content-disposition@0.5.4:
- dependencies:
- safe-buffer: 5.2.1
-
- content-type@1.0.5: {}
-
- cookie-signature@1.0.6: {}
-
- cookie@0.7.1: {}
-
core-util-is@1.0.2: {}
- core-util-is@1.0.3: {}
-
- cors@2.8.5:
- dependencies:
- object-assign: 4.1.1
- vary: 1.1.2
-
- crc-32@1.2.2: {}
-
- crc32-stream@4.0.3:
- dependencies:
- crc-32: 1.2.2
- readable-stream: 3.6.2
-
- cross-env@5.2.1:
- dependencies:
- cross-spawn: 6.0.6
-
- cross-spawn@6.0.6:
- dependencies:
- nice-try: 1.0.5
- path-key: 2.0.1
- semver: 5.7.2
- shebang-command: 1.2.0
- which: 1.3.1
-
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: {}
-
csstype@3.1.3: {}
csstype@3.2.3: {}
- csv-streamify@3.0.4:
- dependencies:
- through2: 2.0.1
-
- cypress@10.11.0:
+ cypress@15.8.1:
dependencies:
- '@cypress/request': 2.88.12
+ '@cypress/request': 3.0.9
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)
- '@types/node': 14.18.63
'@types/sinonjs__fake-timers': 8.1.1
'@types/sizzle': 2.3.10
+ '@types/tmp': 0.2.6
arch: 2.2.0
blob-util: 2.0.2
bluebird: 3.7.2
buffer: 5.7.1
cachedir: 2.4.0
chalk: 4.1.2
- check-more-types: 2.24.0
+ ci-info: 4.3.1
cli-cursor: 3.1.0
- cli-table3: 0.6.5
- commander: 5.1.0
+ cli-table3: 0.6.1
+ commander: 6.2.1
common-tags: 1.8.2
dayjs: 1.11.19
debug: 4.4.3(supports-color@8.1.1)
@@ -6425,65 +3739,40 @@ snapshots:
extract-zip: 2.0.1(supports-color@8.1.1)
figures: 3.2.0
fs-extra: 9.1.0
- getos: 3.2.1
- is-ci: 3.0.1
+ hasha: 5.2.2
is-installed-globally: 0.4.0
- lazy-ass: 1.6.0
listr2: 3.14.0(enquirer@2.4.1)
lodash: 4.17.21
log-symbols: 4.1.0
minimist: 1.2.8
ospath: 1.2.2
pretty-bytes: 5.6.0
+ process: 0.11.10
proxy-from-env: 1.0.0
request-progress: 3.0.0
- semver: 7.7.3
supports-color: 8.1.1
+ systeminformation: 5.28.3
tmp: 0.2.5
+ tree-kill: 1.2.2
untildify: 4.0.0
yauzl: 2.10.0
- d3-array@2.12.1:
- dependencies:
- internmap: 1.0.1
-
d3-array@3.2.4:
dependencies:
internmap: 2.0.3
- d3-collection@1.0.7: {}
-
d3-color@3.1.0: {}
- d3-contour@4.0.2:
- dependencies:
- d3-array: 3.2.4
-
d3-ease@3.0.1: {}
d3-format@3.1.0: {}
- d3-geo@3.1.1:
- dependencies:
- d3-array: 3.2.4
-
- d3-hexbin@0.2.2: {}
-
- d3-hierarchy@3.1.2: {}
-
d3-interpolate@3.0.1:
dependencies:
d3-color: 3.1.0
- d3-path@1.0.9: {}
-
d3-path@3.1.0: {}
- d3-sankey@0.12.3:
- dependencies:
- d3-array: 2.12.1
- d3-shape: 1.3.7
-
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
@@ -6492,10 +3781,6 @@ snapshots:
d3-time: 3.1.0
d3-time-format: 4.1.0
- d3-shape@1.3.7:
- dependencies:
- d3-path: 1.0.9
-
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
@@ -6510,19 +3795,10 @@ snapshots:
d3-timer@3.0.1: {}
- d3-voronoi@1.1.4: {}
-
- d@1.0.2:
- dependencies:
- es5-ext: 0.10.64
- type: 2.7.3
-
dashdash@1.14.1:
dependencies:
assert-plus: 1.0.0
- data-uri-to-buffer@3.0.1: {}
-
date-fns@2.30.0:
dependencies:
'@babel/runtime': 7.28.4
@@ -6531,20 +3807,12 @@ snapshots:
debounce@1.2.1: {}
- debug@2.6.9:
- dependencies:
- ms: 2.0.0
-
debug@3.2.7(supports-color@8.1.1):
dependencies:
ms: 2.1.3
optionalDependencies:
supports-color: 8.1.1
- debug@4.3.1:
- dependencies:
- ms: 2.1.2
-
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -6563,105 +3831,24 @@ snapshots:
decimal.js-light@2.5.1: {}
- decompress-response@3.3.0:
- dependencies:
- mimic-response: 1.0.1
-
- deep-equal@1.1.2:
- dependencies:
- is-arguments: 1.2.0
- is-date-object: 1.1.0
- is-regex: 1.2.1
- object-is: 1.1.6
- object-keys: 1.1.1
- regexp.prototype.flags: 1.5.4
-
- deep-equal@2.2.3:
- dependencies:
- array-buffer-byte-length: 1.0.2
- call-bind: 1.0.8
- es-get-iterator: 1.1.3
- get-intrinsic: 1.3.0
- is-arguments: 1.2.0
- is-array-buffer: 3.0.5
- is-date-object: 1.1.0
- is-regex: 1.2.1
- is-shared-array-buffer: 1.0.4
- isarray: 2.0.5
- object-is: 1.1.6
- object-keys: 1.1.1
- object.assign: 4.1.7
- regexp.prototype.flags: 1.5.4
- side-channel: 1.1.0
- which-boxed-primitive: 1.1.1
- which-collection: 1.0.2
- which-typed-array: 1.1.19
-
- deep-extend@0.6.0: {}
-
- deep-freeze@0.0.1: {}
-
- deep-is@0.1.4: {}
-
deepmerge@2.2.1: {}
- defaults@1.0.4:
- dependencies:
- clone: 1.0.4
-
- defer-to-connect@1.1.3: {}
-
- define-data-property@1.1.4:
- dependencies:
- es-define-property: 1.0.1
- es-errors: 1.3.0
- gopd: 1.2.0
-
- define-properties@1.2.1:
- dependencies:
- define-data-property: 1.1.4
- has-property-descriptors: 1.0.2
- object-keys: 1.1.1
-
- degenerator@3.0.4:
- dependencies:
- ast-types: 0.13.4
- escodegen: 1.14.3
- esprima: 4.0.1
- vm2: 3.10.0
-
delayed-stream@1.0.0: {}
- depd@2.0.0: {}
-
- destroy@1.2.0: {}
+ dequal@2.0.3: {}
detect-libc@2.1.2: {}
dom-accessibility-api@0.5.16: {}
- dom-walk@0.1.2: {}
-
- dot-prop@5.3.0:
- dependencies:
- is-obj: 2.0.0
-
dotenv@17.2.3: {}
- dotenv@6.2.0: {}
-
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
es-errors: 1.3.0
gopd: 1.2.0
- duplexer2@0.1.4:
- dependencies:
- readable-stream: 2.3.8
-
- duplexer3@0.1.5: {}
-
duplexer@0.1.2: {}
duplexify@4.1.3:
@@ -6670,6 +3857,7 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
stream-shift: 1.0.3
+ optional: true
eastasianwidth@0.2.0: {}
@@ -6682,20 +3870,12 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
- ee-first@1.1.1: {}
-
electron-to-chromium@1.5.267: {}
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
- enabled@2.0.0: {}
-
- encodeurl@1.0.2: {}
-
- encodeurl@2.0.0: {}
-
encoding@0.1.13:
dependencies:
iconv-lite: 0.6.3
@@ -6715,29 +3895,11 @@ snapshots:
ansi-colors: 4.1.3
strip-ansi: 6.0.1
- env-paths@2.2.1:
- optional: true
-
- err-code@2.0.3:
- optional: true
-
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
- es-get-iterator@1.1.3:
- dependencies:
- call-bind: 1.0.8
- get-intrinsic: 1.3.0
- has-symbols: 1.1.0
- is-arguments: 1.2.0
- is-map: 2.0.3
- is-set: 2.0.3
- is-string: 1.1.1
- isarray: 2.0.5
- stop-iteration-iterator: 1.1.0
-
- es-object-atoms@1.1.1:
+ es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
@@ -6747,82 +3909,22 @@ snapshots:
get-intrinsic: 1.3.0
has-tostringtag: 1.0.2
hasown: 2.0.2
- optional: true
es-toolkit@1.43.0: {}
- es5-ext@0.10.64:
- dependencies:
- es6-iterator: 2.0.3
- es6-symbol: 3.1.4
- esniff: 2.0.1
- next-tick: 1.1.0
-
- es6-iterator@2.0.3:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- es6-symbol: 3.1.4
-
- es6-symbol@3.1.4:
- dependencies:
- d: 1.0.2
- ext: 1.7.0
-
- es6-weak-map@2.0.3:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- es6-iterator: 2.0.3
- es6-symbol: 3.1.4
-
escalade@3.2.0: {}
- escape-goat@2.1.1: {}
-
- escape-html@1.0.3: {}
-
escape-string-regexp@1.0.5: {}
escape-string-regexp@4.0.0: {}
- escodegen@1.14.3:
- dependencies:
- esprima: 4.0.1
- estraverse: 4.3.0
- esutils: 2.0.3
- optionator: 0.8.3
- optionalDependencies:
- source-map: 0.6.1
-
- esniff@2.0.1:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- event-emitter: 0.3.5
- type: 2.7.3
-
- esprima@4.0.1: {}
-
- estraverse@4.3.0: {}
-
- esutils@2.0.3: {}
-
- etag@1.8.1: {}
-
- event-emitter@0.3.5:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
-
- event-target-shim@5.0.1: {}
+ event-target-shim@5.0.1:
+ optional: true
eventemitter2@6.4.7: {}
eventemitter3@5.0.1: {}
- events-listener@1.1.0: {}
-
execa@4.1.0:
dependencies:
cross-spawn: 7.0.6
@@ -6851,86 +3953,8 @@ snapshots:
dependencies:
pify: 2.3.0
- exegesis-express@2.0.1:
- dependencies:
- exegesis: 2.5.7
- transitivePeerDependencies:
- - supports-color
-
- exegesis@2.5.7:
- dependencies:
- '@apidevtools/json-schema-ref-parser': 9.1.2
- ajv: 6.12.6
- body-parser: 1.20.3
- content-type: 1.0.5
- deep-freeze: 0.0.1
- events-listener: 1.1.0
- glob: 7.2.3
- json-ptr: 2.2.0
- json-schema-traverse: 1.0.0
- lodash: 4.17.21
- openapi3-ts: 2.0.2
- promise-breaker: 5.0.0
- pump: 3.0.3
- qs: 6.14.0
- raw-body: 2.5.2
- semver: 7.7.3
- transitivePeerDependencies:
- - supports-color
-
- exit-code@1.0.2: {}
-
- exponential-backoff@3.1.3:
- optional: true
-
- express@4.21.2:
- dependencies:
- accepts: 1.3.8
- array-flatten: 1.1.1
- body-parser: 1.20.3
- content-disposition: 0.5.4
- content-type: 1.0.5
- cookie: 0.7.1
- cookie-signature: 1.0.6
- debug: 2.6.9
- depd: 2.0.0
- encodeurl: 2.0.0
- escape-html: 1.0.3
- etag: 1.8.1
- finalhandler: 1.3.1
- fresh: 0.5.2
- http-errors: 2.0.0
- merge-descriptors: 1.0.3
- methods: 1.1.2
- on-finished: 2.4.1
- parseurl: 1.3.3
- path-to-regexp: 0.1.12
- proxy-addr: 2.0.7
- qs: 6.13.0
- range-parser: 1.2.1
- safe-buffer: 5.2.1
- send: 0.19.0
- serve-static: 1.16.2
- setprototypeof: 1.2.0
- statuses: 2.0.1
- type-is: 1.6.18
- utils-merge: 1.0.1
- vary: 1.1.2
- transitivePeerDependencies:
- - supports-color
-
- ext@1.7.0:
- dependencies:
- type: 2.7.3
-
extend@3.0.2: {}
- external-editor@3.1.0:
- dependencies:
- chardet: 0.7.0
- iconv-lite: 0.4.24
- tmp: 0.0.33
-
extract-zip@2.0.1(supports-color@8.1.1):
dependencies:
debug: 4.4.3(supports-color@8.1.1)
@@ -6945,17 +3969,8 @@ snapshots:
farmhash-modern@1.1.0: {}
- fast-deep-equal@3.1.3: {}
-
- fast-json-stable-stringify@2.1.0: {}
-
- fast-levenshtein@2.0.6: {}
-
- fast-text-encoding@1.0.6: {}
-
- fast-url-parser@1.1.3:
- dependencies:
- punycode: 1.4.1
+ fast-deep-equal@3.1.3:
+ optional: true
fast-xml-parser@4.5.3:
dependencies:
@@ -6970,53 +3985,14 @@ snapshots:
dependencies:
pend: 1.2.0
- fdir@6.5.0(picomatch@4.0.3):
- optionalDependencies:
- picomatch: 4.0.3
- optional: true
-
- fecha@4.2.3: {}
-
- figures@2.0.0:
- dependencies:
- escape-string-regexp: 1.0.5
-
figures@3.2.0:
dependencies:
escape-string-regexp: 1.0.5
- file-uri-to-path@2.0.0: {}
-
- filesize@6.4.0: {}
-
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
- finalhandler@1.1.2:
- dependencies:
- debug: 2.6.9
- encodeurl: 1.0.2
- escape-html: 1.0.3
- on-finished: 2.3.0
- parseurl: 1.3.3
- statuses: 1.5.0
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
-
- finalhandler@1.3.1:
- dependencies:
- debug: 2.6.9
- encodeurl: 2.0.0
- escape-html: 1.0.3
- on-finished: 2.4.1
- parseurl: 1.3.3
- statuses: 2.0.1
- unpipe: 1.0.0
- transitivePeerDependencies:
- - supports-color
-
firebase-admin@12.7.0(encoding@0.1.13):
dependencies:
'@fastify/busboy': 3.2.0
@@ -7035,72 +4011,6 @@ snapshots:
- encoding
- supports-color
- firebase-tools@9.23.3(encoding@0.1.13):
- dependencies:
- '@google-cloud/pubsub': 2.19.4(encoding@0.1.13)
- '@types/archiver': 5.3.4
- JSONStream: 1.3.5
- abort-controller: 3.0.0
- ajv: 6.12.6
- archiver: 5.3.2
- body-parser: 1.20.3
- chokidar: 3.6.0
- cjson: 0.3.3
- cli-color: 1.4.0
- cli-table: 0.3.11
- commander: 4.1.1
- configstore: 5.0.1
- cors: 2.8.5
- cross-env: 5.2.1
- cross-spawn: 7.0.6
- csv-streamify: 3.0.4
- dotenv: 6.2.0
- exegesis: 2.5.7
- exegesis-express: 2.0.1
- exit-code: 1.0.2
- express: 4.21.2
- filesize: 6.4.0
- fs-extra: 5.0.0
- glob: 7.2.3
- google-auth-library: 6.1.6(encoding@0.1.13)
- inquirer: 6.3.1
- js-yaml: 3.14.1
- jsonwebtoken: 8.5.1
- leven: 3.1.0
- lodash: 4.17.21
- marked: 0.7.0
- marked-terminal: 3.3.0(marked@0.7.0)
- mime: 2.6.0
- minimatch: 3.1.2
- morgan: 1.10.1
- node-fetch: 2.7.0(encoding@0.1.13)
- open: 6.4.0
- ora: 3.4.0
- portfinder: 1.0.38
- progress: 2.0.3
- proxy-agent: 5.0.0
- request: 2.88.2
- rimraf: 3.0.2
- semver: 5.7.2
- superstatic: 7.1.0
- tar: 4.4.19
- tcp-port-used: 1.0.2
- tmp: 0.0.33
- triple-beam: 1.4.1
- tweetsodium: 0.0.5
- universal-analytics: 0.4.23
- unzipper: 0.10.14
- update-notifier: 5.1.0
- uuid: 8.3.2
- winston: 3.18.3
- winston-transport: 4.9.0
- ws: 7.5.10
- transitivePeerDependencies:
- - bufferutil
- - encoding
- - supports-color
- - utf-8-validate
-
firebase@12.7.0:
dependencies:
'@firebase/ai': 2.6.1(@firebase/app-types@0.9.3)(@firebase/app@0.14.6)
@@ -7134,42 +4044,25 @@ snapshots:
transitivePeerDependencies:
- '@react-native-async-storage/async-storage'
- flat-arguments@1.0.2:
- dependencies:
- array-flatten: 1.1.1
- as-array: 1.0.0
- lodash.isarguments: 3.1.0
- lodash.isobject: 3.0.2
-
- fn.name@1.1.0: {}
-
- for-each@0.3.5:
- dependencies:
- is-callable: 1.2.7
-
- foreground-child@3.3.1:
- dependencies:
- cross-spawn: 7.0.6
- signal-exit: 4.1.0
- optional: true
-
forever-agent@0.6.1: {}
- form-data@2.3.3:
+ 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
+ optional: true
- form-data@2.5.5:
+ form-data@4.0.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
- optional: true
formik@2.4.9(@types/react@18.3.27)(react@18.3.1):
dependencies:
@@ -7185,26 +4078,8 @@ snapshots:
transitivePeerDependencies:
- '@types/react'
- forwarded@0.2.0: {}
-
fraction.js@5.3.4: {}
- fresh@0.5.2: {}
-
- fs-constants@1.0.0: {}
-
- fs-extra@5.0.0:
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 4.0.0
- universalify: 0.1.2
-
- fs-extra@8.1.0:
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 4.0.0
- universalify: 0.1.2
-
fs-extra@9.1.0:
dependencies:
at-least-node: 1.0.0
@@ -7212,50 +4087,11 @@ snapshots:
jsonfile: 6.2.0
universalify: 2.0.1
- fs-minipass@1.2.7:
- dependencies:
- minipass: 2.9.0
-
- fs-minipass@3.0.3:
- dependencies:
- minipass: 7.1.2
- optional: true
-
- fs.realpath@1.0.0: {}
-
- fsevents@2.3.3:
- optional: true
-
- fstream@1.0.12:
- dependencies:
- graceful-fs: 4.2.11
- inherits: 2.0.4
- mkdirp: 0.5.6
- rimraf: 2.7.1
-
- ftp@0.3.10:
- dependencies:
- readable-stream: 1.1.14
- xregexp: 2.0.0
-
function-bind@1.1.2: {}
functional-red-black-tree@1.0.1:
optional: true
- functions-have-names@1.2.3: {}
-
- gaxios@4.3.3(encoding@0.1.13):
- dependencies:
- abort-controller: 3.0.0
- extend: 3.0.2
- https-proxy-agent: 5.0.1
- is-stream: 2.0.1
- node-fetch: 2.7.0(encoding@0.1.13)
- transitivePeerDependencies:
- - encoding
- - supports-color
-
gaxios@6.7.1(encoding@0.1.13):
dependencies:
extend: 3.0.2
@@ -7268,14 +4104,6 @@ snapshots:
- supports-color
optional: true
- gcp-metadata@4.3.1(encoding@0.1.13):
- dependencies:
- gaxios: 4.3.3(encoding@0.1.13)
- json-bigint: 1.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
-
gcp-metadata@6.1.1(encoding@0.1.13):
dependencies:
gaxios: 6.7.1(encoding@0.1.13)
@@ -7306,113 +4134,24 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
- get-stream@4.1.0:
- dependencies:
- pump: 3.0.3
-
get-stream@5.2.0:
dependencies:
pump: 3.0.3
get-stream@6.0.1: {}
- get-uri@3.0.2:
- dependencies:
- '@tootallnate/once': 1.1.2
- data-uri-to-buffer: 3.0.1
- debug: 4.4.3
- file-uri-to-path: 2.0.0
- fs-extra: 8.1.0
- ftp: 0.3.10
- transitivePeerDependencies:
- - supports-color
-
- getos@3.2.1:
- dependencies:
- async: 3.2.6
-
getpass@0.1.7:
dependencies:
assert-plus: 1.0.0
- glob-parent@5.1.2:
- dependencies:
- is-glob: 4.0.3
-
- glob-slash@1.0.0: {}
-
- glob-slasher@1.0.1:
- dependencies:
- glob-slash: 1.0.0
- lodash.isobject: 2.4.1
- toxic: 1.0.1
-
- glob@10.4.5:
- dependencies:
- 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
- optional: true
-
- glob@7.2.3:
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- global-dirs@2.1.0:
- dependencies:
- ini: 1.3.7
-
global-dirs@3.0.1:
dependencies:
ini: 2.0.0
- global@4.4.0:
- dependencies:
- min-document: 2.19.2
- process: 0.11.10
-
goober@2.1.18(csstype@3.1.3):
dependencies:
csstype: 3.1.3
- google-auth-library@6.1.6(encoding@0.1.13):
- dependencies:
- arrify: 2.0.1
- base64-js: 1.5.1
- ecdsa-sig-formatter: 1.0.11
- fast-text-encoding: 1.0.6
- gaxios: 4.3.3(encoding@0.1.13)
- gcp-metadata: 4.3.1(encoding@0.1.13)
- gtoken: 5.3.2(encoding@0.1.13)
- jws: 4.0.0
- lru-cache: 6.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
-
- google-auth-library@7.14.1(encoding@0.1.13):
- dependencies:
- arrify: 2.0.1
- base64-js: 1.5.1
- ecdsa-sig-formatter: 1.0.11
- fast-text-encoding: 1.0.6
- gaxios: 4.3.3(encoding@0.1.13)
- gcp-metadata: 4.3.1(encoding@0.1.13)
- gtoken: 5.3.2(encoding@0.1.13)
- jws: 4.0.0
- lru-cache: 6.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
-
google-auth-library@9.15.1(encoding@0.1.13):
dependencies:
base64-js: 1.5.1
@@ -7426,25 +4165,6 @@ snapshots:
- supports-color
optional: true
- google-gax@2.30.3(encoding@0.1.13):
- dependencies:
- '@grpc/grpc-js': 1.6.12
- '@grpc/proto-loader': 0.6.9
- '@types/long': 4.0.2
- abort-controller: 3.0.0
- duplexify: 4.1.3
- fast-text-encoding: 1.0.6
- google-auth-library: 7.14.1(encoding@0.1.13)
- is-stream-ended: 0.1.4
- node-fetch: 2.7.0(encoding@0.1.13)
- object-hash: 3.0.0
- proto3-json-serializer: 0.1.9
- protobufjs: 6.11.2
- retry-request: 4.2.2
- transitivePeerDependencies:
- - encoding
- - supports-color
-
google-gax@4.6.1(encoding@0.1.13):
dependencies:
'@grpc/grpc-js': 1.14.1
@@ -7467,39 +4187,10 @@ snapshots:
google-logging-utils@0.0.2:
optional: true
- google-p12-pem@3.1.4:
- dependencies:
- node-forge: 1.3.1
-
gopd@1.2.0: {}
- got@9.6.0:
- dependencies:
- '@sindresorhus/is': 0.14.0
- '@szmarczak/http-timer': 1.1.2
- '@types/keyv': 3.1.4
- '@types/responselike': 1.0.3
- cacheable-request: 6.1.0
- decompress-response: 3.3.0
- duplexer3: 0.1.5
- get-stream: 4.1.0
- lowercase-keys: 1.0.1
- mimic-response: 1.0.1
- p-cancelable: 1.1.0
- to-readable-stream: 1.0.0
- url-parse-lax: 3.0.0
-
graceful-fs@4.2.11: {}
- gtoken@5.3.2(encoding@0.1.13):
- dependencies:
- gaxios: 4.3.3(encoding@0.1.13)
- google-p12-pem: 3.1.4
- jws: 4.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
-
gtoken@7.1.0(encoding@0.1.13):
dependencies:
gaxios: 6.7.1(encoding@0.1.13)
@@ -7513,36 +4204,18 @@ snapshots:
dependencies:
duplexer: 0.1.2
- har-schema@2.0.0: {}
-
- har-validator@5.1.5:
- dependencies:
- ajv: 6.12.6
- har-schema: 2.0.0
-
- has-ansi@2.0.0:
- dependencies:
- ansi-regex: 2.1.1
-
- has-bigints@1.1.0: {}
-
- has-flag@2.0.0: {}
-
- has-flag@3.0.0: {}
-
has-flag@4.0.0: {}
- has-property-descriptors@1.0.2:
- dependencies:
- es-define-property: 1.0.1
-
has-symbols@1.1.0: {}
has-tostringtag@1.0.2:
dependencies:
has-symbols: 1.1.0
- has-yarn@2.1.0: {}
+ hasha@5.2.2:
+ dependencies:
+ is-stream: 2.0.1
+ type-fest: 0.8.1
hasown@2.0.2:
dependencies:
@@ -7552,33 +4225,13 @@ snapshots:
dependencies:
react-is: 16.13.1
- home-dir@1.0.0: {}
-
html-entities@2.6.0:
optional: true
html-escaper@2.0.2: {}
- http-cache-semantics@4.2.0: {}
-
- 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
-
http-parser-js@0.5.10: {}
- http-proxy-agent@4.0.1:
- dependencies:
- '@tootallnate/once': 1.1.2
- agent-base: 6.0.2
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
http-proxy-agent@5.0.0:
dependencies:
'@tootallnate/once': 2.0.0
@@ -7588,21 +4241,7 @@ snapshots:
- supports-color
optional: true
- http-proxy-agent@7.0.2:
- dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- http-signature@1.2.0:
- dependencies:
- assert-plus: 1.0.0
- jsprim: 1.4.2
- sshpk: 1.18.0
-
- http-signature@1.3.6:
+ http-signature@1.4.0:
dependencies:
assert-plus: 1.0.0
jsprim: 2.0.2
@@ -7614,6 +4253,7 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
+ optional: true
https-proxy-agent@7.0.6:
dependencies:
@@ -7629,10 +4269,6 @@ snapshots:
husky@7.0.4: {}
- iconv-lite@0.4.24:
- dependencies:
- safer-buffer: 2.1.2
-
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
@@ -7646,296 +4282,65 @@ snapshots:
immer@11.1.0: {}
- import-lazy@2.1.0: {}
-
- imurmurhash@0.1.4: {}
-
indent-string@4.0.0: {}
- inflight@1.0.6:
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
+ inherits@2.0.4:
+ optional: true
- inherits@2.0.4: {}
-
- ini@1.3.7: {}
-
- ini@1.3.8: {}
-
- ini@2.0.0: {}
-
- inquirer@6.3.1:
- dependencies:
- ansi-escapes: 3.2.0
- chalk: 2.4.2
- cli-cursor: 2.1.0
- cli-width: 2.2.1
- external-editor: 3.1.0
- figures: 2.0.0
- lodash: 4.17.21
- mute-stream: 0.0.7
- run-async: 2.4.1
- rxjs: 6.6.7
- string-width: 2.1.1
- strip-ansi: 5.2.0
- through: 2.3.8
-
- install-artifact-from-github@1.4.0:
- optional: true
-
- internal-slot@1.1.0:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.1.0
-
- internmap@1.0.1: {}
+ ini@2.0.0: {}
internmap@2.0.3: {}
- ip-address@10.1.0: {}
-
- ip-regex@4.3.0: {}
-
- ip@1.1.9: {}
-
- ipaddr.js@1.9.1: {}
-
- is-arguments@1.2.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-array-buffer@3.0.5:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-bigint@1.1.0:
- dependencies:
- has-bigints: 1.1.0
-
- is-binary-path@2.1.0:
- dependencies:
- binary-extensions: 2.3.0
-
- is-boolean-object@1.2.2:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-callable@1.2.7: {}
-
- is-ci@2.0.0:
- dependencies:
- ci-info: 2.0.0
-
- is-ci@3.0.1:
- dependencies:
- ci-info: 3.9.0
-
- is-date-object@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-extglob@2.1.1: {}
-
- is-fullwidth-code-point@2.0.0: {}
-
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@4.0.0: {}
- is-glob@4.0.3:
- dependencies:
- is-extglob: 2.1.1
-
- is-installed-globally@0.3.2:
- dependencies:
- global-dirs: 2.1.0
- is-path-inside: 3.0.3
-
is-installed-globally@0.4.0:
dependencies:
global-dirs: 3.0.1
is-path-inside: 3.0.3
- is-map@2.0.3: {}
-
- is-npm@4.0.0: {}
-
- is-npm@5.0.0: {}
-
- is-number-object@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
is-number@7.0.0: {}
- is-obj@2.0.0: {}
-
is-path-inside@3.0.3: {}
is-plain-object@5.0.0: {}
- is-promise@2.2.2: {}
-
- is-regex@1.2.1:
- dependencies:
- call-bound: 1.0.4
- gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- is-set@2.0.3: {}
-
- is-shared-array-buffer@1.0.4:
- dependencies:
- call-bound: 1.0.4
-
- is-stream-ended@0.1.4: {}
-
is-stream@2.0.1: {}
- is-string@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-symbol@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
-
is-typedarray@1.0.0: {}
is-unicode-supported@0.1.0: {}
- is-url@1.2.4: {}
-
- is-weakmap@2.0.2: {}
-
- is-weakset@2.0.4:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-wsl@1.1.0: {}
-
- is-yarn-global@0.3.0: {}
-
- is2@2.0.9:
- dependencies:
- deep-is: 0.1.4
- ip-regex: 4.3.0
- is-url: 1.2.4
-
- isarray@0.0.1: {}
-
- isarray@1.0.0: {}
-
- isarray@2.0.5: {}
-
isexe@2.0.0: {}
- isexe@3.1.1:
- optional: true
-
- isomorphic-unfetch@3.1.0(encoding@0.1.13):
- dependencies:
- node-fetch: 2.7.0(encoding@0.1.13)
- unfetch: 4.2.0
- transitivePeerDependencies:
- - encoding
-
isstream@0.1.2: {}
- jackspeak@3.4.3:
- dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
- optional: true
-
jiti@2.6.1: {}
- jju@1.4.0: {}
-
- join-path@1.1.1:
- dependencies:
- as-array: 2.0.0
- url-join: 0.0.1
- valid-url: 1.0.9
-
jose@4.15.9: {}
js-cookie@2.2.1: {}
js-tokens@4.0.0: {}
- js-yaml@3.14.1:
- dependencies:
- argparse: 1.0.10
- esprima: 4.0.1
-
- js-yaml@4.1.0:
- dependencies:
- argparse: 2.0.1
-
jsbn@0.1.1: {}
json-bigint@1.0.0:
dependencies:
bignumber.js: 9.3.1
-
- json-buffer@3.0.0: {}
-
- json-parse-helpfulerror@1.0.3:
- dependencies:
- jju: 1.4.0
-
- json-ptr@2.2.0:
- dependencies:
- tslib: 2.8.1
-
- json-schema-traverse@0.4.1: {}
-
- json-schema-traverse@1.0.0: {}
+ optional: true
json-schema@0.4.0: {}
json-stringify-safe@5.0.1: {}
- jsonfile@4.0.0:
- optionalDependencies:
- graceful-fs: 4.2.11
-
jsonfile@6.2.0:
dependencies:
universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
- jsonparse@1.3.1: {}
-
- jsonwebtoken@8.5.1:
- dependencies:
- jws: 3.2.2
- lodash.includes: 4.3.0
- lodash.isboolean: 3.0.3
- lodash.isinteger: 4.0.4
- lodash.isnumber: 3.0.3
- lodash.isplainobject: 4.0.6
- lodash.isstring: 4.0.1
- lodash.once: 4.1.1
- ms: 2.1.3
- semver: 5.7.2
-
jsonwebtoken@9.0.3:
dependencies:
jws: 4.0.1
@@ -7949,13 +4354,6 @@ snapshots:
ms: 2.1.3
semver: 7.7.3
- jsprim@1.4.2:
- dependencies:
- assert-plus: 1.0.0
- extsprintf: 1.3.0
- json-schema: 0.4.0
- verror: 1.10.0
-
jsprim@2.0.2:
dependencies:
assert-plus: 1.0.0
@@ -7963,12 +4361,6 @@ snapshots:
json-schema: 0.4.0
verror: 1.10.0
- jwa@1.4.2:
- dependencies:
- buffer-equal-constant-time: 1.0.1
- ecdsa-sig-formatter: 1.0.11
- safe-buffer: 5.2.1
-
jwa@2.0.1:
dependencies:
buffer-equal-constant-time: 1.0.1
@@ -7986,44 +4378,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
- jws@3.2.2:
- dependencies:
- jwa: 1.4.2
- safe-buffer: 5.2.1
-
jws@4.0.0:
dependencies:
jwa: 2.0.1
safe-buffer: 5.2.1
+ optional: true
jws@4.0.1:
dependencies:
jwa: 2.0.1
safe-buffer: 5.2.1
- keyv@3.1.0:
- dependencies:
- json-buffer: 3.0.0
-
- kuler@2.0.0: {}
-
- latest-version@5.1.0:
- dependencies:
- package-json: 6.5.0
-
- lazy-ass@1.6.0: {}
-
- lazystream@1.0.1:
- dependencies:
- readable-stream: 2.3.8
-
- leven@3.1.0: {}
-
- levn@0.3.0:
- dependencies:
- prelude-ls: 1.1.2
- type-check: 0.3.2
-
lightningcss-android-arm64@1.30.2:
optional: true
@@ -8096,8 +4461,6 @@ snapshots:
transitivePeerDependencies:
- enquirer
- listenercount@1.0.1: {}
-
listr2@3.14.0(enquirer@2.4.1):
dependencies:
cli-truncate: 2.1.0
@@ -8126,68 +4489,26 @@ snapshots:
lodash-es@4.17.21: {}
- lodash._isnative@2.4.1: {}
-
- lodash._objecttypes@2.4.1: {}
-
- lodash._shimkeys@2.4.1:
- dependencies:
- lodash._objecttypes: 2.4.1
-
lodash.camelcase@4.3.0: {}
lodash.clonedeep@4.5.0: {}
- lodash.defaults@4.2.0: {}
-
- lodash.difference@4.5.0: {}
-
- lodash.flatten@4.4.0: {}
-
lodash.includes@4.3.0: {}
- lodash.isarguments@2.4.1: {}
-
- lodash.isarguments@3.1.0: {}
-
lodash.isboolean@3.0.3: {}
lodash.isinteger@4.0.4: {}
lodash.isnumber@3.0.3: {}
- lodash.isobject@2.4.1:
- dependencies:
- lodash._objecttypes: 2.4.1
-
- lodash.isobject@3.0.2: {}
-
lodash.isplainobject@4.0.6: {}
lodash.isstring@4.0.1: {}
- lodash.keys@2.4.1:
- dependencies:
- lodash._isnative: 2.4.1
- lodash._shimkeys: 2.4.1
- lodash.isobject: 2.4.1
-
lodash.once@4.1.1: {}
- lodash.snakecase@4.1.1: {}
-
- lodash.union@4.6.0: {}
-
- lodash.values@2.4.1:
- dependencies:
- lodash.keys: 2.4.1
-
lodash@4.17.21: {}
- log-symbols@2.2.0:
- dependencies:
- chalk: 2.4.2
-
log-symbols@4.1.0:
dependencies:
chalk: 4.1.2
@@ -8200,34 +4521,12 @@ snapshots:
slice-ansi: 4.0.0
wrap-ansi: 6.2.0
- logform@2.7.0:
- dependencies:
- '@colors/colors': 1.6.0
- '@types/triple-beam': 1.3.5
- fecha: 4.2.3
- ms: 2.1.3
- safe-stable-stringify: 2.5.0
- triple-beam: 1.4.1
-
- long@4.0.0: {}
-
long@5.3.2: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
- lowercase-keys@1.0.1: {}
-
- lowercase-keys@2.0.0: {}
-
- lru-cache@10.4.3:
- optional: true
-
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
-
lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
@@ -8237,70 +4536,16 @@ snapshots:
lodash.clonedeep: 4.5.0
lru-cache: 6.0.0
- lru-queue@0.1.0:
- dependencies:
- es5-ext: 0.10.64
-
lz-string@1.5.0: {}
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
- make-dir@3.1.0:
- dependencies:
- semver: 6.3.1
-
- make-fetch-happen@14.0.3:
- dependencies:
- '@npmcli/agent': 3.0.0
- cacache: 19.0.1
- http-cache-semantics: 4.2.0
- minipass: 7.1.2
- minipass-fetch: 4.0.1
- minipass-flush: 1.0.5
- minipass-pipeline: 1.2.4
- negotiator: 1.0.0
- proc-log: 5.0.0
- promise-retry: 2.0.1
- ssri: 12.0.0
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- marked-terminal@3.3.0(marked@0.7.0):
- dependencies:
- ansi-escapes: 3.2.0
- cardinal: 2.1.1
- chalk: 2.4.2
- cli-table: 0.3.11
- marked: 0.7.0
- node-emoji: 1.11.0
- supports-hyperlinks: 1.0.1
-
- marked@0.7.0: {}
-
math-intrinsics@1.1.0: {}
- media-typer@0.3.0: {}
-
- memoizee@0.4.17:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- es6-weak-map: 2.0.3
- event-emitter: 0.3.5
- is-promise: 2.2.2
- lru-queue: 0.1.0
- next-tick: 1.1.0
- timers-ext: 0.1.8
-
- merge-descriptors@1.0.3: {}
-
merge-stream@2.0.0: {}
- methods@1.1.2: {}
-
micromatch@4.0.8:
dependencies:
braces: 3.0.3
@@ -8308,142 +4553,23 @@ snapshots:
mime-db@1.52.0: {}
- mime-db@1.54.0: {}
-
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
- mime@1.6.0: {}
-
- mime@2.6.0: {}
-
mime@3.0.0:
optional: true
- mimic-fn@1.2.0: {}
-
mimic-fn@2.1.0: {}
- mimic-response@1.0.1: {}
-
- min-document@2.19.2:
- dependencies:
- dom-walk: 0.1.2
-
- minimatch@3.1.2:
- dependencies:
- brace-expansion: 1.1.12
-
- minimatch@5.1.6:
- dependencies:
- brace-expansion: 2.0.2
-
- minimatch@9.0.5:
- dependencies:
- brace-expansion: 2.0.2
- optional: true
-
minimist@1.2.8: {}
- minipass-collect@2.0.1:
- dependencies:
- minipass: 7.1.2
- optional: true
-
- minipass-fetch@4.0.1:
- dependencies:
- minipass: 7.1.2
- minipass-sized: 1.0.3
- minizlib: 3.1.0
- optionalDependencies:
- encoding: 0.1.13
- optional: true
-
- minipass-flush@1.0.5:
- dependencies:
- minipass: 3.3.6
- optional: true
-
- minipass-pipeline@1.2.4:
- dependencies:
- minipass: 3.3.6
- optional: true
-
- minipass-sized@1.0.3:
- dependencies:
- minipass: 3.3.6
- optional: true
-
- minipass@2.9.0:
- dependencies:
- safe-buffer: 5.2.1
- yallist: 3.1.1
-
- minipass@3.3.6:
- dependencies:
- yallist: 4.0.0
- optional: true
-
- minipass@7.1.2:
- optional: true
-
- minizlib@1.3.3:
- dependencies:
- minipass: 2.9.0
-
- minizlib@3.1.0:
- dependencies:
- minipass: 7.1.2
- optional: true
-
- mkdirp@0.5.6:
- dependencies:
- minimist: 1.2.8
-
- morgan@1.10.1:
- dependencies:
- basic-auth: 2.0.1
- debug: 2.6.9
- depd: 2.0.0
- on-finished: 2.3.0
- on-headers: 1.1.0
- transitivePeerDependencies:
- - supports-color
-
mrmime@2.0.1: {}
- ms@2.0.0: {}
-
- ms@2.1.2: {}
-
ms@2.1.3: {}
- mute-stream@0.0.7: {}
-
- nan@2.23.1:
- optional: true
-
nanoid@3.3.11: {}
- nash@3.0.0:
- dependencies:
- async: 1.5.2
- flat-arguments: 1.0.2
- lodash: 4.17.21
- minimist: 1.2.8
-
- negotiator@0.6.3: {}
-
- negotiator@0.6.4: {}
-
- negotiator@1.0.0:
- optional: true
-
- netmask@2.0.2: {}
-
- next-tick@1.1.0: {}
-
next@16.1.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 16.1.1
@@ -8469,137 +4595,42 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
- nice-try@1.0.5: {}
-
- node-emoji@1.11.0:
- dependencies:
- lodash: 4.17.21
-
node-fetch@2.7.0(encoding@0.1.13):
dependencies:
whatwg-url: 5.0.0
optionalDependencies:
encoding: 0.1.13
+ optional: true
node-forge@1.3.1: {}
- node-gyp@11.5.0:
- dependencies:
- env-paths: 2.2.1
- exponential-backoff: 3.1.3
- graceful-fs: 4.2.11
- make-fetch-happen: 14.0.3
- nopt: 8.1.0
- proc-log: 5.0.0
- semver: 7.7.3
- tar: 7.5.2
- tinyglobby: 0.2.15
- which: 5.0.0
- transitivePeerDependencies:
- - supports-color
- optional: true
-
node-releases@2.0.27: {}
- nopt@8.1.0:
- dependencies:
- abbrev: 3.0.1
- optional: true
-
normalize-path@3.0.0: {}
- normalize-url@4.5.1: {}
-
npm-run-path@4.0.1:
dependencies:
path-key: 3.1.1
- oauth-sign@0.9.0: {}
-
object-assign@4.1.1: {}
- object-hash@3.0.0: {}
+ object-hash@3.0.0:
+ optional: true
object-inspect@1.13.4: {}
- object-is@1.1.6:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
-
- object-keys@1.1.1: {}
-
- object.assign@4.1.7:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
- has-symbols: 1.1.0
- object-keys: 1.1.1
-
- on-finished@2.3.0:
- dependencies:
- ee-first: 1.1.1
-
- on-finished@2.4.1:
- dependencies:
- ee-first: 1.1.1
-
- on-headers@1.1.0: {}
-
once@1.4.0:
dependencies:
wrappy: 1.0.2
- one-time@1.0.0:
- dependencies:
- fn.name: 1.1.0
-
- onetime@2.0.1:
- dependencies:
- mimic-fn: 1.2.0
-
onetime@5.1.2:
dependencies:
mimic-fn: 2.1.0
- open@6.4.0:
- dependencies:
- is-wsl: 1.1.0
-
- openapi3-ts@2.0.2:
- dependencies:
- yaml: 1.10.2
-
opener@1.5.2: {}
- optionator@0.8.3:
- dependencies:
- deep-is: 0.1.4
- fast-levenshtein: 2.0.6
- levn: 0.3.0
- prelude-ls: 1.1.2
- type-check: 0.3.2
- word-wrap: 1.2.5
-
- ora@3.4.0:
- dependencies:
- chalk: 2.4.2
- cli-cursor: 2.1.0
- cli-spinners: 2.9.2
- log-symbols: 2.2.0
- strip-ansi: 5.2.0
- wcwidth: 1.0.1
-
- os-tmpdir@1.0.2: {}
-
ospath@1.2.2: {}
- p-cancelable@1.1.0: {}
-
- p-defer@3.0.0: {}
-
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
@@ -8609,87 +4640,20 @@ snapshots:
dependencies:
aggregate-error: 3.1.0
- p-map@7.0.4:
- optional: true
-
- pac-proxy-agent@5.0.0:
- dependencies:
- '@tootallnate/once': 1.1.2
- agent-base: 6.0.2
- debug: 4.4.3
- get-uri: 3.0.2
- http-proxy-agent: 4.0.1
- https-proxy-agent: 5.0.1
- pac-resolver: 5.0.1
- raw-body: 2.5.2
- socks-proxy-agent: 5.0.1
- transitivePeerDependencies:
- - supports-color
-
- pac-resolver@5.0.1:
- dependencies:
- degenerator: 3.0.4
- ip: 1.1.9
- netmask: 2.0.2
-
- package-json-from-dist@1.0.1:
- optional: true
-
- package-json@6.5.0:
- dependencies:
- got: 9.6.0
- registry-auth-token: 4.2.2
- registry-url: 5.1.0
- semver: 6.3.1
-
- parseurl@1.3.3: {}
-
- path-is-absolute@1.0.1: {}
-
- path-key@2.0.1: {}
-
path-key@3.1.1: {}
- path-scurry@1.11.1:
- dependencies:
- lru-cache: 10.4.3
- minipass: 7.1.2
- optional: true
-
- path-to-regexp@0.1.12: {}
-
- path-to-regexp@0.1.7: {}
-
- path-to-regexp@1.9.0:
- dependencies:
- isarray: 0.0.1
-
pend@1.2.0: {}
- performance-now@0.2.0: {}
-
performance-now@2.1.0: {}
picocolors@1.1.1: {}
picomatch@2.3.1: {}
- picomatch@4.0.3:
- optional: true
-
pidtree@0.5.0: {}
pify@2.3.0: {}
- portfinder@1.0.38:
- dependencies:
- async: 3.2.6
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
- possible-typed-array-names@1.1.0: {}
-
postcss-value-parser@4.2.0: {}
postcss@8.4.31:
@@ -8704,10 +4668,6 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- prelude-ls@1.1.2: {}
-
- prepend-http@2.0.0: {}
-
pretty-bytes@5.6.0: {}
pretty-format@27.5.1:
@@ -8716,56 +4676,19 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
- proc-log@5.0.0:
- optional: true
-
- process-nextick-args@1.0.7: {}
-
- process-nextick-args@2.0.1: {}
-
process@0.11.10: {}
- progress@2.0.3: {}
-
- promise-breaker@5.0.0: {}
-
- promise-retry@2.0.1:
- dependencies:
- err-code: 2.0.3
- retry: 0.12.0
- optional: true
-
prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
- proto3-json-serializer@0.1.9:
- dependencies:
- protobufjs: 6.11.2
-
proto3-json-serializer@2.0.2:
dependencies:
protobufjs: 7.5.4
optional: true
- protobufjs@6.11.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.19.24
- long: 4.0.0
-
protobufjs@7.5.4:
dependencies:
'@protobufjs/aspromise': 1.1.2
@@ -8781,92 +4704,19 @@ snapshots:
'@types/node': 20.19.24
long: 5.3.2
- proxy-addr@2.0.7:
- dependencies:
- forwarded: 0.2.0
- ipaddr.js: 1.9.1
-
- proxy-agent@5.0.0:
- dependencies:
- agent-base: 6.0.2
- debug: 4.4.3
- http-proxy-agent: 4.0.1
- https-proxy-agent: 5.0.1
- lru-cache: 5.1.1
- pac-proxy-agent: 5.0.0
- proxy-from-env: 1.1.0
- socks-proxy-agent: 5.0.1
- transitivePeerDependencies:
- - supports-color
-
proxy-from-env@1.0.0: {}
- proxy-from-env@1.1.0: {}
-
- psl@1.15.0:
- dependencies:
- punycode: 2.3.1
-
pump@3.0.3:
dependencies:
end-of-stream: 1.4.5
once: 1.4.0
- punycode@1.4.1: {}
-
- punycode@2.3.1: {}
-
- pupa@2.1.1:
- dependencies:
- escape-goat: 2.1.1
-
qr.js@0.0.0: {}
- qs@6.10.4:
- dependencies:
- side-channel: 1.1.0
-
- qs@6.13.0:
- dependencies:
- side-channel: 1.1.0
-
qs@6.14.0:
dependencies:
side-channel: 1.1.0
- qs@6.5.3: {}
-
- querystringify@2.2.0: {}
-
- raf@3.4.1:
- dependencies:
- performance-now: 2.1.0
-
- range-parser@1.2.1: {}
-
- raw-body@2.5.2:
- dependencies:
- bytes: 3.1.2
- http-errors: 2.0.0
- iconv-lite: 0.4.24
- unpipe: 1.0.0
-
- rc@1.2.8:
- dependencies:
- deep-extend: 0.6.0
- ini: 1.3.8
- minimist: 1.2.8
- strip-json-comments: 2.0.1
-
- re2@1.22.3:
- dependencies:
- install-artifact-from-github: 1.4.0
- nan: 2.23.1
- node-gyp: 11.5.0
- transitivePeerDependencies:
- - supports-color
- optional: true
-
react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
@@ -8886,13 +4736,6 @@ snapshots:
react-is@17.0.2: {}
- react-motion@0.5.2(react@18.3.1):
- dependencies:
- performance-now: 0.2.0
- prop-types: 15.8.1
- raf: 3.4.1
- react: 18.3.1
-
react-qr-code@2.0.18(react@18.3.1):
dependencies:
prop-types: 15.8.1
@@ -8908,71 +4751,16 @@ snapshots:
'@types/react': 18.3.27
redux: 5.0.1
- react-vis@1.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
- dependencies:
- d3-array: 3.2.4
- d3-collection: 1.0.7
- d3-color: 3.1.0
- d3-contour: 4.0.2
- d3-format: 3.1.0
- d3-geo: 3.1.1
- d3-hexbin: 0.2.2
- d3-hierarchy: 3.1.2
- d3-interpolate: 3.0.1
- d3-sankey: 0.12.3
- d3-scale: 4.0.2
- d3-shape: 3.2.0
- d3-voronoi: 1.1.4
- deep-equal: 1.1.2
- global: 4.4.0
- prop-types: 15.8.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-motion: 0.5.2(react@18.3.1)
-
react@18.3.1:
dependencies:
loose-envify: 1.4.0
- readable-stream@1.1.14:
- dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 0.0.1
- string_decoder: 0.10.31
-
- readable-stream@2.0.6:
- dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 1.0.0
- process-nextick-args: 1.0.7
- string_decoder: 0.10.31
- util-deprecate: 1.0.2
-
- readable-stream@2.3.8:
- dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 1.0.0
- process-nextick-args: 2.0.1
- safe-buffer: 5.1.2
- string_decoder: 1.1.1
- util-deprecate: 1.0.2
-
readable-stream@3.6.2:
dependencies:
inherits: 2.0.4
string_decoder: 1.3.0
util-deprecate: 1.0.2
-
- readdir-glob@1.1.3:
- dependencies:
- minimatch: 5.1.6
-
- readdirp@3.6.0:
- dependencies:
- picomatch: 2.3.1
+ optional: true
recharts@3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@17.0.2)(react@18.3.1)(redux@5.0.1):
dependencies:
@@ -8994,87 +4782,25 @@ snapshots:
- '@types/react'
- redux
- redeyed@2.1.1:
- dependencies:
- esprima: 4.0.1
-
redux-thunk@3.1.0(redux@5.0.1):
dependencies:
redux: 5.0.1
redux@5.0.1: {}
- regexp.prototype.flags@1.5.4:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-errors: 1.3.0
- get-proto: 1.0.1
- gopd: 1.2.0
- set-function-name: 2.0.2
-
- registry-auth-token@4.2.2:
- dependencies:
- rc: 1.2.8
-
- registry-url@5.1.0:
- dependencies:
- rc: 1.2.8
-
request-progress@3.0.0:
dependencies:
throttleit: 1.0.1
- request@2.88.2:
- dependencies:
- aws-sign2: 0.7.0
- aws4: 1.13.2
- caseless: 0.12.0
- combined-stream: 1.0.8
- extend: 3.0.2
- forever-agent: 0.6.1
- form-data: 2.3.3
- har-validator: 5.1.5
- http-signature: 1.2.0
- is-typedarray: 1.0.0
- isstream: 0.1.2
- json-stringify-safe: 5.0.1
- mime-types: 2.1.35
- oauth-sign: 0.9.0
- performance-now: 2.1.0
- qs: 6.5.3
- safe-buffer: 5.2.1
- tough-cookie: 2.5.0
- tunnel-agent: 0.6.0
- uuid: 3.4.0
-
require-directory@2.1.1: {}
- requires-port@1.0.0: {}
-
reselect@5.1.1: {}
- responselike@1.0.2:
- dependencies:
- lowercase-keys: 1.0.1
-
- restore-cursor@2.0.0:
- dependencies:
- onetime: 2.0.1
- signal-exit: 3.0.7
-
- restore-cursor@3.1.0:
- dependencies:
- onetime: 5.1.2
- signal-exit: 3.0.7
-
- retry-request@4.2.2:
- dependencies:
- debug: 4.4.3
- extend: 3.0.2
- transitivePeerDependencies:
- - supports-color
-
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
retry-request@7.0.2(encoding@0.1.13):
dependencies:
'@types/request': 2.48.13
@@ -9085,121 +4811,25 @@ snapshots:
- supports-color
optional: true
- retry@0.12.0:
- optional: true
-
retry@0.13.1:
optional: true
rfdc@1.4.1: {}
- rimraf@2.7.1:
- dependencies:
- glob: 7.2.3
-
- rimraf@3.0.2:
- dependencies:
- glob: 7.2.3
-
- router@1.3.8:
- dependencies:
- array-flatten: 3.0.0
- debug: 2.6.9
- methods: 1.1.2
- parseurl: 1.3.3
- path-to-regexp: 0.1.7
- setprototypeof: 1.2.0
- utils-merge: 1.0.1
- transitivePeerDependencies:
- - supports-color
-
- rsvp@4.8.5: {}
-
- run-async@2.4.1: {}
-
- rxjs@6.6.7:
- dependencies:
- tslib: 1.14.1
-
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
- safe-buffer@5.1.2: {}
-
safe-buffer@5.2.1: {}
- safe-regex-test@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-regex: 1.2.1
-
- safe-stable-stringify@2.5.0: {}
-
safer-buffer@2.1.2: {}
scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
- semver-diff@3.1.1:
- dependencies:
- semver: 6.3.1
-
- semver@5.7.2: {}
-
- semver@6.3.1: {}
-
semver@7.7.3: {}
- send@0.19.0:
- dependencies:
- debug: 2.6.9
- depd: 2.0.0
- destroy: 1.2.0
- encodeurl: 1.0.2
- escape-html: 1.0.3
- etag: 1.8.1
- fresh: 0.5.2
- http-errors: 2.0.0
- mime: 1.6.0
- ms: 2.1.3
- on-finished: 2.4.1
- range-parser: 1.2.1
- statuses: 2.0.1
- transitivePeerDependencies:
- - supports-color
-
- serve-static@1.16.2:
- dependencies:
- encodeurl: 2.0.0
- escape-html: 1.0.3
- parseurl: 1.3.3
- send: 0.19.0
- transitivePeerDependencies:
- - supports-color
-
- set-function-length@1.2.2:
- dependencies:
- 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
-
- set-function-name@2.0.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.2
-
- setimmediate@1.0.5: {}
-
- setprototypeof@1.2.0: {}
-
sharp@0.34.5:
dependencies:
'@img/colour': 1.0.0
@@ -9232,16 +4862,10 @@ snapshots:
'@img/sharp-win32-x64': 0.34.5
optional: true
- shebang-command@1.2.0:
- dependencies:
- shebang-regex: 1.0.0
-
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
- shebang-regex@1.0.0: {}
-
shebang-regex@3.0.0: {}
side-channel-list@1.0.0:
@@ -9274,9 +4898,6 @@ snapshots:
signal-exit@3.0.7: {}
- signal-exit@4.1.0:
- optional: true
-
sirv@2.0.4:
dependencies:
'@polka/url': 1.0.0-next.29
@@ -9300,37 +4921,8 @@ snapshots:
ansi-styles: 6.2.3
is-fullwidth-code-point: 4.0.0
- smart-buffer@4.2.0: {}
-
- socks-proxy-agent@5.0.1:
- dependencies:
- agent-base: 6.0.2
- debug: 4.4.3
- socks: 2.8.7
- transitivePeerDependencies:
- - supports-color
-
- socks-proxy-agent@8.0.5:
- dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- socks: 2.8.7
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- socks@2.8.7:
- dependencies:
- ip-address: 10.1.0
- smart-buffer: 4.2.0
-
source-map-js@1.2.1: {}
- source-map@0.6.1:
- optional: true
-
- sprintf-js@1.0.3: {}
-
sshpk@1.18.0:
dependencies:
asn1: 0.2.6
@@ -9343,40 +4935,16 @@ snapshots:
safer-buffer: 2.1.2
tweetnacl: 0.14.5
- ssri@12.0.0:
- dependencies:
- minipass: 7.1.2
- optional: true
-
- stack-trace@0.0.10: {}
-
- statuses@1.5.0: {}
-
- statuses@2.0.1: {}
-
- stop-iteration-iterator@1.1.0:
- dependencies:
- es-errors: 1.3.0
- internal-slot: 1.1.0
-
stream-events@1.0.5:
dependencies:
stubs: 3.0.0
optional: true
- stream-shift@1.0.3: {}
+ stream-shift@1.0.3:
+ optional: true
string-argv@0.3.2: {}
- string-length@1.0.1:
- dependencies:
- strip-ansi: 3.0.1
-
- string-width@2.1.1:
- dependencies:
- is-fullwidth-code-point: 2.0.0
- strip-ansi: 4.0.0
-
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -9389,27 +4957,10 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.2
- string_decoder@0.10.31: {}
-
- string_decoder@1.1.1:
- dependencies:
- safe-buffer: 5.1.2
-
string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
-
- strip-ansi@3.0.1:
- dependencies:
- ansi-regex: 2.1.1
-
- strip-ansi@4.0.0:
- dependencies:
- ansi-regex: 3.0.1
-
- strip-ansi@5.2.0:
- dependencies:
- ansi-regex: 4.1.1
+ optional: true
strip-ansi@6.0.1:
dependencies:
@@ -9421,8 +4972,6 @@ snapshots:
strip-final-newline@2.0.0: {}
- strip-json-comments@2.0.1: {}
-
strnum@1.1.2:
optional: true
@@ -9434,43 +4983,6 @@ snapshots:
client-only: 0.0.1
react: 18.3.1
- superstatic@7.1.0:
- dependencies:
- basic-auth-connect: 1.1.0
- chalk: 1.1.3
- compare-semver: 1.1.0
- compression: 1.8.1
- connect: 3.7.0
- destroy: 1.2.0
- fast-url-parser: 1.1.3
- fs-extra: 8.1.0
- glob-slasher: 1.0.1
- home-dir: 1.0.0
- is-url: 1.2.4
- join-path: 1.1.1
- lodash: 4.17.21
- mime-types: 2.1.35
- minimatch: 3.1.2
- morgan: 1.10.1
- nash: 3.0.0
- on-finished: 2.4.1
- on-headers: 1.1.0
- path-to-regexp: 1.9.0
- router: 1.3.8
- rsvp: 4.8.5
- string-length: 1.0.1
- update-notifier: 4.1.3
- optionalDependencies:
- re2: 1.22.3
- transitivePeerDependencies:
- - supports-color
-
- supports-color@2.0.0: {}
-
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
-
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -9481,10 +4993,7 @@ snapshots:
supports-color@9.4.0: {}
- supports-hyperlinks@1.0.1:
- dependencies:
- has-flag: 2.0.0
- supports-color: 5.5.0
+ systeminformation@5.28.3: {}
tailwindcss@4.0.0: {}
@@ -9492,40 +5001,6 @@ snapshots:
tapable@2.3.0: {}
- tar-stream@2.2.0:
- dependencies:
- bl: 4.1.0
- end-of-stream: 1.4.5
- fs-constants: 1.0.0
- inherits: 2.0.4
- readable-stream: 3.6.2
-
- tar@4.4.19:
- dependencies:
- chownr: 1.1.4
- fs-minipass: 1.2.7
- minipass: 2.9.0
- minizlib: 1.3.3
- mkdirp: 0.5.6
- safe-buffer: 5.2.1
- yallist: 3.1.1
-
- tar@7.5.2:
- dependencies:
- '@isaacs/fs-minipass': 4.0.1
- chownr: 3.0.0
- minipass: 7.1.2
- minizlib: 3.1.0
- yallist: 5.0.0
- optional: true
-
- tcp-port-used@1.0.2:
- dependencies:
- debug: 4.3.1
- is2: 2.0.9
- transitivePeerDependencies:
- - supports-color
-
teeny-request@9.0.0(encoding@0.1.13):
dependencies:
http-proxy-agent: 5.0.0
@@ -9538,240 +5013,79 @@ snapshots:
- supports-color
optional: true
- term-size@2.2.1: {}
-
- text-hex@1.0.0: {}
-
throttleit@1.0.1: {}
- through2@2.0.1:
- dependencies:
- readable-stream: 2.0.6
- xtend: 4.0.2
-
through@2.3.8: {}
- timers-ext@0.1.8:
- dependencies:
- es5-ext: 0.10.64
- next-tick: 1.1.0
-
tiny-invariant@1.3.3: {}
tiny-warning@1.0.3: {}
- tinyglobby@0.2.15:
- dependencies:
- fdir: 6.5.0(picomatch@4.0.3)
- picomatch: 4.0.3
- optional: true
+ tldts-core@6.1.86: {}
- tmp@0.0.33:
+ tldts@6.1.86:
dependencies:
- os-tmpdir: 1.0.2
+ tldts-core: 6.1.86
tmp@0.2.5: {}
- to-readable-stream@1.0.0: {}
-
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
- toidentifier@1.0.1: {}
-
totalist@3.0.1: {}
- tough-cookie@2.5.0:
- dependencies:
- psl: 1.15.0
- punycode: 2.3.1
-
- tough-cookie@4.1.4:
- dependencies:
- psl: 1.15.0
- punycode: 2.3.1
- universalify: 0.2.0
- url-parse: 1.5.10
-
- toxic@1.0.1:
+ tough-cookie@5.1.2:
dependencies:
- lodash: 4.17.21
-
- tr46@0.0.3: {}
-
- traverse@0.3.9: {}
+ tldts: 6.1.86
- triple-beam@1.4.1: {}
+ tr46@0.0.3:
+ optional: true
- tslib@1.14.1: {}
+ tree-kill@1.2.2: {}
tslib@2.8.1: {}
- tsscmp@1.0.6: {}
-
tunnel-agent@0.6.0:
dependencies:
safe-buffer: 5.2.1
tweetnacl@0.14.5: {}
- tweetnacl@1.0.3: {}
-
- tweetsodium@0.0.5:
- dependencies:
- blakejs: 1.2.1
- tweetnacl: 1.0.3
-
- type-check@0.3.2:
- dependencies:
- prelude-ls: 1.1.2
-
- type-fest@0.20.2: {}
-
type-fest@0.21.3: {}
type-fest@0.8.1: {}
- type-is@1.6.18:
- dependencies:
- media-typer: 0.3.0
- mime-types: 2.1.35
-
- type@2.7.3: {}
-
- typedarray-to-buffer@3.1.5:
- dependencies:
- is-typedarray: 1.0.0
-
typescript@5.9.3: {}
underscore@1.13.7: {}
undici-types@6.21.0: {}
- unfetch@4.2.0: {}
-
- unique-filename@4.0.0:
- dependencies:
- unique-slug: 5.0.0
- optional: true
-
- unique-slug@5.0.0:
- dependencies:
- imurmurhash: 0.1.4
- optional: true
-
- unique-string@2.0.0:
- dependencies:
- crypto-random-string: 2.0.0
-
- universal-analytics@0.4.23:
- dependencies:
- debug: 4.4.3
- request: 2.88.2
- uuid: 3.4.0
- transitivePeerDependencies:
- - supports-color
-
- universalify@0.1.2: {}
-
- universalify@0.2.0: {}
-
universalify@2.0.1: {}
- unpipe@1.0.0: {}
-
untildify@4.0.0: {}
- unzipper@0.10.14:
- dependencies:
- big-integer: 1.6.52
- binary: 0.3.0
- bluebird: 3.4.7
- buffer-indexof-polyfill: 1.0.2
- duplexer2: 0.1.4
- fstream: 1.0.12
- graceful-fs: 4.2.11
- listenercount: 1.0.1
- readable-stream: 2.3.8
- setimmediate: 1.0.5
-
update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies:
browserslist: 4.28.1
escalade: 3.2.0
picocolors: 1.1.1
- update-notifier@4.1.3:
- dependencies:
- boxen: 4.2.0
- chalk: 3.0.0
- configstore: 5.0.1
- has-yarn: 2.1.0
- import-lazy: 2.1.0
- is-ci: 2.0.0
- is-installed-globally: 0.3.2
- is-npm: 4.0.0
- is-yarn-global: 0.3.0
- latest-version: 5.1.0
- pupa: 2.1.1
- semver-diff: 3.1.1
- xdg-basedir: 4.0.0
-
- update-notifier@5.1.0:
- dependencies:
- boxen: 5.1.2
- chalk: 4.1.2
- configstore: 5.0.1
- has-yarn: 2.1.0
- import-lazy: 2.1.0
- is-ci: 2.0.0
- is-installed-globally: 0.4.0
- is-npm: 5.0.0
- is-yarn-global: 0.3.0
- latest-version: 5.1.0
- pupa: 2.1.1
- semver: 7.7.3
- semver-diff: 3.1.1
- xdg-basedir: 4.0.0
-
- uri-js@4.4.1:
- dependencies:
- punycode: 2.3.1
-
- url-join@0.0.1: {}
-
- url-parse-lax@3.0.0:
- dependencies:
- prepend-http: 2.0.0
-
- url-parse@1.5.10:
- dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
-
use-sync-external-store@1.6.0(react@18.3.1):
dependencies:
react: 18.3.1
- util-deprecate@1.0.2: {}
-
- utils-merge@1.0.1: {}
+ util-deprecate@1.0.2:
+ optional: true
uuid@10.0.0: {}
- uuid@3.4.0: {}
-
uuid@8.3.2: {}
uuid@9.0.1:
optional: true
- valid-url@1.0.9: {}
-
- vary@1.1.2: {}
-
verror@1.10.0:
dependencies:
assert-plus: 1.0.0
@@ -9795,18 +5109,10 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
- vm2@3.10.0:
- dependencies:
- acorn: 8.15.0
- acorn-walk: 8.3.4
-
- wcwidth@1.0.1:
- dependencies:
- defaults: 1.0.4
-
web-vitals@4.2.4: {}
- webidl-conversions@3.0.1: {}
+ webidl-conversions@3.0.1:
+ optional: true
webpack-bundle-analyzer@4.10.1:
dependencies:
@@ -9839,71 +5145,12 @@ snapshots:
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
-
- 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-collection@1.0.2:
- dependencies:
- 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.19:
- dependencies:
- 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@1.3.1:
- dependencies:
- isexe: 2.0.0
+ optional: true
which@2.0.2:
dependencies:
isexe: 2.0.0
- which@5.0.0:
- dependencies:
- isexe: 3.1.1
- optional: true
-
- widest-line@3.1.0:
- dependencies:
- string-width: 4.2.3
-
- winston-transport@4.9.0:
- dependencies:
- logform: 2.7.0
- readable-stream: 3.6.2
- triple-beam: 1.4.1
-
- winston@3.18.3:
- dependencies:
- '@colors/colors': 1.6.0
- '@dabh/diagnostics': 2.0.8
- async: 3.2.6
- is-stream: 2.0.1
- logform: 2.7.0
- one-time: 1.0.0
- readable-stream: 3.6.2
- safe-stable-stringify: 2.5.0
- stack-trace: 0.0.10
- triple-beam: 1.4.1
- winston-transport: 4.9.0
-
- word-wrap@1.2.5: {}
-
wrap-ansi@6.2.0:
dependencies:
ansi-styles: 4.3.0
@@ -9916,55 +5163,18 @@ snapshots:
string-width: 4.2.3
strip-ansi: 6.0.1
- wrap-ansi@8.1.0:
- dependencies:
- ansi-styles: 6.2.3
- string-width: 5.1.2
- strip-ansi: 7.1.2
- optional: true
-
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
-
ws@7.5.10: {}
- xdg-basedir@4.0.0: {}
-
- xregexp@2.0.0: {}
-
- xtend@4.0.2: {}
-
y18n@5.0.8: {}
- yallist@3.1.1: {}
-
yallist@4.0.0: {}
- yallist@5.0.0:
- optional: true
-
yaml@1.10.2: {}
- yargs-parser@20.2.9: {}
-
yargs-parser@21.1.1: {}
- yargs@16.2.0:
- dependencies:
- cliui: 7.0.4
- 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: 20.2.9
-
yargs@17.7.2:
dependencies:
cliui: 8.0.1
@@ -9982,9 +5192,3 @@ snapshots:
yocto-queue@0.1.0:
optional: true
-
- zip-stream@4.1.1:
- dependencies:
- archiver-utils: 3.0.4
- compress-commons: 4.1.2
- readable-stream: 3.6.2
diff --git a/src/components/blog/postFooter.tsx b/src/components/blog/postFooter.tsx
index 8714b88..fd7729c 100644
--- a/src/components/blog/postFooter.tsx
+++ b/src/components/blog/postFooter.tsx
@@ -1,5 +1,6 @@
'use client'
+import { CONFIG } from '@/lib/helpers'
import { IconShare } from '@tabler/icons-react'
import toast from 'react-hot-toast'
@@ -30,7 +31,7 @@ export default function PostFooter({ postId }: { postId: string }) {
Michael Schultz
@michaelschultz
diff --git a/src/components/home/infusionTable.tsx b/src/components/home/infusionTable.tsx
index 3eb5ff9..af75425 100644
--- a/src/components/home/infusionTable.tsx
+++ b/src/components/home/infusionTable.tsx
@@ -1,6 +1,6 @@
'use client'
-import { useState, useMemo } from 'react'
+import { useState, useMemo, useCallback } from 'react'
import { format, parseISO } from 'date-fns'
import {
useReactTable,
@@ -47,10 +47,13 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
// Determine if user can edit/delete treatments
const isLoggedInUser = user && (!uid || uid === user.uid)
- // Delete function
- const deleteRow = (infusionUid: string) => {
- deleteInfusion({ uid: infusionUid, userUid: user?.uid || '' })
- }
+ // Delete function - memoized to prevent column recreation
+ const deleteRow = useCallback(
+ (infusionUid: string) => {
+ deleteInfusion({ uid: infusionUid, userUid: user?.uid || '' })
+ },
+ [deleteInfusion, user?.uid]
+ )
// Column definitions - memoized to prevent recreation on every render
const columns: ColumnDef[] = useMemo(() => {
@@ -188,8 +191,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
}
return baseColumns
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isLoggedInUser, user?.uid])
+ }, [isLoggedInUser, deleteRow])
// Create the table instance - must be called before any early returns
const table = useReactTable({
diff --git a/src/components/home/profilePage.tsx b/src/components/home/profilePage.tsx
index 29354e2..1b30e69 100644
--- a/src/components/home/profilePage.tsx
+++ b/src/components/home/profilePage.tsx
@@ -40,8 +40,7 @@ const ProfilePage = (): JSX.Element => {
if (person && !person.apiKey && user?.uid) {
handleUpdateUserApiKey()
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [person?.apiKey, user?.uid]) // Only depend on apiKey, not the whole person object
+ }, [person, person?.apiKey, user?.uid, handleUpdateUserApiKey])
const handleDeleteAccount = async () => {
if (!user?.token) {
diff --git a/src/components/shared/footer.tsx b/src/components/shared/footer.tsx
index 4d18a45..24b2c3e 100644
--- a/src/components/shared/footer.tsx
+++ b/src/components/shared/footer.tsx
@@ -4,6 +4,7 @@
import EmergencySnippet from '@/components/shared/emergencySnippet'
import { useAuth } from '@/lib/auth'
+import { CONFIG } from '@/lib/helpers'
export default function Footer(): JSX.Element {
const { user, loading } = useAuth()
@@ -46,7 +47,7 @@ export default function Footer(): JSX.Element {
@MichaelSchultz
diff --git a/src/lib/auth.tsx b/src/lib/auth.tsx
index 9b7d649..05c1331 100644
--- a/src/lib/auth.tsx
+++ b/src/lib/auth.tsx
@@ -84,7 +84,10 @@ function useProvideAuth() {
try {
// Fetch user data from Firestore using Firestore Lite with timeout
- const dbUser = await withTimeout(fetchUserByUid(formattedUser.uid), 5000)
+ const dbUser = await withTimeout(
+ fetchUserByUid(formattedUser.uid),
+ 5000
+ )
const { ...userWithoutToken } = formattedUser
@@ -308,10 +311,19 @@ function useProvideAuth() {
if (authListenerInitialized) {
// Sync state with global state if it changed
- if (user !== globalUser) {
- setUser(globalUser)
- setLoading(globalLoading)
- }
+ // Use functional updates to avoid needing user in dependencies
+ setUser((currentUser) => {
+ if (currentUser !== globalUser) {
+ return globalUser
+ }
+ return currentUser
+ })
+ setLoading((currentLoading) => {
+ if (currentLoading !== globalLoading) {
+ return globalLoading
+ }
+ return currentLoading
+ })
return
}
@@ -338,8 +350,7 @@ function useProvideAuth() {
unsubscribe()
authListenerInitialized = false
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [handleUser]) // Only depend on handleUser, not user, to prevent re-initialization
+ }, [handleUser]) // Only depend on handleUser to prevent re-initialization
return {
user,
@@ -371,7 +382,10 @@ const formatUser = async (rawUser: User): Promise
=> {
token = idTokenResult.token
} catch (error) {
// Token retrieval failed or timed out, continue without token
- console.warn('Token retrieval failed:', error instanceof Error ? error.message : 'Unknown error')
+ console.warn(
+ 'Token retrieval failed:',
+ error instanceof Error ? error.message : 'Unknown error'
+ )
}
const alertId = await generateUniqueString(6)
diff --git a/src/lib/db/users.ts b/src/lib/db/users.ts
index 8841e7d..9025f15 100644
--- a/src/lib/db/users.ts
+++ b/src/lib/db/users.ts
@@ -27,8 +27,7 @@ export async function createUser(
userData: Partial
): Promise {
// Remove token from userData as it shouldn't be stored in Firestore
- // biome-ignore lint/correctness/noUnusedVariables: token is intentionally extracted and discarded
- const { token, ...dataWithoutToken } = userData
+ const { token: _token, ...dataWithoutToken } = userData
try {
// Create or update user document with 10 second timeout
diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts
index 8e703bd..c5fba6f 100644
--- a/src/lib/helpers.ts
+++ b/src/lib/helpers.ts
@@ -1,4 +1,7 @@
-// Placeholder - need to restore from git
+export const CONFIG = {
+ blueskyUrl: 'https://bsky.app/profile/michaelschultz.com',
+}
+
export async function generateUniqueString(length: number): Promise {
return Math.random()
.toString(36)
From 15441e58198c11b2c76ee49469787f5d5450e1ee Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Sun, 28 Dec 2025 23:20:27 -0800
Subject: [PATCH 05/15] adds build:prod script to generate correct firebase
rules
---
package.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/package.json b/package.json
index 4066c96..c94c0ce 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
"packageManager": "pnpm@10.13.1",
"scripts": {
"build": "pnpm run lint:fix; next build",
+ "build:prod": "pnpm run rules:prod && pnpm run lint:fix && next build",
"dev": "next dev",
"firebase": "firebase emulators:start",
"firebase:dev": "pnpm run rules:dev && firebase emulators:start",
From 9f44cb5e29bd52f7b638f050bb60742ec91b412f Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Sun, 28 Dec 2025 23:23:50 -0800
Subject: [PATCH 06/15] sort imports
---
biome.json | 2 +-
cypress.config.ts | 1 +
next-env.d.ts | 2 +-
src/app/about/page.tsx | 3 +--
src/app/api/delete-account/route.ts | 4 +--
src/app/api/feedback/route.ts | 4 +--
src/app/api/log-treatment/route.ts | 2 +-
src/app/api/recent-treatments/route.ts | 2 +-
src/app/api/treatments/route.ts | 2 +-
src/app/changelog/[slug]/page.tsx | 5 ++--
src/app/changelog/page.tsx | 5 ++--
src/app/emergency/[alertId]/page.tsx | 7 +++--
src/app/emergency/print/page.tsx | 2 +-
src/app/home/page.tsx | 12 ++++-----
src/app/not-found.tsx | 4 +--
src/app/page.tsx | 4 +--
src/app/providers.tsx | 2 +-
src/app/signin/page.tsx | 6 ++---
src/components/blog/blogFooter.tsx | 2 +-
src/components/blog/postFooter.tsx | 2 +-
src/components/emergency/emergencyInfo.tsx | 2 +-
src/components/home/chart.tsx | 10 ++++----
src/components/home/emergencyCard.tsx | 2 +-
src/components/home/feedbackPage.tsx | 2 +-
src/components/home/header.tsx | 5 ++--
src/components/home/homePage.tsx | 3 +--
src/components/home/infusionModal.tsx | 11 ++++----
src/components/home/infusionTable.tsx | 21 ++++++++-------
src/components/home/profilePage.tsx | 9 +++----
src/components/home/settingsForm.tsx | 6 ++---
src/components/home/stats.tsx | 7 +++--
src/components/shared/emergencySnippet.tsx | 2 +-
src/components/shared/staticHeader.tsx | 3 +--
src/lib/admin-db/feedback.ts | 2 +-
src/lib/admin-db/infusions.ts | 5 ++--
src/lib/admin-db/users.ts | 2 +-
src/lib/auth.tsx | 30 +++++++++++-----------
src/lib/db/infusions.ts | 4 +--
src/lib/db/users.ts | 6 ++---
src/lib/firebase-admin.ts | 6 ++---
src/lib/firebase.ts | 6 ++---
src/lib/firestore-lite.ts | 22 ++++++++--------
src/lib/hooks/useFeedbackMutations.ts | 2 +-
src/lib/hooks/useInfusionMutations.ts | 2 +-
src/lib/hooks/useUserMutations.ts | 4 +--
src/lib/providers/query-provider.tsx | 2 +-
src/lib/seed.ts | 6 ++---
47 files changed, 122 insertions(+), 133 deletions(-)
diff --git a/biome.json b/biome.json
index 6c29f5b..dd37557 100644
--- a/biome.json
+++ b/biome.json
@@ -64,7 +64,7 @@
"enabled": true,
"actions": {
"source": {
- "organizeImports": "off"
+ "organizeImports": "on"
}
}
}
diff --git a/cypress.config.ts b/cypress.config.ts
index 78d0121..91c2f3d 100644
--- a/cypress.config.ts
+++ b/cypress.config.ts
@@ -2,6 +2,7 @@ import { defineConfig } from 'cypress'
// Populate process.env with values from .env file
import dotenv from 'dotenv'
+
dotenv.config()
export default defineConfig({
diff --git a/next-env.d.ts b/next-env.d.ts
index c4b7818..a3e4680 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import "./.next/dev/types/routes.d.ts";
+import './.next/dev/types/routes.d.ts'
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
index 3aff606..4d5b7a7 100644
--- a/src/app/about/page.tsx
+++ b/src/app/about/page.tsx
@@ -1,7 +1,6 @@
import Image from 'next/image'
-
-import StaticHeader from '@/components/shared/staticHeader'
import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
const About = (): JSX.Element => {
return (
diff --git a/src/app/api/delete-account/route.ts b/src/app/api/delete-account/route.ts
index 0a71c6e..bc9a031 100644
--- a/src/app/api/delete-account/route.ts
+++ b/src/app/api/delete-account/route.ts
@@ -1,6 +1,6 @@
-import { auth } from '@/lib/firebase-admin'
-import { deleteUserAndData } from '@/lib/admin-db/users'
import type { NextRequest } from 'next/server'
+import { deleteUserAndData } from '@/lib/admin-db/users'
+import { auth } from '@/lib/firebase-admin'
export async function DELETE(request: NextRequest) {
try {
diff --git a/src/app/api/feedback/route.ts b/src/app/api/feedback/route.ts
index 44cc726..f22e386 100644
--- a/src/app/api/feedback/route.ts
+++ b/src/app/api/feedback/route.ts
@@ -1,6 +1,6 @@
-import { auth } from '@/lib/firebase-admin'
-import { getAllFeedback } from '@/lib/admin-db/feedback'
import type { NextRequest } from 'next/server'
+import { getAllFeedback } from '@/lib/admin-db/feedback'
+import { auth } from '@/lib/firebase-admin'
export async function GET(request: NextRequest) {
try {
diff --git a/src/app/api/log-treatment/route.ts b/src/app/api/log-treatment/route.ts
index 0d663d7..d470887 100644
--- a/src/app/api/log-treatment/route.ts
+++ b/src/app/api/log-treatment/route.ts
@@ -1,8 +1,8 @@
+import type { NextRequest } from 'next/server'
import {
getRecentUserInfusionsByApiKey,
postInfusionByApiKey,
} from '@/lib/admin-db/infusions'
-import type { NextRequest } from 'next/server'
export async function POST(request: NextRequest) {
try {
diff --git a/src/app/api/recent-treatments/route.ts b/src/app/api/recent-treatments/route.ts
index fd59d02..37367e6 100644
--- a/src/app/api/recent-treatments/route.ts
+++ b/src/app/api/recent-treatments/route.ts
@@ -1,5 +1,5 @@
-import { getRecentUserInfusionsByApiKey } from '@/lib/admin-db/infusions'
import type { NextRequest } from 'next/server'
+import { getRecentUserInfusionsByApiKey } from '@/lib/admin-db/infusions'
export async function GET(request: NextRequest) {
try {
diff --git a/src/app/api/treatments/route.ts b/src/app/api/treatments/route.ts
index 5aa3fca..f612b98 100644
--- a/src/app/api/treatments/route.ts
+++ b/src/app/api/treatments/route.ts
@@ -1,5 +1,5 @@
-import { getAllInfusionsByApiKey } from '@/lib/admin-db/infusions'
import type { NextRequest } from 'next/server'
+import { getAllInfusionsByApiKey } from '@/lib/admin-db/infusions'
export async function GET(request: NextRequest) {
try {
diff --git a/src/app/changelog/[slug]/page.tsx b/src/app/changelog/[slug]/page.tsx
index e0f29fe..8aa300e 100644
--- a/src/app/changelog/[slug]/page.tsx
+++ b/src/app/changelog/[slug]/page.tsx
@@ -1,9 +1,8 @@
import { notFound } from 'next/navigation'
-
-import StaticHeader from '@/components/shared/staticHeader'
-import Footer from '@/components/shared/footer'
import BlogFooter from '@/components/blog/blogFooter'
import PostFooter from '@/components/blog/postFooter'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
interface PageProps {
params: Promise<{
diff --git a/src/app/changelog/page.tsx b/src/app/changelog/page.tsx
index 35cbbcd..6171b36 100644
--- a/src/app/changelog/page.tsx
+++ b/src/app/changelog/page.tsx
@@ -1,11 +1,10 @@
'use client'
import Image from 'next/image'
-
-import StaticHeader from '@/components/shared/staticHeader'
-import Footer from '@/components/shared/footer'
import BlogFooter from '@/components/blog/blogFooter'
import PostFooter from '@/components/blog/postFooter'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
const Changelog = (): JSX.Element => {
return (
diff --git a/src/app/emergency/[alertId]/page.tsx b/src/app/emergency/[alertId]/page.tsx
index 7de9686..a4edec3 100644
--- a/src/app/emergency/[alertId]/page.tsx
+++ b/src/app/emergency/[alertId]/page.tsx
@@ -1,12 +1,11 @@
'use client'
-import { useState, useEffect } from 'react'
-import { useParams } from 'next/navigation'
import Link from 'next/link'
-
-import { useEmergencyUserQuery } from '@/lib/hooks/useEmergencyUserQuery'
+import { useParams } from 'next/navigation'
+import { useEffect, useState } from 'react'
import EmergencyInfo from '@/components/emergency/emergencyInfo'
import Footer from '@/components/shared/footer'
+import { useEmergencyUserQuery } from '@/lib/hooks/useEmergencyUserQuery'
const Emergency = (): JSX.Element => {
const [mounted, setMounted] = useState(false)
diff --git a/src/app/emergency/print/page.tsx b/src/app/emergency/print/page.tsx
index d4efdf4..903b70a 100644
--- a/src/app/emergency/print/page.tsx
+++ b/src/app/emergency/print/page.tsx
@@ -1,7 +1,7 @@
'use client'
-import Logo from '@/components/shared/logo'
import EmergencyCard from '@/components/home/emergencyCard'
+import Logo from '@/components/shared/logo'
export default function Print(): JSX.Element {
// TODO(michael) Could improve this by determining the user on the server side
diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx
index 11ac417..d73d8db 100644
--- a/src/app/home/page.tsx
+++ b/src/app/home/page.tsx
@@ -1,16 +1,16 @@
'use client'
-import { useEffect } from 'react'
import { usePathname } from 'next/navigation'
-import { Tabs, TabsItem } from '@/components/home/Tabs'
+import { useEffect } from 'react'
+import FeedbackPage from '@/components/home/feedbackPage'
import Header from '@/components/home/header'
-import Footer from '@/components/shared/footer'
-import { withAuth } from '@/components/shared/withAuth'
-import { useAuth, ProtectRoute } from '@/lib/auth'
import HomePage from '@/components/home/homePage'
import ProfilePage from '@/components/home/profilePage'
-import FeedbackPage from '@/components/home/feedbackPage'
+import { Tabs, TabsItem } from '@/components/home/Tabs'
+import Footer from '@/components/shared/footer'
+import { withAuth } from '@/components/shared/withAuth'
+import { ProtectRoute, useAuth } from '@/lib/auth'
import { track } from '@/lib/helpers'
const Home = (): JSX.Element => {
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index 9d2d7a9..5056c81 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -1,10 +1,10 @@
'use client'
-import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
+import { useEffect } from 'react'
+import LoadingScreen from '@/components/shared/loadingScreen'
import { withAuth } from '@/components/shared/withAuth'
import { useAuth } from '@/lib/auth'
-import LoadingScreen from '@/components/shared/loadingScreen'
function Custom404(): JSX.Element {
const router = useRouter()
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 9c95bf4..0170084 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,8 +1,8 @@
-import Link from 'next/link'
import Image from 'next/image'
+import Link from 'next/link'
+import DescriptionCards from '@/components/landing/descriptionCards'
import Footer from '@/components/shared/footer'
import StaticHeader from '@/components/shared/staticHeader'
-import DescriptionCards from '@/components/landing/descriptionCards'
export default function Landing(): JSX.Element {
return (
diff --git a/src/app/providers.tsx b/src/app/providers.tsx
index b656086..48622bd 100644
--- a/src/app/providers.tsx
+++ b/src/app/providers.tsx
@@ -1,8 +1,8 @@
'use client'
import { Toaster } from 'react-hot-toast'
-import { ThemeProvider } from '@/lib/contexts/ThemeContext'
import { AuthProvider } from '@/lib/auth'
+import { ThemeProvider } from '@/lib/contexts/ThemeContext'
import { QueryProvider } from '@/lib/providers/query-provider'
export function Providers({ children }: { children: React.ReactNode }) {
diff --git a/src/app/signin/page.tsx b/src/app/signin/page.tsx
index e69ea5d..25e595f 100644
--- a/src/app/signin/page.tsx
+++ b/src/app/signin/page.tsx
@@ -1,12 +1,12 @@
'use client'
-import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
-import Logo from '@/components/shared/logo'
+import { useEffect } from 'react'
import Footer from '@/components/shared/footer'
+import LoadingScreen from '@/components/shared/loadingScreen'
+import Logo from '@/components/shared/logo'
import { withAuth } from '@/components/shared/withAuth'
import { useAuth } from '@/lib/auth'
-import LoadingScreen from '@/components/shared/loadingScreen'
const Signin = () => {
const auth = useAuth()
diff --git a/src/components/blog/blogFooter.tsx b/src/components/blog/blogFooter.tsx
index 94bf6c8..9d3e57e 100644
--- a/src/components/blog/blogFooter.tsx
+++ b/src/components/blog/blogFooter.tsx
@@ -1,7 +1,7 @@
'use client'
-import { useRouter } from 'next/navigation'
import Image from 'next/image'
+import { useRouter } from 'next/navigation'
import { useAuth } from '@/lib/auth'
diff --git a/src/components/blog/postFooter.tsx b/src/components/blog/postFooter.tsx
index fd7729c..f7806dd 100644
--- a/src/components/blog/postFooter.tsx
+++ b/src/components/blog/postFooter.tsx
@@ -1,8 +1,8 @@
'use client'
-import { CONFIG } from '@/lib/helpers'
import { IconShare } from '@tabler/icons-react'
import toast from 'react-hot-toast'
+import { CONFIG } from '@/lib/helpers'
export default function PostFooter({ postId }: { postId: string }) {
const handleCopy = async (postId: string) => {
diff --git a/src/components/emergency/emergencyInfo.tsx b/src/components/emergency/emergencyInfo.tsx
index fcc5486..4927735 100644
--- a/src/components/emergency/emergencyInfo.tsx
+++ b/src/components/emergency/emergencyInfo.tsx
@@ -1,7 +1,7 @@
import React from 'react'
import InfusionTable from '@/components/home/infusionTable'
-import type { Person } from '@/lib/types/person'
import { useAuth } from '@/lib/auth'
+import type { Person } from '@/lib/types/person'
interface Props {
person: Person
diff --git a/src/components/home/chart.tsx b/src/components/home/chart.tsx
index 927cb37..c9af157 100644
--- a/src/components/home/chart.tsx
+++ b/src/components/home/chart.tsx
@@ -1,14 +1,14 @@
import {
- BarChart,
Bar,
- XAxis,
- YAxis,
+ BarChart,
CartesianGrid,
ResponsiveContainer,
+ XAxis,
+ YAxis,
} from 'recharts'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
-import { filterInfusions } from '@/lib/helpers'
import { TreatmentTypeEnum } from '@/lib/db/infusions'
+import { filterInfusions } from '@/lib/helpers'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
type ChartDataEntry = {
month: string
diff --git a/src/components/home/emergencyCard.tsx b/src/components/home/emergencyCard.tsx
index 01aaaeb..bce2124 100644
--- a/src/components/home/emergencyCard.tsx
+++ b/src/components/home/emergencyCard.tsx
@@ -1,6 +1,6 @@
'use client'
-import React from 'react'
import Link from 'next/link'
+import React from 'react'
import QRCode from 'react-qr-code'
import { useAuth } from '@/lib/auth'
diff --git a/src/components/home/feedbackPage.tsx b/src/components/home/feedbackPage.tsx
index 6f266e9..9e18291 100644
--- a/src/components/home/feedbackPage.tsx
+++ b/src/components/home/feedbackPage.tsx
@@ -2,9 +2,9 @@
import { useQuery } from '@tanstack/react-query'
import { format } from 'date-fns'
+import LoadingScreen from '@/components/shared/loadingScreen'
import { useAuth } from '@/lib/auth'
import type { FeedbackType } from '@/lib/db/feedback'
-import LoadingScreen from '@/components/shared/loadingScreen'
const handleReplyClick = (email: string) => {
window.location.assign(
diff --git a/src/components/home/header.tsx b/src/components/home/header.tsx
index 2668411..4668a1e 100644
--- a/src/components/home/header.tsx
+++ b/src/components/home/header.tsx
@@ -1,10 +1,9 @@
'use client'
import React from 'react'
-
-import { useAuth } from '@/lib/auth'
-import Logo from '@/components/shared/logo'
import InfusionModal from '@/components/home/infusionModal'
+import Logo from '@/components/shared/logo'
+import { useAuth } from '@/lib/auth'
interface Props {
version?: string
diff --git a/src/components/home/homePage.tsx b/src/components/home/homePage.tsx
index 6a4c32a..4df80d1 100644
--- a/src/components/home/homePage.tsx
+++ b/src/components/home/homePage.tsx
@@ -1,10 +1,9 @@
'use client'
-import React, { useState } from 'react'
import { IconFilter } from '@tabler/icons-react'
import { getYear } from 'date-fns'
-
import dynamic from 'next/dynamic'
+import React, { useState } from 'react'
import InfusionTable from '@/components/home/infusionTable'
import Stats from '@/components/home/stats'
import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
diff --git a/src/components/home/infusionModal.tsx b/src/components/home/infusionModal.tsx
index 475ab1d..ddc3a87 100644
--- a/src/components/home/infusionModal.tsx
+++ b/src/components/home/infusionModal.tsx
@@ -1,17 +1,16 @@
-import { useFormik } from 'formik'
import { format } from 'date-fns'
-
-import { useAuth } from '@/lib/auth'
-import { track } from '@/lib/helpers'
+import { useFormik } from 'formik'
import toast from 'react-hot-toast'
+import { useAuth } from '@/lib/auth'
import {
type TreatmentType,
TreatmentTypeEnum,
type TreatmentTypeOptions,
} from '@/lib/db/infusions'
-import type { AttachedUserType } from '@/lib/types/users'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { track } from '@/lib/helpers'
import { useInfusionMutations } from '@/lib/hooks/useInfusionMutations'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import type { AttachedUserType } from '@/lib/types/users'
interface InfusionValues {
brand: string
diff --git a/src/components/home/infusionTable.tsx b/src/components/home/infusionTable.tsx
index af75425..13a6d65 100644
--- a/src/components/home/infusionTable.tsx
+++ b/src/components/home/infusionTable.tsx
@@ -1,23 +1,22 @@
'use client'
-import { useState, useMemo, useCallback } from 'react'
-import { format, parseISO } from 'date-fns'
+import { IconChevronDown, IconChevronUp, IconDots } from '@tabler/icons-react'
import {
- useReactTable,
+ type ColumnDef,
+ flexRender,
getCoreRowModel,
- getSortedRowModel,
getPaginationRowModel,
- flexRender,
- type ColumnDef,
+ getSortedRowModel,
type SortingState,
+ useReactTable,
} from '@tanstack/react-table'
-import { IconChevronUp, IconChevronDown, IconDots } from '@tabler/icons-react'
-
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
-import { useInfusionMutations } from '@/lib/hooks/useInfusionMutations'
-import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/infusions'
+import { format, parseISO } from 'date-fns'
+import { useCallback, useMemo, useState } from 'react'
import { useAuth } from '@/lib/auth'
+import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/infusions'
import { filterInfusions } from '@/lib/helpers'
+import { useInfusionMutations } from '@/lib/hooks/useInfusionMutations'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
import InfusionModal from './infusionModal'
interface InfusionTableProps {
diff --git a/src/components/home/profilePage.tsx b/src/components/home/profilePage.tsx
index 1b30e69..e7851f9 100644
--- a/src/components/home/profilePage.tsx
+++ b/src/components/home/profilePage.tsx
@@ -1,15 +1,14 @@
'use client'
-import { useEffect, useCallback, useState } from 'react'
import { useRouter } from 'next/navigation'
-
+import { useCallback, useEffect, useState } from 'react'
+import toast from 'react-hot-toast'
import EmergencyCard from '@/components/home/emergencyCard'
-import EmergencySnippet from '@/components/shared/emergencySnippet'
import SettingsForm from '@/components/home/settingsForm'
+import EmergencySnippet from '@/components/shared/emergencySnippet'
import { useAuth } from '@/lib/auth'
-import { useUserMutations } from '@/lib/hooks/useUserMutations'
import { generateUniqueString, track } from '@/lib/helpers'
-import toast from 'react-hot-toast'
+import { useUserMutations } from '@/lib/hooks/useUserMutations'
import { useUserQuery } from '@/lib/hooks/useUserQuery'
const ProfilePage = (): JSX.Element => {
diff --git a/src/components/home/settingsForm.tsx b/src/components/home/settingsForm.tsx
index 7ef6c60..c062029 100644
--- a/src/components/home/settingsForm.tsx
+++ b/src/components/home/settingsForm.tsx
@@ -1,10 +1,10 @@
-import { useState } from 'react'
import { useFormik } from 'formik'
+import { useState } from 'react'
import { useAuth } from '@/lib/auth'
-import { useUserQuery } from '@/lib/hooks/useUserQuery'
-import { useUserMutations } from '@/lib/hooks/useUserMutations'
import { track } from '@/lib/helpers'
+import { useUserMutations } from '@/lib/hooks/useUserMutations'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
const SettingsForm = (): JSX.Element => {
const { user } = useAuth()
diff --git a/src/components/home/stats.tsx b/src/components/home/stats.tsx
index 445a3ff..faae072 100644
--- a/src/components/home/stats.tsx
+++ b/src/components/home/stats.tsx
@@ -1,11 +1,10 @@
-import _ from 'underscore'
import { useState } from 'react'
-
+import _ from 'underscore'
+import FeedbackModal from '@/components/home/feedbackModal'
import StatCard from '@/components/home/statCard'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
import { TreatmentTypeEnum } from '@/lib/db/infusions'
-import FeedbackModal from '@/components/home/feedbackModal'
import { filterInfusions } from '@/lib/helpers'
+import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
// TODO(michael) move types to types file
type Value = string[]
diff --git a/src/components/shared/emergencySnippet.tsx b/src/components/shared/emergencySnippet.tsx
index 93857ab..2fcb18d 100644
--- a/src/components/shared/emergencySnippet.tsx
+++ b/src/components/shared/emergencySnippet.tsx
@@ -1,5 +1,5 @@
-import type React from 'react'
import { IconCopy } from '@tabler/icons-react'
+import type React from 'react'
import toast from 'react-hot-toast'
interface Props {
diff --git a/src/components/shared/staticHeader.tsx b/src/components/shared/staticHeader.tsx
index 3e785bc..5111fda 100644
--- a/src/components/shared/staticHeader.tsx
+++ b/src/components/shared/staticHeader.tsx
@@ -1,9 +1,8 @@
'use client'
import { useRouter } from 'next/navigation'
-
-import { useAuth } from '@/lib/auth'
import Logo from '@/components/shared/logo'
+import { useAuth } from '@/lib/auth'
const StaticHeader = (): JSX.Element => {
const { user, loading } = useAuth()
diff --git a/src/lib/admin-db/feedback.ts b/src/lib/admin-db/feedback.ts
index 7e21e5a..cca874a 100644
--- a/src/lib/admin-db/feedback.ts
+++ b/src/lib/admin-db/feedback.ts
@@ -1,6 +1,6 @@
-import { adminFirestore } from '@/lib/firebase-admin'
import { compareAsc, compareDesc, parseISO } from 'date-fns'
import type { FeedbackType } from '@/lib/db/feedback'
+import { adminFirestore } from '@/lib/firebase-admin'
async function getAllFeedback() {
try {
diff --git a/src/lib/admin-db/infusions.ts b/src/lib/admin-db/infusions.ts
index 26e6446..9e6ddc7 100644
--- a/src/lib/admin-db/infusions.ts
+++ b/src/lib/admin-db/infusions.ts
@@ -1,8 +1,7 @@
-import { adminFirestore } from '@/lib/firebase-admin'
import { compareDesc, parseISO } from 'date-fns'
-
-import { TreatmentTypeEnum, type TreatmentType } from '../db/infusions'
+import { adminFirestore } from '@/lib/firebase-admin'
import type { AttachedUserType } from '@/lib/types/users'
+import { type TreatmentType, TreatmentTypeEnum } from '../db/infusions'
async function getAllInfusions() {
const snapshot = await adminFirestore.collection('infusions').get()
diff --git a/src/lib/admin-db/users.ts b/src/lib/admin-db/users.ts
index 3bd7827..c6d4eca 100644
--- a/src/lib/admin-db/users.ts
+++ b/src/lib/admin-db/users.ts
@@ -1,4 +1,4 @@
-import { auth, adminFirestore } from '@/lib/firebase-admin'
+import { adminFirestore, auth } from '@/lib/firebase-admin'
const BATCH_LIMIT = 400
diff --git a/src/lib/auth.tsx b/src/lib/auth.tsx
index 05c1331..26a3f79 100644
--- a/src/lib/auth.tsx
+++ b/src/lib/auth.tsx
@@ -1,29 +1,28 @@
'use client'
import {
- useState,
- useEffect,
- useContext,
- createContext,
- useCallback,
-} from 'react'
-import cookie from 'js-cookie'
-import {
- signInWithPopup,
- signInWithEmailAndPassword,
createUserWithEmailAndPassword,
signOut as firebaseSignOut,
- onIdTokenChanged,
GoogleAuthProvider,
+ onIdTokenChanged,
+ signInWithEmailAndPassword,
+ signInWithPopup,
type User,
} from 'firebase/auth'
-
-import { getAuth } from '@/lib/firebase'
+import cookie from 'js-cookie'
+import { usePathname, useRouter } from 'next/navigation'
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useState,
+} from 'react'
+import LoadingScreen from '@/components/shared/loadingScreen'
import { createUser, fetchUserByUid } from '@/lib/db/users'
+import { getAuth } from '@/lib/firebase'
import { generateUniqueString } from '@/lib/helpers'
-import LoadingScreen from '@/components/shared/loadingScreen'
import type { UserType } from '@/lib/types/users'
-import { useRouter, usePathname } from 'next/navigation'
type ContextProps = {
user: UserType | null
@@ -289,6 +288,7 @@ function useProvideAuth() {
await handleUser(null)
}
+ // biome-ignore lint/correctness/useExhaustiveDependencies: Will cause infinite loop
useEffect(() => {
if (typeof window === 'undefined') {
// On server, keep loading true (will be set to false on client)
diff --git a/src/lib/db/infusions.ts b/src/lib/db/infusions.ts
index 444b0d6..3d9beff 100644
--- a/src/lib/db/infusions.ts
+++ b/src/lib/db/infusions.ts
@@ -1,8 +1,8 @@
import {
createDocument,
- updateDocument,
- softDeleteDocument,
getDocuments,
+ softDeleteDocument,
+ updateDocument,
where,
} from '@/lib/firestore-lite'
import type { AttachedUserType } from '@/lib/types/users'
diff --git a/src/lib/db/users.ts b/src/lib/db/users.ts
index 9025f15..a42fb4c 100644
--- a/src/lib/db/users.ts
+++ b/src/lib/db/users.ts
@@ -1,12 +1,12 @@
import {
- setDocument,
getDocument,
getDocuments,
- where,
limit,
+ setDocument,
+ where,
} from '@/lib/firestore-lite'
-import type { UserType } from '../types/users'
import type { Person } from '../types/person'
+import type { UserType } from '../types/users'
// Helper to add timeout to a promise
function withTimeout(promise: Promise, timeoutMs: number): Promise {
diff --git a/src/lib/firebase-admin.ts b/src/lib/firebase-admin.ts
index 5316f46..01b4840 100644
--- a/src/lib/firebase-admin.ts
+++ b/src/lib/firebase-admin.ts
@@ -2,9 +2,9 @@
// Initializes firebase with admin privileges and returns both {db} used for accessing Firestore
// and {auth} use to verify logged in people.
-import { initializeApp, getApps, cert, type App } from 'firebase-admin/app'
-import { getFirestore, type Firestore } from 'firebase-admin/firestore'
-import { getAuth, type Auth } from 'firebase-admin/auth'
+import { type App, cert, getApps, initializeApp } from 'firebase-admin/app'
+import { type Auth, getAuth } from 'firebase-admin/auth'
+import { type Firestore, getFirestore } from 'firebase-admin/firestore'
const useEmulators = process.env.NEXT_PUBLIC_USE_EMULATORS === 'true'
diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts
index db4ae85..4b3c2a1 100644
--- a/src/lib/firebase.ts
+++ b/src/lib/firebase.ts
@@ -2,11 +2,11 @@
// Initializes firebase across app for authentication only
// Firestore operations are now handled by firestore-lite.ts
-import { initializeApp, getApps, type FirebaseApp } from 'firebase/app'
+import { type FirebaseApp, getApps, initializeApp } from 'firebase/app'
import {
- getAuth as getFirebaseAuth,
- connectAuthEmulator,
type Auth,
+ connectAuthEmulator,
+ getAuth as getFirebaseAuth,
} from 'firebase/auth'
const firebaseConfig = {
diff --git a/src/lib/firestore-lite.ts b/src/lib/firestore-lite.ts
index fc49bb0..918578e 100644
--- a/src/lib/firestore-lite.ts
+++ b/src/lib/firestore-lite.ts
@@ -2,26 +2,26 @@
// Lightweight Firestore client using REST API via firebase/firestore/lite
// This replaces the full Firestore SDK to reduce bundle size and eliminate WebSocket issues
-import { initializeApp, getApps, type FirebaseApp } from 'firebase/app'
+import { type FirebaseApp, getApps, initializeApp } from 'firebase/app'
import {
- getFirestore,
- connectFirestoreEmulator,
+ addDoc,
collection,
+ connectFirestoreEmulator,
+ type DocumentData,
+ deleteDoc,
doc,
+ type Firestore,
getDoc,
getDocs,
- setDoc,
- updateDoc,
- deleteDoc,
- addDoc,
- query,
- where,
+ getFirestore,
limit,
orderBy,
- type Firestore,
type QueryConstraint,
- type DocumentData,
+ query,
+ setDoc,
+ updateDoc,
type WithFieldValue,
+ where,
} from 'firebase/firestore/lite'
const firebaseConfig = {
diff --git a/src/lib/hooks/useFeedbackMutations.ts b/src/lib/hooks/useFeedbackMutations.ts
index 3d8ef9f..4822512 100644
--- a/src/lib/hooks/useFeedbackMutations.ts
+++ b/src/lib/hooks/useFeedbackMutations.ts
@@ -3,8 +3,8 @@ import toast from 'react-hot-toast'
import {
createFeedback,
deleteFeedback,
- updateFeedback,
type FeedbackType,
+ updateFeedback,
} from '@/lib/db/feedback'
interface UseFeedbackMutationsOptions {
diff --git a/src/lib/hooks/useInfusionMutations.ts b/src/lib/hooks/useInfusionMutations.ts
index 4feca52..6ba9ad3 100644
--- a/src/lib/hooks/useInfusionMutations.ts
+++ b/src/lib/hooks/useInfusionMutations.ts
@@ -2,9 +2,9 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'
import toast from 'react-hot-toast'
import {
createInfusion,
- updateInfusion,
deleteInfusion,
type TreatmentType,
+ updateInfusion,
} from '@/lib/db/infusions'
import { infusionKeys } from './useInfusionsQuery'
diff --git a/src/lib/hooks/useUserMutations.ts b/src/lib/hooks/useUserMutations.ts
index 2298195..0c4b599 100644
--- a/src/lib/hooks/useUserMutations.ts
+++ b/src/lib/hooks/useUserMutations.ts
@@ -1,9 +1,9 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'
import toast from 'react-hot-toast'
import { createUser, updateUser } from '@/lib/db/users'
-import { userKeys } from './useUserQuery'
-import type { UserType } from '@/lib/types/users'
import type { Person } from '@/lib/types/person'
+import type { UserType } from '@/lib/types/users'
+import { userKeys } from './useUserQuery'
interface UseUserMutationsOptions {
onCreateSuccess?: () => void
diff --git a/src/lib/providers/query-provider.tsx b/src/lib/providers/query-provider.tsx
index a2384d1..95fc4f6 100644
--- a/src/lib/providers/query-provider.tsx
+++ b/src/lib/providers/query-provider.tsx
@@ -1,7 +1,7 @@
'use client'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
-import { useState, type ReactNode } from 'react'
+import { type ReactNode, useState } from 'react'
// Create a stable QueryClient configuration
function makeQueryClient() {
diff --git a/src/lib/seed.ts b/src/lib/seed.ts
index fec5e85..d9c732a 100644
--- a/src/lib/seed.ts
+++ b/src/lib/seed.ts
@@ -5,13 +5,13 @@
// IMPORTANT: This script only works with Firebase emulators for safety.
// It will refuse to run if emulators are not enabled.
-import { adminFirestore } from './firebase-admin'
-import type { Person } from './types/person'
import {
- TreatmentTypeEnum,
type TreatmentType,
+ TreatmentTypeEnum,
type TreatmentTypeOptions,
} from './db/infusions'
+import { adminFirestore } from './firebase-admin'
+import type { Person } from './types/person'
import type { AttachedUserType } from './types/users'
// Safety check: Only allow running with emulators
From 0a1aaa8c501d1790fac49c914fd6cf6ce4f79ac0 Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Sun, 28 Dec 2025 23:42:38 -0800
Subject: [PATCH 07/15] rename infusion to treatment
---
next-env.d.ts | 2 +-
src/app/api/log-treatment/route.ts | 20 +--
src/app/api/recent-treatments/route.ts | 6 +-
src/app/api/treatments/route.ts | 6 +-
src/app/changelog/[slug]/page.tsx | 2 +-
src/app/changelog/page.tsx | 2 +-
src/app/page.tsx | 2 +-
src/components/emergency/emergencyInfo.tsx | 4 +-
src/components/home/chart.tsx | 37 +++---
src/components/home/header.tsx | 16 +--
src/components/home/homePage.tsx | 16 +--
src/components/home/profilePage.tsx | 2 +-
src/components/home/stats.tsx | 30 ++---
.../{infusionModal.tsx => treatmentModal.tsx} | 80 ++++++------
.../{infusionTable.tsx => treatmentTable.tsx} | 62 +++++-----
.../admin-db/{infusions.ts => treatments.ts} | 102 ++++++++--------
src/lib/admin-db/users.ts | 4 +-
src/lib/db/{infusions.ts => treatments.ts} | 20 +--
src/lib/helpers.ts | 18 +--
...nMutations.ts => useTreatmentMutations.ts} | 114 +++++++++---------
...nfusionsQuery.ts => useTreatmentsQuery.ts} | 26 ++--
src/lib/seed.ts | 43 +++----
22 files changed, 312 insertions(+), 302 deletions(-)
rename src/components/home/{infusionModal.tsx => treatmentModal.tsx} (85%)
rename src/components/home/{infusionTable.tsx => treatmentTable.tsx} (89%)
rename src/lib/admin-db/{infusions.ts => treatments.ts} (59%)
rename src/lib/db/{infusions.ts => treatments.ts} (71%)
rename src/lib/hooks/{useInfusionMutations.ts => useTreatmentMutations.ts} (54%)
rename src/lib/hooks/{useInfusionsQuery.ts => useTreatmentsQuery.ts} (67%)
diff --git a/next-env.d.ts b/next-env.d.ts
index a3e4680..c4e7c0e 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import './.next/dev/types/routes.d.ts'
+import './.next/types/routes.d.ts'
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/src/app/api/log-treatment/route.ts b/src/app/api/log-treatment/route.ts
index d470887..9078d7d 100644
--- a/src/app/api/log-treatment/route.ts
+++ b/src/app/api/log-treatment/route.ts
@@ -1,8 +1,8 @@
import type { NextRequest } from 'next/server'
import {
- getRecentUserInfusionsByApiKey,
- postInfusionByApiKey,
-} from '@/lib/admin-db/infusions'
+ getRecentUserTreatmentsByApiKey,
+ postTreatmentByApiKey,
+} from '@/lib/admin-db/treatments'
export async function POST(request: NextRequest) {
try {
@@ -16,24 +16,24 @@ export async function POST(request: NextRequest) {
const body = await request.json()
if (!body) {
- throw { message: 'Missing infusion data.' }
+ throw { message: 'Missing treatment data.' }
}
- const { infusions, error } = await getRecentUserInfusionsByApiKey(apikey)
+ const { treatments, error } = await getRecentUserTreatmentsByApiKey(apikey)
if (error) throw error
- const mostRecentInfusion =
- infusions && infusions.length > 0 ? infusions[0] : null
+ const mostRecentTreatment =
+ treatments && treatments.length > 0 ? treatments[0] : null
try {
- const { infusion, error } = await postInfusionByApiKey(
+ const { treatment, error } = await postTreatmentByApiKey(
apikey,
- mostRecentInfusion,
+ mostRecentTreatment,
body
)
if (error) throw error
- return Response.json(infusion)
+ return Response.json(treatment)
} catch (error: unknown) {
const errorMessage =
error &&
diff --git a/src/app/api/recent-treatments/route.ts b/src/app/api/recent-treatments/route.ts
index 37367e6..9d75c45 100644
--- a/src/app/api/recent-treatments/route.ts
+++ b/src/app/api/recent-treatments/route.ts
@@ -1,5 +1,5 @@
import type { NextRequest } from 'next/server'
-import { getRecentUserInfusionsByApiKey } from '@/lib/admin-db/infusions'
+import { getRecentUserTreatmentsByApiKey } from '@/lib/admin-db/treatments'
export async function GET(request: NextRequest) {
try {
@@ -11,7 +11,7 @@ export async function GET(request: NextRequest) {
throw { message: 'Access denied. Missing api key.' }
}
- const { infusions, error } = await getRecentUserInfusionsByApiKey(
+ const { treatments, error } = await getRecentUserTreatmentsByApiKey(
apikey || undefined,
alertid || undefined
)
@@ -20,7 +20,7 @@ export async function GET(request: NextRequest) {
throw error
}
- return Response.json(infusions)
+ return Response.json(treatments)
} catch (error: unknown) {
const errorMessage =
error &&
diff --git a/src/app/api/treatments/route.ts b/src/app/api/treatments/route.ts
index f612b98..e3a5431 100644
--- a/src/app/api/treatments/route.ts
+++ b/src/app/api/treatments/route.ts
@@ -1,5 +1,5 @@
import type { NextRequest } from 'next/server'
-import { getAllInfusionsByApiKey } from '@/lib/admin-db/infusions'
+import { getAllTreatmentsByApiKey } from '@/lib/admin-db/treatments'
export async function GET(request: NextRequest) {
try {
@@ -10,13 +10,13 @@ export async function GET(request: NextRequest) {
throw { message: 'Access denied. Missing api key.' }
}
- const { infusions, error } = await getAllInfusionsByApiKey(apikey)
+ const { treatments, error } = await getAllTreatmentsByApiKey(apikey)
if (error) {
throw error
}
- return Response.json(infusions)
+ return Response.json(treatments)
} catch (error: unknown) {
const errorMessage =
error &&
diff --git a/src/app/changelog/[slug]/page.tsx b/src/app/changelog/[slug]/page.tsx
index 8aa300e..50c1721 100644
--- a/src/app/changelog/[slug]/page.tsx
+++ b/src/app/changelog/[slug]/page.tsx
@@ -97,7 +97,7 @@ function getPostData(slug: string) {
The original Hemolog was built with the help of a contract
developer. This time around I've designed and built everything from
the ground up with the purpose of being the best place to store your
- infusion data and learn from it.
+ treatment data and learn from it.
>
),
diff --git a/src/app/changelog/page.tsx b/src/app/changelog/page.tsx
index 6171b36..89154bd 100644
--- a/src/app/changelog/page.tsx
+++ b/src/app/changelog/page.tsx
@@ -185,7 +185,7 @@ const Changelog = (): JSX.Element => {
The original Hemolog was built with the help of a contract
developer. This time around I've designed and built everything
from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
+ store your treatment data and learn from it.
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 0170084..17a636c 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -12,7 +12,7 @@ export default function Landing(): JSX.Element {
{/* Background illustration */}
{person.uid ? (
-
+
) : (
Warning
diff --git a/src/components/home/chart.tsx b/src/components/home/chart.tsx
index c9af157..2c2aac0 100644
--- a/src/components/home/chart.tsx
+++ b/src/components/home/chart.tsx
@@ -6,9 +6,9 @@ import {
XAxis,
YAxis,
} from 'recharts'
-import { TreatmentTypeEnum } from '@/lib/db/infusions'
-import { filterInfusions } from '@/lib/helpers'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { TreatmentTypeEnum } from '@/lib/db/treatments'
+import { filterTreatments } from '@/lib/helpers'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
type ChartDataEntry = {
month: string
@@ -24,27 +24,27 @@ interface ChartProps {
export default function Chart(props: ChartProps): JSX.Element | null {
const { filterYear } = props
- const { data } = useInfusionsQuery()
+ const { data } = useTreatmentsQuery()
if (!data) {
return null
}
- const filteredInfusions = filterInfusions(data, filterYear)
+ const filteredTreatments = filterTreatments(data, filterYear)
- const bleeds = filteredInfusions
+ const bleeds = filteredTreatments
.filter((entry) => entry.type === TreatmentTypeEnum.BLEED)
.map((bleed) => bleed.date)
- const preventative = filteredInfusions
+ const preventative = filteredTreatments
.filter((entry) => entry.type === TreatmentTypeEnum.PREVENTATIVE)
.map((preventitive) => preventitive.date)
- const prophy = filteredInfusions
+ const prophy = filteredTreatments
.filter((entry) => entry.type === TreatmentTypeEnum.PROPHY)
.map((prophy) => prophy.date)
- const antibody = filteredInfusions
+ const antibody = filteredTreatments
.filter((entry) => entry.type === TreatmentTypeEnum.ANTIBODY)
.map((antibody) => antibody.date)
@@ -72,22 +72,25 @@ export default function Chart(props: ChartProps): JSX.Element | null {
antibody: 0,
}))
- // Distribute infusions into months
+ // Distribute treatments into months
type NumericChartKeys = 'bleed' | 'preventative' | 'prophy' | 'antibody'
- const distributeInfusions = (infusions: string[], type: NumericChartKeys) => {
- for (const infusion of infusions) {
+ const distributeTreatments = (
+ treatments: string[],
+ type: NumericChartKeys
+ ) => {
+ for (const treatment of treatments) {
// Extract month from YYYY-MM-DD format (zero-based index)
- const monthIndex = Number.parseInt(infusion.split('-')[1], 10) - 1
+ const monthIndex = Number.parseInt(treatment.split('-')[1], 10) - 1
if (monthIndex >= 0 && monthIndex < 12) {
chartData[monthIndex][type] = chartData[monthIndex][type] + 1
}
}
}
- distributeInfusions(bleeds, 'bleed')
- distributeInfusions(preventative, 'preventative')
- distributeInfusions(prophy, 'prophy')
- distributeInfusions(antibody, 'antibody')
+ distributeTreatments(bleeds, 'bleed')
+ distributeTreatments(preventative, 'preventative')
+ distributeTreatments(prophy, 'prophy')
+ distributeTreatments(antibody, 'antibody')
// Calculate max Y value for proper scaling
const maxY = Math.max(
diff --git a/src/components/home/header.tsx b/src/components/home/header.tsx
index 4668a1e..48772fa 100644
--- a/src/components/home/header.tsx
+++ b/src/components/home/header.tsx
@@ -1,7 +1,7 @@
'use client'
import React from 'react'
-import InfusionModal from '@/components/home/infusionModal'
+import TreatmentModal from '@/components/home/treatmentModal'
import Logo from '@/components/shared/logo'
import { useAuth } from '@/lib/auth'
@@ -13,7 +13,7 @@ const Header = (props: Props): JSX.Element | null => {
const { version } = props
const { user, signout } = useAuth()
- const [infusionModal, setInfusionModal] = React.useState(false)
+ const [treatmentModal, setTreatmentModal] = React.useState(false)
const [isMobile, setIsMobile] = React.useState(false)
const [dropdownOpen, setDropdownOpen] = React.useState(false)
@@ -61,7 +61,7 @@ const Header = (props: Props): JSX.Element | null => {
{!isMobile && (
setInfusionModal(true)}
+ onClick={() => setTreatmentModal(true)}
className='bg-green-100 hover:bg-green-200 text-green-800 px-3 py-1.5 rounded text-sm font-medium transition-colors'
>
New treatment
@@ -124,17 +124,17 @@ const Header = (props: Props): JSX.Element | null => {
{isMobile && (
setInfusionModal(true)}
+ onClick={() => setTreatmentModal(true)}
className='w-full bg-green-100 hover:bg-green-200 text-green-800 px-4 py-3 rounded-lg font-medium transition-colors'
>
- Log infusion
+ Log treatment
)}
-
>
diff --git a/src/components/home/homePage.tsx b/src/components/home/homePage.tsx
index 4df80d1..e5969ac 100644
--- a/src/components/home/homePage.tsx
+++ b/src/components/home/homePage.tsx
@@ -4,9 +4,9 @@ import { IconFilter } from '@tabler/icons-react'
import { getYear } from 'date-fns'
import dynamic from 'next/dynamic'
import React, { useState } from 'react'
-import InfusionTable from '@/components/home/infusionTable'
import Stats from '@/components/home/stats'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import TreatmentTable from '@/components/home/treatmentTable'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
// Lazy load Chart component (includes recharts) - only loads when needed
const Chart = dynamic(() => import('@/components/home/chart'), {
@@ -26,9 +26,9 @@ const HomePage = (): JSX.Element => {
return () => window.removeEventListener('resize', checkMobile)
}, [])
- const { data } = useInfusionsQuery()
+ const { data } = useTreatmentsQuery()
- const infusionYears = data
+ const treatmentYears = data
? data
.filter((d) => d?.date)
.map((d) => getYear(new Date(d.date)))
@@ -101,17 +101,17 @@ const HomePage = (): JSX.Element => {
setFilterYear(e.target.value)}
>
{ALL_TIME}
- {!infusionYears.includes(Number.parseInt(THIS_YEAR, 10)) && (
+ {!treatmentYears.includes(Number.parseInt(THIS_YEAR, 10)) && (
{THIS_YEAR}
)}
- {infusionYears.map((year) => (
+ {treatmentYears.map((year) => (
{year}
@@ -135,7 +135,7 @@ const HomePage = (): JSX.Element => {
{smallerThanSmall && 'Swipe →'}
-
+
>
)
}
diff --git a/src/components/home/profilePage.tsx b/src/components/home/profilePage.tsx
index e7851f9..f7cb95b 100644
--- a/src/components/home/profilePage.tsx
+++ b/src/components/home/profilePage.tsx
@@ -130,7 +130,7 @@ const ProfilePage = (): JSX.Element => {
Delete account
- Deleting your account removes your profile, infusions, and emergency
+ Deleting your account removes your profile, treatments, and emergency
info forever. This action cannot be undone.
diff --git a/src/components/home/stats.tsx b/src/components/home/stats.tsx
index faae072..afcf344 100644
--- a/src/components/home/stats.tsx
+++ b/src/components/home/stats.tsx
@@ -2,9 +2,9 @@ import { useState } from 'react'
import _ from 'underscore'
import FeedbackModal from '@/components/home/feedbackModal'
import StatCard from '@/components/home/statCard'
-import { TreatmentTypeEnum } from '@/lib/db/infusions'
-import { filterInfusions } from '@/lib/helpers'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
+import { TreatmentTypeEnum } from '@/lib/db/treatments'
+import { filterTreatments } from '@/lib/helpers'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
// TODO(michael) move types to types file
type Value = string[]
@@ -15,7 +15,7 @@ interface ValueRanges {
values: Value[]
}
-export interface InfusionSheet {
+export interface TreatmentSheet {
error?: Error
spreadsheetId: string
valueRanges: ValueRanges[]
@@ -31,9 +31,9 @@ interface StatsProps {
export default function Stats(props: StatsProps): JSX.Element {
const { filterYear } = props
- const { data, isLoading, isError, error } = useInfusionsQuery()
+ const { data, isLoading, isError, error } = useTreatmentsQuery()
- const filteredInfusions = filterInfusions(data, filterYear)
+ const filteredTreatments = filterTreatments(data, filterYear)
// TODO(michael): Remove the feedback modal from this component at some point
// since we already use it in the footer, maybe figure out a way to share
@@ -73,10 +73,10 @@ export default function Stats(props: StatsProps): JSX.Element {
// Another idea could be to make all these cards individual components as the logic
// could get a lot more complicated for some of them.
- const numberOfInfusions = filteredInfusions.length
- const affectedAreas = filteredInfusions.map((entry) => entry.sites)
- const causes = filteredInfusions.map((entry) => entry.cause)
- const numberOfBleeds = filteredInfusions.filter(
+ const numberOfTreatments = filteredTreatments.length
+ const affectedAreas = filteredTreatments.map((entry) => entry.sites)
+ const causes = filteredTreatments.map((entry) => entry.cause)
+ const numberOfBleeds = filteredTreatments.filter(
(entry) => entry.type === TreatmentTypeEnum.BLEED
).length
const mostAffectedArea = _.chain(affectedAreas)
@@ -95,11 +95,11 @@ export default function Stats(props: StatsProps): JSX.Element {
.head()
.value()
- const consecutiveProphyInfusions = (): number => {
+ const consecutiveProphyTreatments = (): number => {
let longestStreak = 0
let currentStreak = 0
- for (const entry of filteredInfusions) {
+ for (const entry of filteredTreatments) {
const isProphy = entry.type === TreatmentTypeEnum.PROPHY
if (isProphy) {
@@ -118,7 +118,7 @@ export default function Stats(props: StatsProps): JSX.Element {
const getTotalUnits = () => {
let units = 0
- for (const entry of filteredInfusions) {
+ for (const entry of filteredTreatments) {
units += entry.medication.units
}
@@ -131,10 +131,10 @@ export default function Stats(props: StatsProps): JSX.Element {
return (
<>
-
+
void
// biome-ignore lint/suspicious/noExplicitAny: not sure what this should be
bindings: any
- infusion?: TreatmentType
+ treatment?: TreatmentType
}
-export default function InfusionModal(props: InfusionModalProps): JSX.Element {
- const { visible, setVisible, infusion } = props
+export default function TreatmentModal(
+ props: TreatmentModalProps
+): JSX.Element {
+ const { visible, setVisible, treatment } = props
const { user } = useAuth()
- const { data: infusions } = useInfusionsQuery()
- const { createInfusion, updateInfusion } = useInfusionMutations({
+ const { data: treatments } = useTreatmentsQuery()
+ const { createTreatment, updateTreatment } = useTreatmentMutations({
onCreateSuccess: () => closeModal(),
onUpdateSuccess: () => closeModal(),
})
- // Infusions are already sorted by the query hook (newest first)
- const previousInfusion = infusions?.[0]
+ // Treatments are already sorted by the query hook (newest first)
+ const previousTreatment = treatments?.[0]
- const handleCreateInfusion = async (infusionValues: InfusionValues) => {
- const infusionUser: AttachedUserType = {
+ const handleCreateTreatment = async (treatmentValues: TreatmentValues) => {
+ const treatmentUser: AttachedUserType = {
email: user?.email || '',
name: user?.name || '',
photoUrl: user?.photoUrl || '',
@@ -52,7 +54,7 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
}
// TODO:(michael) should probably move to toLocaleString()
- const { date, brand, lot, units, cause, sites, type } = infusionValues
+ const { date, brand, lot, units, cause, sites, type } = treatmentValues
const payload: TreatmentType = {
cause,
createdAt: new Date().toISOString(),
@@ -65,21 +67,21 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
},
sites,
type,
- user: infusionUser,
+ user: treatmentUser,
}
- createInfusion(payload)
+ createTreatment(payload)
}
- const handleUpdateInfusion = async (infusionValues: InfusionValues) => {
- const infusionUser: AttachedUserType = {
+ const handleUpdateTreatment = async (treatmentValues: TreatmentValues) => {
+ const treatmentUser: AttachedUserType = {
email: user?.email || '',
name: user?.name || '',
photoUrl: user?.photoUrl || '',
uid: user?.uid || '',
}
- const { uid, date, brand, lot, units, cause, sites, type } = infusionValues
+ const { uid, date, brand, lot, units, cause, sites, type } = treatmentValues
const payload: TreatmentType = {
cause,
createdAt: new Date().toISOString(),
@@ -92,11 +94,11 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
},
sites,
type,
- user: infusionUser,
+ user: treatmentUser,
}
if (uid) {
- updateInfusion({ uid, userUid: user?.uid || '', data: payload })
+ updateTreatment({ uid, userUid: user?.uid || '', data: payload })
} else {
toast.error('Treatment database entry not found')
}
@@ -107,37 +109,39 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
formik.resetForm()
}
- const displayInfusion = infusion ? infusion : previousInfusion
+ const displayTreatment = treatment ? treatment : previousTreatment
// TODO(michael) Add formik validation
const formik = useFormik({
initialValues: {
- brand: displayInfusion ? displayInfusion.medication.brand : '',
- cause: displayInfusion ? displayInfusion.cause : '',
+ brand: displayTreatment ? displayTreatment.medication.brand : '',
+ cause: displayTreatment ? displayTreatment.cause : '',
date:
- displayInfusion && infusion
- ? displayInfusion.date
+ displayTreatment && treatment
+ ? displayTreatment.date
: format(new Date(), 'yyyy-MM-dd'),
- lot: displayInfusion ? displayInfusion.medication.lot : '',
- sites: displayInfusion ? displayInfusion.sites : '',
- type: displayInfusion
- ? displayInfusion.type
+ lot: displayTreatment ? displayTreatment.medication.lot : '',
+ sites: displayTreatment ? displayTreatment.sites : '',
+ type: displayTreatment
+ ? displayTreatment.type
: (TreatmentTypeEnum.PROPHY as TreatmentTypeOptions),
- units: displayInfusion ? displayInfusion.medication.units.toString() : '',
- uid: displayInfusion ? displayInfusion.uid : null,
+ units: displayTreatment
+ ? displayTreatment.medication.units.toString()
+ : '',
+ uid: displayTreatment ? displayTreatment.uid : null,
},
enableReinitialize: true,
onSubmit: async (values) => {
- if (infusion) {
- await handleUpdateInfusion(values)
+ if (treatment) {
+ await handleUpdateTreatment(values)
} else {
- await handleCreateInfusion(values)
+ await handleCreateTreatment(values)
}
},
})
const handleSubmit = () => {
- track('Logged Infusion', {
+ track('Logged Treatment', {
type: formik.values.type,
})
formik.submitForm()
@@ -361,7 +365,7 @@ export default function InfusionModal(props: InfusionModalProps): JSX.Element {
{formik.isSubmitting && (
)}
- {infusion ? 'Update Treatment' : 'Log Treatment'}
+ {treatment ? 'Update Treatment' : 'Log Treatment'}
diff --git a/src/components/home/infusionTable.tsx b/src/components/home/treatmentTable.tsx
similarity index 89%
rename from src/components/home/infusionTable.tsx
rename to src/components/home/treatmentTable.tsx
index 13a6d65..66fa1fa 100644
--- a/src/components/home/infusionTable.tsx
+++ b/src/components/home/treatmentTable.tsx
@@ -13,45 +13,47 @@ import {
import { format, parseISO } from 'date-fns'
import { useCallback, useMemo, useState } from 'react'
import { useAuth } from '@/lib/auth'
-import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/infusions'
-import { filterInfusions } from '@/lib/helpers'
-import { useInfusionMutations } from '@/lib/hooks/useInfusionMutations'
-import { useInfusionsQuery } from '@/lib/hooks/useInfusionsQuery'
-import InfusionModal from './infusionModal'
+import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/treatments'
+import { filterTreatments } from '@/lib/helpers'
+import { useTreatmentMutations } from '@/lib/hooks/useTreatmentMutations'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+import TreatmentModal from './treatmentModal'
-interface InfusionTableProps {
+interface TreatmentTableProps {
limit?: number
uid?: string
filterYear: string
}
-export default function InfusionTable(props: InfusionTableProps): JSX.Element {
+export default function TreatmentTable(
+ props: TreatmentTableProps
+): JSX.Element {
const { limit, uid, filterYear } = props
const {
- data: infusions,
+ data: treatments,
isLoading,
isError,
error,
- } = useInfusionsQuery({ limit, uid })
+ } = useTreatmentsQuery({ limit, uid })
const { user } = useAuth()
- const { deleteInfusion } = useInfusionMutations()
- const [selectedInfusion, setSelectedInfusion] = useState()
- const [infusionModal, setInfusionModal] = useState(false)
+ const { deleteTreatment } = useTreatmentMutations()
+ const [selectedTreatment, setSelectedTreatment] = useState()
+ const [treatmentModal, setTreatmentModal] = useState(false)
const [sorting, setSorting] = useState([
{ id: 'date', desc: true },
])
- const filteredInfusions = filterInfusions(infusions, filterYear)
+ const filteredTreatments = filterTreatments(treatments, filterYear)
// Determine if user can edit/delete treatments
const isLoggedInUser = user && (!uid || uid === user.uid)
// Delete function - memoized to prevent column recreation
const deleteRow = useCallback(
- (infusionUid: string) => {
- deleteInfusion({ uid: infusionUid, userUid: user?.uid || '' })
+ (treatmentUid: string) => {
+ deleteTreatment({ uid: treatmentUid, userUid: user?.uid || '' })
},
- [deleteInfusion, user?.uid]
+ [deleteTreatment, user?.uid]
)
// Column definitions - memoized to prevent recreation on every render
@@ -121,7 +123,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
id: 'actions',
header: '',
cell: ({ row }) => {
- const infusion = row.original
+ const treatment = row.original
return (
{
- setSelectedInfusion(infusion)
- setInfusionModal(true)
+ setSelectedTreatment(treatment)
+ setTreatmentModal(true)
document.body.removeChild(menu)
}
deleteBtn.onclick = () => {
- if (infusion.uid) {
- deleteRow(infusion.uid)
+ if (treatment.uid) {
+ deleteRow(treatment.uid)
}
document.body.removeChild(menu)
}
@@ -194,7 +196,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
// Create the table instance - must be called before any early returns
const table = useReactTable({
- data: filteredInfusions,
+ data: filteredTreatments,
columns,
state: {
sorting,
@@ -244,7 +246,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
}
if (isError || error) {
- console.error('Error fetching infusions:', error)
+ console.error('Error fetching treatments:', error)
return (
Error
@@ -256,7 +258,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
}
// Show empty state if query completed successfully but no treatments found
- if (!infusions || infusions.length === 0) {
+ if (!treatments || treatments.length === 0) {
const emptyMessage = isLoggedInUser
? "You haven't logged any treatments yet. Add one by clicking 'New Treatment' above."
: 'This person has not logged any treatments yet.'
@@ -341,7 +343,7 @@ export default function InfusionTable(props: InfusionTableProps): JSX.Element {
{/* Pagination */}
- {filteredInfusions.length > 25 && (
+ {filteredTreatments.length > 25 && (
Showing {table.getRowModel().rows.length} of{' '}
- {filteredInfusions.length} treatments
+ {filteredTreatments.length} treatments
)}
{isLoggedInUser && (
-
)}
diff --git a/src/lib/admin-db/infusions.ts b/src/lib/admin-db/treatments.ts
similarity index 59%
rename from src/lib/admin-db/infusions.ts
rename to src/lib/admin-db/treatments.ts
index 9e6ddc7..921b12d 100644
--- a/src/lib/admin-db/infusions.ts
+++ b/src/lib/admin-db/treatments.ts
@@ -1,43 +1,43 @@
import { compareDesc, parseISO } from 'date-fns'
import { adminFirestore } from '@/lib/firebase-admin'
import type { AttachedUserType } from '@/lib/types/users'
-import { type TreatmentType, TreatmentTypeEnum } from '../db/infusions'
+import { type TreatmentType, TreatmentTypeEnum } from '../db/treatments'
-async function getAllInfusions() {
+async function getAllTreatments() {
const snapshot = await adminFirestore.collection('infusions').get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
snapshot.forEach((doc) => {
- infusions.push({ id: doc.id, ...doc.data() } as TreatmentType & {
+ treatments.push({ id: doc.id, ...doc.data() } as TreatmentType & {
id: string
})
})
- return { infusions }
+ return { treatments }
}
-async function getInfusion(infusionId: string) {
+async function getTreatment(treatmentId: string) {
const snapshot = await adminFirestore
.collection('infusions')
- .where('uid', '==', infusionId)
+ .where('uid', '==', treatmentId)
.get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
snapshot.forEach((doc) => {
- infusions.push({ id: doc.id, ...doc.data() } as TreatmentType & {
+ treatments.push({ id: doc.id, ...doc.data() } as TreatmentType & {
id: string
})
})
- infusions.sort((a: TreatmentType, b: TreatmentType) =>
+ treatments.sort((a: TreatmentType, b: TreatmentType) =>
compareDesc(parseISO(a.createdAt), parseISO(b.createdAt))
)
- return { infusions }
+ return { treatments }
}
-async function getAllInfusionsByApiKey(apiKey: string) {
+async function getAllTreatmentsByApiKey(apiKey: string) {
try {
const userSnapshot = await adminFirestore
.collection('users')
@@ -59,21 +59,21 @@ async function getAllInfusionsByApiKey(apiKey: string) {
.orderBy('date', 'desc')
.get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
snapshot.forEach((doc) => {
- infusions.push({ id: doc.id, ...doc.data() } as TreatmentType & {
+ treatments.push({ id: doc.id, ...doc.data() } as TreatmentType & {
id: string
})
})
- return { infusions }
+ return { treatments }
} catch (error) {
return { error }
}
}
-async function getRecentUserInfusionsByApiKey(
+async function getRecentUserTreatmentsByApiKey(
apiKey?: string,
alertId?: string
) {
@@ -95,37 +95,37 @@ async function getRecentUserInfusionsByApiKey(
.collection('infusions')
.where('user.uid', '==', user.uid)
.where('deletedAt', '==', null)
- // TODO: Need to add a timestamp value to each infusion and replace createdAt
+ // TODO: Need to add a timestamp value to each treatment and replace createdAt
// .orderBy('timestamp', 'asc')
// .limitToLast(3)
.get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
// TODO: Find out why I was adding an id here.
// The doc.id should already be available as the uid.
// Removing for now.
snapshot.forEach((doc) => {
- // infusions.push({ id: doc.id, ...doc.data() })
- infusions.push(doc.data() as TreatmentType)
+ // treatments.push({ id: doc.id, ...doc.data() })
+ treatments.push(doc.data() as TreatmentType)
})
// TODO: remove this hack after fixing the orderBy issue above
- infusions.sort((a: TreatmentType, b: TreatmentType) =>
+ treatments.sort((a: TreatmentType, b: TreatmentType) =>
compareDesc(parseISO(a.createdAt), parseISO(b.createdAt))
)
- infusions.length = 3
+ treatments.length = 3
- return { infusions }
+ return { treatments }
} catch (error) {
return { error }
}
}
-async function postInfusionByApiKey(
+async function postTreatmentByApiKey(
apiKey: string,
- lastInfusion: TreatmentType | null,
- newInfusion: Partial
+ lastTreatment: TreatmentType | null,
+ newTreatment: Partial
) {
try {
const userSnapshot = await adminFirestore
@@ -149,42 +149,42 @@ async function postInfusionByApiKey(
}
const now = new Date().toISOString()
- const baseInfusion: TreatmentType = lastInfusion
- ? { ...lastInfusion }
+ const baseTreatment: TreatmentType = lastTreatment
+ ? { ...lastTreatment }
: {
cause: '',
createdAt: now,
- date: newInfusion.date || now.slice(0, 10),
+ date: newTreatment.date || now.slice(0, 10),
deletedAt: null,
medication: {
- brand: newInfusion.medication?.brand || '',
- costPerUnit: newInfusion.medication?.costPerUnit,
- lot: newInfusion.medication?.lot,
- units: newInfusion.medication?.units || 0,
+ brand: newTreatment.medication?.brand || '',
+ costPerUnit: newTreatment.medication?.costPerUnit,
+ lot: newTreatment.medication?.lot,
+ units: newTreatment.medication?.units || 0,
},
sites: '',
- type: newInfusion.type || TreatmentTypeEnum.PROPHY,
- user: (newInfusion.user as AttachedUserType) || baseUser,
+ type: newTreatment.type || TreatmentTypeEnum.PROPHY,
+ user: (newTreatment.user as AttachedUserType) || baseUser,
}
const sanitizedBase = {
- ...baseInfusion,
+ ...baseTreatment,
createdAt: now,
- cause: baseInfusion.cause || '',
- sites: baseInfusion.sites || '',
+ cause: baseTreatment.cause || '',
+ sites: baseTreatment.sites || '',
deletedAt: null,
- user: baseInfusion.user || baseUser,
+ user: baseTreatment.user || baseUser,
}
delete (sanitizedBase as Partial).uid
- const infusion: TreatmentType = {
+ const treatment: TreatmentType = {
...sanitizedBase,
- ...newInfusion,
- user: (newInfusion.user as AttachedUserType) || sanitizedBase.user,
+ ...newTreatment,
+ user: (newTreatment.user as AttachedUserType) || sanitizedBase.user,
medication: {
...sanitizedBase.medication,
- ...(newInfusion.medication || {}),
+ ...(newTreatment.medication || {}),
},
createdAt: now,
deletedAt: null,
@@ -192,21 +192,21 @@ async function postInfusionByApiKey(
await adminFirestore
.collection('infusions')
- .add(infusion)
+ .add(treatment)
.then((docRef) => {
- docRef.set({ uid: docRef.id, ...infusion })
+ docRef.set({ uid: docRef.id, ...treatment })
})
- return { infusion: { message: 'Success' } }
+ return { treatment: { message: 'Success' } }
} catch (error) {
return { error }
}
}
export {
- getAllInfusions,
- getAllInfusionsByApiKey,
- getInfusion,
- getRecentUserInfusionsByApiKey,
- postInfusionByApiKey,
+ getAllTreatments,
+ getAllTreatmentsByApiKey,
+ getTreatment,
+ getRecentUserTreatmentsByApiKey,
+ postTreatmentByApiKey,
}
diff --git a/src/lib/admin-db/users.ts b/src/lib/admin-db/users.ts
index c6d4eca..240e96a 100644
--- a/src/lib/admin-db/users.ts
+++ b/src/lib/admin-db/users.ts
@@ -49,13 +49,13 @@ async function deleteUserAndData(uid: string) {
// Auth user deleted (or didn't exist), now safe to delete Firestore data
const userDocRef = adminFirestore.collection('users').doc(uid)
- const infusionSnapshot = await adminFirestore
+ const treatmentSnapshot = await adminFirestore
.collection('infusions')
.where('user.uid', '==', uid)
.get()
const docRefs: FirebaseFirestore.DocumentReference[] = [userDocRef]
- infusionSnapshot.forEach((docSnapshot) => {
+ treatmentSnapshot.forEach((docSnapshot) => {
docRefs.push(docSnapshot.ref)
})
diff --git a/src/lib/db/infusions.ts b/src/lib/db/treatments.ts
similarity index 71%
rename from src/lib/db/infusions.ts
rename to src/lib/db/treatments.ts
index 3d9beff..f8f61f9 100644
--- a/src/lib/db/infusions.ts
+++ b/src/lib/db/treatments.ts
@@ -39,33 +39,33 @@ export interface TreatmentType {
user: AttachedUserType
}
-// Create a new infusion document
-export async function createInfusion(data: TreatmentType): Promise {
+// Create a new treatment document
+export async function createTreatment(data: TreatmentType): Promise {
const docId = await createDocument('infusions', data)
return docId
}
-// Soft delete an infusion (sets deletedAt timestamp)
-export async function deleteInfusion(uid: string): Promise {
+// Soft delete a treatment (sets deletedAt timestamp)
+export async function deleteTreatment(uid: string): Promise {
await softDeleteDocument('infusions', uid)
}
-// Update an infusion document
-export async function updateInfusion(
+// Update a treatment document
+export async function updateTreatment(
uid: string,
newValues: Partial
): Promise {
await updateDocument('infusions', uid, newValues)
}
-// Fetch infusions for a user (used by TanStack Query)
-export async function fetchInfusions(
+// Fetch treatments for a user (used by TanStack Query)
+export async function fetchTreatments(
userUid: string
): Promise {
- const infusions = await getDocuments(
+ const treatments = await getDocuments(
'infusions',
where('user.uid', '==', userUid),
where('deletedAt', '==', null)
)
- return infusions
+ return treatments
}
diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts
index c5fba6f..c14ee09 100644
--- a/src/lib/helpers.ts
+++ b/src/lib/helpers.ts
@@ -12,25 +12,25 @@ export function track(event: string, data: Record) {
console.log('track', event, data)
}
-import type { TreatmentType } from './db/infusions'
+import type { TreatmentType } from './db/treatments'
-export function filterInfusions(
- infusions: TreatmentType[] | undefined,
+export function filterTreatments(
+ treatments: TreatmentType[] | undefined,
filterYear: string
): TreatmentType[] {
- if (!infusions) {
+ if (!treatments) {
return []
}
if (filterYear === 'All time') {
- return infusions
+ return treatments
}
- return infusions.filter((infusion) => {
- if (!infusion.date) {
+ return treatments.filter((treatment) => {
+ if (!treatment.date) {
return false
}
- const infusionYear = new Date(infusion.date).getFullYear().toString()
- return infusionYear === filterYear
+ const treatmentYear = new Date(treatment.date).getFullYear().toString()
+ return treatmentYear === filterYear
})
}
diff --git a/src/lib/hooks/useInfusionMutations.ts b/src/lib/hooks/useTreatmentMutations.ts
similarity index 54%
rename from src/lib/hooks/useInfusionMutations.ts
rename to src/lib/hooks/useTreatmentMutations.ts
index 6ba9ad3..8d9c68a 100644
--- a/src/lib/hooks/useInfusionMutations.ts
+++ b/src/lib/hooks/useTreatmentMutations.ts
@@ -1,61 +1,61 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'
import toast from 'react-hot-toast'
import {
- createInfusion,
- deleteInfusion,
+ createTreatment,
+ deleteTreatment,
type TreatmentType,
- updateInfusion,
-} from '@/lib/db/infusions'
-import { infusionKeys } from './useInfusionsQuery'
+ updateTreatment,
+} from '@/lib/db/treatments'
+import { treatmentKeys } from './useTreatmentsQuery'
-interface UseInfusionMutationsOptions {
+interface UseTreatmentMutationsOptions {
onCreateSuccess?: (docId: string) => void
onUpdateSuccess?: () => void
onDeleteSuccess?: () => void
onError?: (error: Error) => void
}
-export function useInfusionMutations(
- options: UseInfusionMutationsOptions = {}
+export function useTreatmentMutations(
+ options: UseTreatmentMutationsOptions = {}
) {
const queryClient = useQueryClient()
const { onCreateSuccess, onUpdateSuccess, onDeleteSuccess, onError } = options
- // Create infusion mutation with optimistic update
+ // Create treatment mutation with optimistic update
const createMutation = useMutation({
mutationFn: async (data: TreatmentType) => {
- const docId = await createInfusion(data)
+ const docId = await createTreatment(data)
return docId
},
- onMutate: async (newInfusion) => {
+ onMutate: async (newTreatment) => {
// Cancel any outgoing refetches
- await queryClient.cancelQueries({ queryKey: infusionKeys.all })
+ await queryClient.cancelQueries({ queryKey: treatmentKeys.all })
// Snapshot the previous value
- const userUid = newInfusion.user.uid
- const previousInfusions = queryClient.getQueryData(
- infusionKeys.list(userUid)
+ const userUid = newTreatment.user.uid
+ const previousTreatments = queryClient.getQueryData(
+ treatmentKeys.list(userUid)
)
// Optimistically update with a temporary ID
- const optimisticInfusion: TreatmentType = {
- ...newInfusion,
+ const optimisticTreatment: TreatmentType = {
+ ...newTreatment,
uid: `temp-${Date.now()}`,
}
queryClient.setQueryData(
- infusionKeys.list(userUid),
- (old) => (old ? [optimisticInfusion, ...old] : [optimisticInfusion])
+ treatmentKeys.list(userUid),
+ (old) => (old ? [optimisticTreatment, ...old] : [optimisticTreatment])
)
- return { previousInfusions, userUid }
+ return { previousTreatments, userUid }
},
- onError: (error, _newInfusion, context) => {
+ onError: (error, _newTreatment, context) => {
// Rollback on error
- if (context?.previousInfusions !== undefined) {
+ if (context?.previousTreatments !== undefined) {
queryClient.setQueryData(
- infusionKeys.list(context.userUid),
- context.previousInfusions
+ treatmentKeys.list(context.userUid),
+ context.previousTreatments
)
}
toast.error(
@@ -70,12 +70,12 @@ export function useInfusionMutations(
onSettled: (_data, _error, variables) => {
// Refetch to ensure consistency
queryClient.invalidateQueries({
- queryKey: infusionKeys.list(variables.user.uid),
+ queryKey: treatmentKeys.list(variables.user.uid),
})
},
})
- // Update infusion mutation with optimistic update
+ // Update treatment mutation with optimistic update
const updateMutation = useMutation({
mutationFn: async ({
uid,
@@ -86,32 +86,32 @@ export function useInfusionMutations(
userUid: string
data: Partial
}) => {
- await updateInfusion(uid, data)
+ await updateTreatment(uid, data)
return { uid, userUid, data }
},
onMutate: async ({ uid, userUid, data }) => {
- await queryClient.cancelQueries({ queryKey: infusionKeys.all })
+ await queryClient.cancelQueries({ queryKey: treatmentKeys.all })
- const previousInfusions = queryClient.getQueryData(
- infusionKeys.list(userUid)
+ const previousTreatments = queryClient.getQueryData(
+ treatmentKeys.list(userUid)
)
// Optimistically update
queryClient.setQueryData(
- infusionKeys.list(userUid),
+ treatmentKeys.list(userUid),
(old) =>
- old?.map((infusion) =>
- infusion.uid === uid ? { ...infusion, ...data } : infusion
+ old?.map((treatment) =>
+ treatment.uid === uid ? { ...treatment, ...data } : treatment
) ?? []
)
- return { previousInfusions, userUid }
+ return { previousTreatments, userUid }
},
onError: (error, _variables, context) => {
- if (context?.previousInfusions !== undefined) {
+ if (context?.previousTreatments !== undefined) {
queryClient.setQueryData(
- infusionKeys.list(context.userUid),
- context.previousInfusions
+ treatmentKeys.list(context.userUid),
+ context.previousTreatments
)
}
toast.error(
@@ -125,37 +125,37 @@ export function useInfusionMutations(
},
onSettled: (_data, _error, variables) => {
queryClient.invalidateQueries({
- queryKey: infusionKeys.list(variables.userUid),
+ queryKey: treatmentKeys.list(variables.userUid),
})
},
})
- // Delete infusion mutation with optimistic update (soft delete)
+ // Delete treatment mutation with optimistic update (soft delete)
const deleteMutation = useMutation({
mutationFn: async ({ uid, userUid }: { uid: string; userUid: string }) => {
- await deleteInfusion(uid)
+ await deleteTreatment(uid)
return { uid, userUid }
},
onMutate: async ({ uid, userUid }) => {
- await queryClient.cancelQueries({ queryKey: infusionKeys.all })
+ await queryClient.cancelQueries({ queryKey: treatmentKeys.all })
- const previousInfusions = queryClient.getQueryData(
- infusionKeys.list(userUid)
+ const previousTreatments = queryClient.getQueryData(
+ treatmentKeys.list(userUid)
)
// Optimistically remove from list
queryClient.setQueryData(
- infusionKeys.list(userUid),
- (old) => old?.filter((infusion) => infusion.uid !== uid) ?? []
+ treatmentKeys.list(userUid),
+ (old) => old?.filter((treatment) => treatment.uid !== uid) ?? []
)
- return { previousInfusions, userUid }
+ return { previousTreatments, userUid }
},
onError: (error, _variables, context) => {
- if (context?.previousInfusions !== undefined) {
+ if (context?.previousTreatments !== undefined) {
queryClient.setQueryData(
- infusionKeys.list(context.userUid),
- context.previousInfusions
+ treatmentKeys.list(context.userUid),
+ context.previousTreatments
)
}
toast.error(
@@ -169,22 +169,22 @@ export function useInfusionMutations(
},
onSettled: (_data, _error, variables) => {
queryClient.invalidateQueries({
- queryKey: infusionKeys.list(variables.userUid),
+ queryKey: treatmentKeys.list(variables.userUid),
})
},
})
return {
- createInfusion: createMutation.mutate,
- createInfusionAsync: createMutation.mutateAsync,
+ createTreatment: createMutation.mutate,
+ createTreatmentAsync: createMutation.mutateAsync,
isCreating: createMutation.isPending,
- updateInfusion: updateMutation.mutate,
- updateInfusionAsync: updateMutation.mutateAsync,
+ updateTreatment: updateMutation.mutate,
+ updateTreatmentAsync: updateMutation.mutateAsync,
isUpdating: updateMutation.isPending,
- deleteInfusion: deleteMutation.mutate,
- deleteInfusionAsync: deleteMutation.mutateAsync,
+ deleteTreatment: deleteMutation.mutate,
+ deleteTreatmentAsync: deleteMutation.mutateAsync,
isDeleting: deleteMutation.isPending,
isPending:
@@ -194,4 +194,4 @@ export function useInfusionMutations(
}
}
-export default useInfusionMutations
+export default useTreatmentMutations
diff --git a/src/lib/hooks/useInfusionsQuery.ts b/src/lib/hooks/useTreatmentsQuery.ts
similarity index 67%
rename from src/lib/hooks/useInfusionsQuery.ts
rename to src/lib/hooks/useTreatmentsQuery.ts
index d98586f..ade67a6 100644
--- a/src/lib/hooks/useInfusionsQuery.ts
+++ b/src/lib/hooks/useTreatmentsQuery.ts
@@ -1,22 +1,22 @@
import { useQuery } from '@tanstack/react-query'
import { compareDesc } from 'date-fns'
import { useAuth } from '@/lib/auth'
-import { fetchInfusions, type TreatmentType } from '@/lib/db/infusions'
+import { fetchTreatments, type TreatmentType } from '@/lib/db/treatments'
-// Query key factory for infusions
-export const infusionKeys = {
+// Query key factory for treatments
+export const treatmentKeys = {
all: ['infusions'] as const,
- list: (uid: string) => [...infusionKeys.all, uid] as const,
+ list: (uid: string) => [...treatmentKeys.all, uid] as const,
}
-interface UseInfusionsQueryOptions {
+interface UseTreatmentsQueryOptions {
limit?: number
uid?: string
// Polling interval in ms (default: no polling)
refetchInterval?: number
}
-interface InfusionQueryResult {
+interface TreatmentQueryResult {
data: TreatmentType[]
isLoading: boolean
isError: boolean
@@ -24,20 +24,20 @@ interface InfusionQueryResult {
refetch: () => void
}
-export function useInfusionsQuery(
- options: UseInfusionsQueryOptions = {}
-): InfusionQueryResult {
+export function useTreatmentsQuery(
+ options: UseTreatmentsQueryOptions = {}
+): TreatmentQueryResult {
const { limit: maxItems, uid: overrideUid, refetchInterval } = options
const { user } = useAuth()
const userUid = overrideUid ?? user?.uid
const query = useQuery({
- queryKey: infusionKeys.list(userUid ?? ''),
+ queryKey: treatmentKeys.list(userUid ?? ''),
queryFn: async () => {
if (!userUid) {
return []
}
- return fetchInfusions(userUid)
+ return fetchTreatments(userUid)
},
enabled: !!userUid,
refetchInterval,
@@ -45,7 +45,7 @@ export function useInfusionsQuery(
staleTime: 10 * 1000, // 10 seconds
})
- // Sort infusions by date (newest first) and apply limit
+ // Sort treatments by date (newest first) and apply limit
const sortedData = (query.data ?? [])
.slice()
.sort((a, b) => compareDesc(new Date(a.date), new Date(b.date)))
@@ -62,4 +62,4 @@ export function useInfusionsQuery(
}
// Hook alias for backward compatibility
-export default useInfusionsQuery
+export default useTreatmentsQuery
diff --git a/src/lib/seed.ts b/src/lib/seed.ts
index d9c732a..182225f 100644
--- a/src/lib/seed.ts
+++ b/src/lib/seed.ts
@@ -9,7 +9,7 @@ import {
type TreatmentType,
TreatmentTypeEnum,
type TreatmentTypeOptions,
-} from './db/infusions'
+} from './db/treatments'
import { adminFirestore } from './firebase-admin'
import type { Person } from './types/person'
import type { AttachedUserType } from './types/users'
@@ -50,12 +50,12 @@ function cleanUndefined(obj: T): Partial {
) as Partial
}
-async function seedInfusions(
+async function seedTreatments(
user: AttachedUserType,
medicationBrand: string,
count: number = 10
): Promise {
- const infusionTypes: TreatmentTypeOptions[] = [
+ const treatmentTypes: TreatmentTypeOptions[] = [
TreatmentTypeEnum.ANTIBODY,
TreatmentTypeEnum.PROPHY,
TreatmentTypeEnum.BLEED,
@@ -66,25 +66,26 @@ async function seedInfusions(
const causes = ['', 'Minor cut', 'Bruise', 'Joint pain', 'Preventive']
const now = new Date()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
for (let i = 0; i < count; i++) {
- // Spread infusions over the last 30 days
+ // Spread treatments over the last 30 days
const daysAgo = Math.floor((i / count) * 30)
- const infusionDate = new Date(now)
- infusionDate.setDate(infusionDate.getDate() - daysAgo)
+ const treatmentDate = new Date(now)
+ treatmentDate.setDate(treatmentDate.getDate() - daysAgo)
- const dateStr = infusionDate.toISOString().slice(0, 10)
- const createdAt = infusionDate.toISOString()
+ const dateStr = treatmentDate.toISOString().slice(0, 10)
+ const createdAt = treatmentDate.toISOString()
- const type = infusionTypes[Math.floor(Math.random() * infusionTypes.length)]
+ const type =
+ treatmentTypes[Math.floor(Math.random() * treatmentTypes.length)]
const site = sites[Math.floor(Math.random() * sites.length)]
const cause = causes[Math.floor(Math.random() * causes.length)]
// Vary units between 2000-4000
const units = Math.floor(Math.random() * 2000) + 2000
- const infusion: TreatmentType = {
+ const treatment: TreatmentType = {
deletedAt: null,
cause,
createdAt,
@@ -99,20 +100,20 @@ async function seedInfusions(
user,
}
- infusions.push(infusion)
+ treatments.push(treatment)
}
// Sort by date (oldest first) for more realistic ordering
- infusions.sort((a, b) => a.date.localeCompare(b.date))
+ treatments.sort((a, b) => a.date.localeCompare(b.date))
- // Create infusions in Firestore
- for (const infusion of infusions) {
- const cleanData = cleanUndefined(infusion)
+ // Create treatments in Firestore
+ for (const treatment of treatments) {
+ const cleanData = cleanUndefined(treatment)
const docRef = await adminFirestore.collection('infusions').add(cleanData)
await docRef.set({ uid: docRef.id, ...cleanData }, { merge: true })
}
- console.log(`✓ Created ${count} infusions for user ${user.name}`)
+ console.log(`✓ Created ${count} treatments for user ${user.name}`)
}
async function seedUser() {
@@ -182,7 +183,7 @@ async function seedUser() {
console.log('User data:', JSON.stringify(cleanData, null, 2))
}
- // Create AttachedUserType for infusions
+ // Create AttachedUserType for treatments
// Ensure uid matches what's stored in the Person document
const attachedUser: AttachedUserType = {
uid: userDocData.uid || userUid,
@@ -191,11 +192,11 @@ async function seedUser() {
photoUrl: userDocData.photoUrl || '',
}
- console.log(`Creating infusions with user.uid: ${attachedUser.uid}`)
+ console.log(`Creating treatments with user.uid: ${attachedUser.uid}`)
console.log(`Person document uid: ${userDocData.uid}`)
- // Create 10 infusions
- await seedInfusions(attachedUser, seedUserData.medication, 10)
+ // Create 10 treatments
+ await seedTreatments(attachedUser, seedUserData.medication, 10)
} catch (error) {
console.error('Error seeding user:', error)
process.exit(1)
From 3d93c9afc3eea724f1d4fadb1da472670a2e7ba5 Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Mon, 29 Dec 2025 12:57:05 -0800
Subject: [PATCH 08/15] rename factor to medication on table
---
next-env.d.ts | 2 +-
src/components/home/treatmentModal.tsx | 118 +++++++++++++++++++------
src/components/home/treatmentTable.tsx | 2 +-
3 files changed, 93 insertions(+), 29 deletions(-)
diff --git a/next-env.d.ts b/next-env.d.ts
index c4e7c0e..c4b7818 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import './.next/types/routes.d.ts'
+import "./.next/dev/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/src/components/home/treatmentModal.tsx b/src/components/home/treatmentModal.tsx
index 0bf731e..3b4c0ac 100644
--- a/src/components/home/treatmentModal.tsx
+++ b/src/components/home/treatmentModal.tsx
@@ -1,5 +1,6 @@
import { format } from 'date-fns'
import { useFormik } from 'formik'
+import { useEffect } from 'react'
import toast from 'react-hot-toast'
import { useAuth } from '@/lib/auth'
import {
@@ -55,17 +56,24 @@ export default function TreatmentModal(
// TODO:(michael) should probably move to toLocaleString()
const { date, brand, lot, units, cause, sites, type } = treatmentValues
+
+ // For antibody treatments, use monoclonal antibody from profile and clear cause/sites
+ const isAntibody = type === TreatmentTypeEnum.ANTIBODY
+ const medicationBrand = isAntibody
+ ? (user?.monoclonalAntibody || '')
+ : brand
+
const payload: TreatmentType = {
- cause,
+ cause: isAntibody ? '' : cause,
createdAt: new Date().toISOString(),
deletedAt: null,
date,
medication: {
- brand,
- lot,
- units: units ? parseInt(units, 10) : 0,
+ brand: medicationBrand,
+ lot: isAntibody ? undefined : lot,
+ units: isAntibody ? 0 : (units ? parseInt(units, 10) : 0),
},
- sites,
+ sites: isAntibody ? '' : sites,
type,
user: treatmentUser,
}
@@ -82,17 +90,24 @@ export default function TreatmentModal(
}
const { uid, date, brand, lot, units, cause, sites, type } = treatmentValues
+
+ // For antibody treatments, use monoclonal antibody from profile and clear cause/sites
+ const isAntibody = type === TreatmentTypeEnum.ANTIBODY
+ const medicationBrand = isAntibody
+ ? (user?.monoclonalAntibody || '')
+ : brand
+
const payload: TreatmentType = {
- cause,
+ cause: isAntibody ? '' : cause,
createdAt: new Date().toISOString(),
deletedAt: null,
date,
medication: {
- brand,
- lot,
- units: units ? parseInt(units, 10) : 0,
+ brand: medicationBrand,
+ lot: isAntibody ? undefined : lot,
+ units: isAntibody ? 0 : (units ? parseInt(units, 10) : 0),
},
- sites,
+ sites: isAntibody ? '' : sites,
type,
user: treatmentUser,
}
@@ -114,19 +129,31 @@ export default function TreatmentModal(
// TODO(michael) Add formik validation
const formik = useFormik({
initialValues: {
- brand: displayTreatment ? displayTreatment.medication.brand : '',
- cause: displayTreatment ? displayTreatment.cause : '',
+ brand: displayTreatment
+ ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? (user?.monoclonalAntibody || '')
+ : displayTreatment.medication.brand)
+ : '',
+ cause: displayTreatment
+ ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY ? '' : displayTreatment.cause)
+ : '',
date:
displayTreatment && treatment
? displayTreatment.date
: format(new Date(), 'yyyy-MM-dd'),
- lot: displayTreatment ? displayTreatment.medication.lot : '',
- sites: displayTreatment ? displayTreatment.sites : '',
+ lot: displayTreatment
+ ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY ? '' : (displayTreatment.medication.lot || ''))
+ : '',
+ sites: displayTreatment
+ ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY ? '' : displayTreatment.sites)
+ : '',
type: displayTreatment
? displayTreatment.type
: (TreatmentTypeEnum.PROPHY as TreatmentTypeOptions),
units: displayTreatment
- ? displayTreatment.medication.units.toString()
+ ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? '0'
+ : displayTreatment.medication.units.toString())
: '',
uid: displayTreatment ? displayTreatment.uid : null,
},
@@ -140,6 +167,22 @@ export default function TreatmentModal(
},
})
+ // Update brand to monoclonal antibody when type changes to ANTIBODY
+ useEffect(() => {
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY && user?.monoclonalAntibody) {
+ if (formik.values.brand !== user.monoclonalAntibody) {
+ formik.setFieldValue('brand', user.monoclonalAntibody)
+ }
+ // Ensure cause and sites are empty for antibody treatments
+ if (formik.values.cause !== '') {
+ formik.setFieldValue('cause', '')
+ }
+ if (formik.values.sites !== '') {
+ formik.setFieldValue('sites', '')
+ }
+ }
+ }, [formik.values.type, user?.monoclonalAntibody])
+
const handleSubmit = () => {
track('Logged Treatment', {
type: formik.values.type,
@@ -160,9 +203,15 @@ export default function TreatmentModal(
+ onClick={() => {
formik.setFieldValue('type', TreatmentTypeEnum.PROPHY)
- }
+ // Clear antibody-specific fields when switching away from antibody
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
+ formik.setFieldValue('brand', '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ }
+ }}
className={`px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
formik.values.type === TreatmentTypeEnum.PROPHY
? 'bg-yellow-100 text-yellow-800 border border-yellow-300'
@@ -173,9 +222,15 @@ export default function TreatmentModal(
+ onClick={() => {
formik.setFieldValue('type', TreatmentTypeEnum.BLEED)
- }
+ // Clear antibody-specific fields when switching away from antibody
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
+ formik.setFieldValue('brand', '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ }
+ }}
className={`px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
formik.values.type === TreatmentTypeEnum.BLEED
? 'bg-green-100 text-green-800 border border-green-300'
@@ -186,12 +241,15 @@ export default function TreatmentModal(
- formik.setFieldValue(
- 'type',
- TreatmentTypeEnum.PREVENTATIVE
- )
- }
+ onClick={() => {
+ formik.setFieldValue('type', TreatmentTypeEnum.PREVENTATIVE)
+ // Clear antibody-specific fields when switching away from antibody
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
+ formik.setFieldValue('brand', '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ }
+ }}
className={`px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
formik.values.type === TreatmentTypeEnum.PREVENTATIVE
? 'bg-red-100 text-red-800 border border-red-300'
@@ -205,9 +263,15 @@ export default function TreatmentModal(
{user?.monoclonalAntibody && (
+ onClick={() => {
formik.setFieldValue('type', TreatmentTypeEnum.ANTIBODY)
- }
+ // Set brand to monoclonal antibody and clear cause/sites when switching to antibody
+ formik.setFieldValue('brand', user?.monoclonalAntibody || '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ formik.setFieldValue('units', '0')
+ formik.setFieldValue('lot', '')
+ }}
className={`w-full px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
formik.values.type === TreatmentTypeEnum.ANTIBODY
? 'bg-blue-100 text-blue-800 border border-blue-300'
diff --git a/src/components/home/treatmentTable.tsx b/src/components/home/treatmentTable.tsx
index 66fa1fa..4299fbc 100644
--- a/src/components/home/treatmentTable.tsx
+++ b/src/components/home/treatmentTable.tsx
@@ -104,7 +104,7 @@ export default function TreatmentTable(
},
{
accessorKey: 'medication.brand',
- header: 'Factor',
+ header: 'Medication',
cell: ({ row }) => row.original.medication.brand,
},
{
From 3e099d6bd37fba2f21e02865cf71263ed50b594e Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Mon, 29 Dec 2025 12:59:00 -0800
Subject: [PATCH 09/15] adds firebase-tools back to dev deps
---
package.json | 1 +
pnpm-lock.yaml | 4337 +++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 4258 insertions(+), 80 deletions(-)
diff --git a/package.json b/package.json
index c94c0ce..f3f68e9 100644
--- a/package.json
+++ b/package.json
@@ -51,6 +51,7 @@
"autoprefixer": "^10.4.23",
"cypress": "^15.8.1",
"dotenv": "^17.2.3",
+ "firebase-tools": "^15.1.0",
"husky": "^7.0.4",
"lint-staged": "^12.5.0",
"react-hot-toast": "^2.6.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index af505b0..b37c68d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -87,6 +87,9 @@ importers:
dotenv:
specifier: ^17.2.3
version: 17.2.3
+ firebase-tools:
+ specifier: ^15.1.0
+ version: 15.1.0(@types/node@22.19.3)(encoding@0.1.13)(hono@4.11.3)(typescript@5.9.3)
husky:
specifier: ^7.0.4
version: 7.0.4
@@ -109,6 +112,19 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
+ '@apidevtools/json-schema-ref-parser@9.1.2':
+ resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==}
+
+ '@apphosting/build@0.1.7':
+ resolution: {integrity: sha512-zNgQGiAWDOj6c+4ylv5ej3nLGXzMAVmzCGMqlbSarHe4bvBmZ2C5GfBRdJksedP7C9pqlwTWpxU5+GSzhJ+nKA==}
+ hasBin: true
+
+ '@apphosting/common@0.0.8':
+ resolution: {integrity: sha512-RJu5gXs2HYV7+anxpVPpp04oXeuHbV3qn402AdXVlnuYM/uWo7aceqmngpfp6Bi376UzRqGjfpdwFHxuwsEGXQ==}
+
+ '@apphosting/common@0.0.9':
+ resolution: {integrity: sha512-ZbPZDcVhEN+8m0sf90PmQN4xWaKmmySnBSKKPaIOD0JvcDsRr509WenFEFlojP++VSxwFZDGG/TYsHs1FMMqpw==}
+
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
@@ -174,6 +190,18 @@ packages:
cpu: [x64]
os: [win32]
+ '@colors/colors@1.5.0':
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+
+ '@colors/colors@1.6.0':
+ resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
+ engines: {node: '>=0.1.90'}
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
'@cypress/request@3.0.9':
resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==}
engines: {node: '>= 6'}
@@ -181,10 +209,24 @@ packages:
'@cypress/xvfb@1.2.4':
resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==}
+ '@dabh/diagnostics@2.0.8':
+ resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==}
+
'@discoveryjs/json-ext@0.5.7':
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
+ '@electric-sql/pglite-tools@0.2.19':
+ resolution: {integrity: sha512-Ls4ZcSymnFRlEHtDyO3k9qPXLg7awfRAE3YnXk4WLsint17JBsU4UEX8le9YE8SgPkWNnQC898SqbFGGU/5JUA==}
+ peerDependencies:
+ '@electric-sql/pglite': 0.3.14
+
+ '@electric-sql/pglite@0.2.17':
+ resolution: {integrity: sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw==}
+
+ '@electric-sql/pglite@0.3.14':
+ resolution: {integrity: sha512-3DB258dhqdsArOI1fIt7cb9RpUOgcDg5hXWVgVHAeqVQ/qxtFy605QKs4gx6mFq3jWsSPqDN8TgSEsqC3OfV9Q==}
+
'@emnapi/runtime@1.7.1':
resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
@@ -428,6 +470,10 @@ packages:
'@firebase/webchannel-wrapper@1.0.5':
resolution: {integrity: sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==}
+ '@google-cloud/cloud-sql-connector@1.8.5':
+ resolution: {integrity: sha512-CXOGLf/BUhZu5SoWKN8YqzcVQh8NSJi8bbeU06lZCh8f7aiNRfEmG8mG9hQcrl14u/WCq40fkqwQjADJvcO+Tw==}
+ engines: {node: '>=18'}
+
'@google-cloud/firestore@7.11.6':
resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==}
engines: {node: '>=14.0.0'}
@@ -436,18 +482,42 @@ packages:
resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==}
engines: {node: '>=14.0.0'}
+ '@google-cloud/paginator@6.0.0':
+ resolution: {integrity: sha512-g5nmMnzC+94kBxOKkLGpK1ikvolTFCC3s2qtE4F+1EuArcJ7HHC23RDQVt3Ra3CqpUYZ+oXNKZ8n5Cn5yug8DA==}
+ engines: {node: '>=18'}
+
+ '@google-cloud/precise-date@5.0.0':
+ resolution: {integrity: sha512-9h0Gvw92EvPdE8AK8AgZPbMnH5ftDyPtKm7/KUfcJVaPEPjwGDsJd1QV0H8esBDV4II41R/2lDWH1epBqIoKUw==}
+ engines: {node: '>=18'}
+
'@google-cloud/projectify@4.0.0':
resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==}
engines: {node: '>=14.0.0'}
+ '@google-cloud/projectify@5.0.0':
+ resolution: {integrity: sha512-XXQLaIcLrOAMWvRrzz+mlUGtN6vlVNja3XQbMqRi/V7XJTAVwib3VcKd7oRwyZPkp7rBVlHGcaqdyGRrcnkhlA==}
+ engines: {node: '>=18'}
+
'@google-cloud/promisify@2.0.4':
resolution: {integrity: sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==}
engines: {node: '>=10'}
+ '@google-cloud/promisify@5.0.0':
+ resolution: {integrity: sha512-N8qS6dlORGHwk7WjGXKOSsLjIjNINCPicsOX6gyyLiYk7mq3MtII96NZ9N2ahwA2vnkLmZODOIH9rlNniYWvCQ==}
+ engines: {node: '>=18'}
+
+ '@google-cloud/pubsub@5.2.0':
+ resolution: {integrity: sha512-YNSRBo85mgPQ9QuuzAHjmLwngIwmy2RjAUAoPl2mOL2+bCM0cAVZswPb8ylcsWJP7PgDJlck+ybv0MwJ9AM0sg==}
+ engines: {node: '>=18'}
+
'@google-cloud/storage@7.18.0':
resolution: {integrity: sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==}
engines: {node: '>=14'}
+ '@googleapis/sqladmin@31.1.0':
+ resolution: {integrity: sha512-k4lXSFCFuZmWtYuW/OH/PcHimZP5P/uDLK0+ACbgoZFB8qmlgcyF0531aJt6JHIdBwCRlHXZlMW4LDC5Gqra5w==}
+ engines: {node: '>=12.0.0'}
+
'@grpc/grpc-js@1.14.1':
resolution: {integrity: sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==}
engines: {node: '>=12.10.0'}
@@ -466,6 +536,12 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ '@hono/node-server@1.19.7':
+ resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==}
+ engines: {node: '>=18.14.1'}
+ peerDependencies:
+ hono: ^4
+
'@img/colour@1.0.0':
resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
engines: {node: '>=18'}
@@ -603,6 +679,156 @@ packages:
cpu: [x64]
os: [win32]
+ '@inquirer/ansi@1.0.2':
+ resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/checkbox@4.3.2':
+ resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/confirm@5.1.21':
+ resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/core@10.3.2':
+ resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/editor@4.2.23':
+ resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/expand@4.0.23':
+ resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/figures@1.0.15':
+ resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.3.1':
+ resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/number@3.0.23':
+ resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/password@4.0.23':
+ resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.10.1':
+ resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/rawlist@4.1.11':
+ resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/search@3.2.2':
+ resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/select@4.4.2':
+ resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/type@3.0.10':
+ resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@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'}
+
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -619,9 +845,25 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
'@js-sdsl/ordered-map@4.4.2':
resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
+ '@jsdevtools/ono@7.1.3':
+ resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
+
+ '@modelcontextprotocol/sdk@1.25.1':
+ resolution: {integrity: sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@cfworker/json-schema': ^4.1.1
+ zod: ^3.25 || ^4.0
+ peerDependenciesMeta:
+ '@cfworker/json-schema':
+ optional: true
+
'@next/bundle-analyzer@16.1.1':
resolution: {integrity: sha512-aNJy301GGH8k36rDgrYdnyYEdjRQg6csMi1njzqHo+3qyZvOOWMHSv+p7SztNTzP5RU2KRwX0pPwYBtDcE+vVA==}
@@ -676,10 +918,52 @@ packages:
cpu: [x64]
os: [win32]
+ '@npmcli/agent@4.0.0':
+ resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ '@npmcli/fs@5.0.0':
+ resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ '@npmcli/promise-spawn@3.0.0':
+ resolution: {integrity: sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
+ '@opentelemetry/core@1.30.1':
+ resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/semantic-conventions@1.28.0':
+ resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/semantic-conventions@1.34.0':
+ resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==}
+ engines: {node: '>=14'}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@pnpm/config.env-replace@1.1.0':
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/network.ca-file@1.0.2':
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/npm-conf@2.3.1':
+ resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
+ engines: {node: '>=12'}
+
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
@@ -724,6 +1008,13 @@ packages:
react-redux:
optional: true
+ '@sindresorhus/is@4.6.0':
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+
+ '@so-ric/colorspace@1.1.6':
+ resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -862,6 +1153,21 @@ packages:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
+ '@tootallnate/quickjs-emscripten@0.23.0':
+ resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
+
+ '@tsconfig/node10@1.0.12':
+ resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@@ -918,6 +1224,9 @@ packages:
'@types/js-cookie@2.2.7':
resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
'@types/jsonwebtoken@9.0.10':
resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==}
@@ -977,6 +1286,9 @@ packages:
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+ '@types/triple-beam@1.3.5':
+ resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
+
'@types/underscore@1.13.0':
resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==}
@@ -986,10 +1298,22 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+ abbrev@4.0.0:
+ resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
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'}
+
+ accepts@2.0.0:
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+ engines: {node: '>= 0.6'}
+
acorn-walk@8.3.4:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
@@ -1011,6 +1335,28 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+ ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
@@ -1019,6 +1365,10 @@ packages:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
+ ansi-escapes@7.2.0:
+ resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==}
+ engines: {node: '>=18'}
+
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -1039,16 +1389,46 @@ packages:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
arch@2.2.0:
resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
+ archiver-utils@5.0.2:
+ resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==}
+ engines: {node: '>= 14'}
+
+ archiver@7.0.1:
+ resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
+ engines: {node: '>= 14'}
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ 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==}
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
arrify@2.0.1:
resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
engines: {node: '>=8'}
+ as-array@2.0.0:
+ resolution: {integrity: sha512-1Sd1LrodN0XYxYeZcN1J4xYZvmvTwD5tDWaPUGPIzH1mFsmzsPnVtd2exWhecMjtZk/wYWjNZJiD3b1SLCeJqg==}
+
asn1@0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
@@ -1056,13 +1436,23 @@ packages:
resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
engines: {node: '>=0.8'}
+ ast-types@0.13.4:
+ resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==}
+ engines: {node: '>=4'}
+
astral-regex@2.0.0:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
+ async-lock@1.4.1:
+ resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==}
+
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==}
@@ -1083,6 +1473,25 @@ packages:
aws4@1.13.2:
resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
+ b4a@1.7.3:
+ resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==}
+ peerDependencies:
+ react-native-b4a: '*'
+ peerDependenciesMeta:
+ react-native-b4a:
+ optional: true
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ bare-events@2.8.2:
+ resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==}
+ peerDependencies:
+ bare-abort-controller: '*'
+ peerDependenciesMeta:
+ bare-abort-controller:
+ optional: true
+
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -1090,18 +1499,54 @@ packages:
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
hasBin: true
+ basic-auth-connect@1.1.0:
+ resolution: {integrity: sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q==}
+
+ basic-auth@2.0.1:
+ resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
+ engines: {node: '>= 0.8'}
+
+ basic-ftp@5.1.0:
+ resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==}
+ engines: {node: '>=10.0.0'}
+
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
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'}
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
blob-util@2.0.2:
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
bluebird@3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ body-parser@1.20.4:
+ resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ body-parser@2.2.1:
+ resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==}
+ engines: {node: '>=18'}
+
+ boxen@5.1.2:
+ resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
+ engines: {node: '>=10'}
+
+ 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'}
@@ -1114,12 +1559,27 @@ packages:
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ buffer-crc32@1.0.0:
+ resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
+ engines: {node: '>=8.0.0'}
+
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ cacache@20.0.3:
+ resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
cachedir@2.4.0:
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
engines: {node: '>=6'}
@@ -1132,6 +1592,13 @@ packages:
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
engines: {node: '>= 0.4'}
+ call-me-maybe@1.0.2:
+ resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
caniuse-lite@1.0.30001761:
resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
@@ -1142,22 +1609,65 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ chownr@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
+
+ ci-info@2.0.0:
+ resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+
ci-info@4.3.1:
resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==}
engines: {node: '>=8'}
+ cjson@0.3.3:
+ resolution: {integrity: sha512-yKNcXi/Mvi5kb1uK0sahubYiyfUO2EUgOp4NcY9+8NX5Xmc+4yeNogZuLFkpLBBj7/QI9MjRUIuXrV9XOw5kVg==}
+ engines: {node: '>= 0.3.0'}
+
clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
+ cli-boxes@2.2.1:
+ resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
+ engines: {node: '>=6'}
+
cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
+ cli-highlight@2.1.11:
+ resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==}
+ engines: {node: '>=8.0.0', npm: '>=5.0.0'}
+ hasBin: true
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
cli-table3@0.6.1:
resolution: {integrity: sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==}
engines: {node: 10.* || >= 12.*}
+ cli-table3@0.6.5:
+ resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ engines: {node: 10.* || >= 12.*}
+
cli-truncate@2.1.0:
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
engines: {node: '>=8'}
@@ -1166,13 +1676,24 @@ packages:
resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+ cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
@@ -1181,9 +1702,25 @@ packages:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
+ color-convert@3.1.3:
+ resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==}
+ engines: {node: '>=14.6'}
+
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ color-name@2.1.0:
+ resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==}
+ engines: {node: '>=12.20'}
+
+ color-string@2.1.4:
+ resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==}
+ engines: {node: '>=18'}
+
+ color@5.0.3:
+ resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
+ engines: {node: '>=18'}
+
colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
@@ -1195,9 +1732,24 @@ packages:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
- commander@6.2.1:
- resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
- engines: {node: '>= 6'}
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commander@5.1.0:
+ resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
+ engines: {node: '>= 6'}
+
+ commander@6.2.1:
+ resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
+ engines: {node: '>= 6'}
commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
@@ -1211,19 +1763,96 @@ packages:
resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
engines: {node: '>=4.0.0'}
+ compress-commons@6.0.2:
+ resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
+ engines: {node: '>= 14'}
+
+ 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'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
+ configstore@5.0.1:
+ resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
+ engines: {node: '>=8'}
+
+ connect@3.7.0:
+ resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
+ engines: {node: '>= 0.10.0'}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-disposition@1.0.1:
+ resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==}
+ engines: {node: '>=18'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ cookie-signature@1.0.7:
+ resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==}
+
+ cookie-signature@1.2.2:
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+ engines: {node: '>=6.6.0'}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
core-util-is@1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ crc-32@1.2.2:
+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+
+ crc32-stream@6.0.0:
+ resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
+ engines: {node: '>= 14'}
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+ cross-env@7.0.3:
+ resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+ engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+ hasBin: 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'}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+ csv-parse@5.6.0:
+ resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==}
+
cypress@15.8.1:
resolution: {integrity: sha512-ogc62stTQGh1395ipKxfCE5hQuSApTzeH5e0d9U6m7wYO9HQeCpgnkYtBtd0MbkN2Fnch5Od2mX9u4hoTlrH4Q==}
engines: {node: ^20.1.0 || ^22.0.0 || >=24.0.0}
@@ -1277,6 +1906,14 @@ packages:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
+ data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+
+ data-uri-to-buffer@6.0.2:
+ resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==}
+ engines: {node: '>= 14'}
+
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -1287,6 +1924,14 @@ packages:
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+ 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:
@@ -1295,6 +1940,15 @@ packages:
supports-color:
optional: true
+ debug@4.3.1:
+ resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -1307,25 +1961,64 @@ packages:
decimal.js-light@2.5.1:
resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
+ deep-equal-in-any-order@2.1.0:
+ resolution: {integrity: sha512-9FklcFjcehm1yBWiOYtmazJOiMbT+v81Kq6nThIuXbWLWIZMX3ZI+QoLf7wCi0T8XzTAXf6XqEdEyVrjZkhbGA==}
+
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ deep-freeze@0.0.1:
+ resolution: {integrity: sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
deepmerge@2.2.1:
resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==}
engines: {node: '>=0.10.0'}
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ 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}
+
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ discontinuous-range@1.0.0:
+ resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==}
+
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
@@ -1349,6 +2042,9 @@ packages:
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
electron-to-chromium@1.5.267:
resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
@@ -1358,6 +2054,20 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ emojilib@2.4.0:
+ resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==}
+
+ enabled@2.0.0:
+ resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
+
+ 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'}
+
encoding@0.1.13:
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
@@ -1372,6 +2082,17 @@ packages:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ err-code@2.0.3:
+ resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
+
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -1395,6 +2116,13 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
+ escape-goat@2.1.1:
+ resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
+ engines: {node: '>=8'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
escape-string-regexp@1.0.5:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
@@ -1403,6 +2131,28 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
+ escodegen@2.1.0:
+ resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+ engines: {node: '>=6.0'}
+ hasBin: true
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ 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'}
@@ -1413,6 +2163,24 @@ packages:
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ events-listener@1.1.0:
+ resolution: {integrity: sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==}
+
+ events-universal@1.0.1:
+ resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ eventsource-parser@3.0.6:
+ resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
+ engines: {node: '>=18.0.0'}
+
+ eventsource@3.0.7:
+ resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
+ engines: {node: '>=18.0.0'}
+
execa@4.1.0:
resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
engines: {node: '>=10'}
@@ -1425,6 +2193,31 @@ packages:
resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
engines: {node: '>=4'}
+ exegesis-express@4.0.0:
+ resolution: {integrity: sha512-V2hqwTtYRj0bj43K4MCtm0caD97YWkqOUHFMRCBW5L1x9IjyqOEc7Xa4oQjjiFbeFOSQzzwPV+BzXsQjSz08fw==}
+ engines: {node: '>=6.0.0', npm: '>5.0.0'}
+
+ exegesis@4.3.0:
+ resolution: {integrity: sha512-V90IJQ4XYO1SfH5qdJTOijXkQTF3hSpSHHqlf7MstUMDKP22iAvi63gweFLtPZ4Gj3Wnh8RgJX5TGu0WiwTyDQ==}
+ engines: {node: '>=10.0.0', npm: '>5.0.0'}
+
+ exponential-backoff@3.1.3:
+ resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
+
+ express-rate-limit@7.5.1:
+ resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ express: '>= 4.11'
+
+ express@4.22.1:
+ resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==}
+ engines: {node: '>= 0.10.0'}
+
+ express@5.2.1:
+ resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
+ engines: {node: '>= 18'}
+
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -1444,6 +2237,12 @@ packages:
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-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
@@ -1455,21 +2254,65 @@ packages:
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
+
+ fecha@4.2.3:
+ resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
+
+ fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+
figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
+ filesize@6.4.0:
+ resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==}
+ engines: {node: '>= 0.4.0'}
+
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
+ finalhandler@1.1.2:
+ resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
+ engines: {node: '>= 0.8'}
+
+ finalhandler@1.3.2:
+ resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==}
+ engines: {node: '>= 0.8'}
+
+ finalhandler@2.1.1:
+ resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
+ engines: {node: '>= 18.0.0'}
+
firebase-admin@12.7.0:
resolution: {integrity: sha512-raFIrOyTqREbyXsNkSHyciQLfv8AUZazehPaQS1lZBSCDYW74FYXU0nQZa3qHI4K+hawohlDbywZ4+qce9YNxA==}
engines: {node: '>=14'}
+ firebase-tools@15.1.0:
+ resolution: {integrity: sha512-sVDiFTXiRd2tszJzttb6e5yzhJdljIVm8Q0Atg6MyHMirJrvrOJzxPis9MAg/R6RrfLo/+oYgx83suZfAAimPw==}
+ engines: {node: '>=20.0.0 || >=22.0.0 || >=24.0.0'}
+ hasBin: true
+
firebase@12.7.0:
resolution: {integrity: sha512-ZBZg9jFo8uH4Emd7caOqtalKJfDGHnHQSrCPiqRAdTFQd0wL3ERilUBfhnhBLnlernugkN/o7nJa0p+sE71Izg==}
+ fn.name@1.1.0:
+ resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
+
+ foreground-child@3.3.1:
+ resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+ engines: {node: '>=14'}
+
forever-agent@0.6.1:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
@@ -1481,32 +2324,73 @@ packages:
resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
engines: {node: '>= 6'}
+ formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+
formik@2.4.9:
resolution: {integrity: sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==}
peerDependencies:
react: '>=16.8.0'
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
fraction.js@5.3.4:
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
+ 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-minipass@3.0.3:
+ resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.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]
+
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
functional-red-black-tree@1.0.1:
resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+ fuzzy@0.1.3:
+ resolution: {integrity: sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==}
+ engines: {node: '>= 0.6.0'}
+
gaxios@6.7.1:
resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==}
engines: {node: '>=14'}
+ gaxios@7.1.3:
+ resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==}
+ engines: {node: '>=18'}
+
gcp-metadata@6.1.1:
resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==}
engines: {node: '>=14'}
+ gcp-metadata@8.1.2:
+ resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==}
+ engines: {node: '>=18'}
+
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -1527,9 +2411,31 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
+ get-uri@6.0.5:
+ resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==}
+ engines: {node: '>= 14'}
+
getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-slash@1.0.0:
+ resolution: {integrity: sha512-ZwFh34WZhZX28ntCMAP1mwyAJkn8+Omagvt/GvA+JQM/qgT0+MR2NPF3vhvgdshfdvDyGZXs8fPXW84K32Wjuw==}
+
+ glob-slasher@1.0.1:
+ resolution: {integrity: sha512-5MUzqFiycIKLMD1B0dYOE4hGgLLUZUNGGYO4BExdwT32wUwW3DBOE7lMQars7vB1q43Fb3Tyt+HmgLKsJhDYdg==}
+
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+ hasBin: true
+
+ glob@13.0.0:
+ resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==}
+ engines: {node: 20 || >=22}
+
global-dirs@3.0.1:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
@@ -1539,6 +2445,10 @@ packages:
peerDependencies:
csstype: ^3.0.10
+ google-auth-library@10.5.0:
+ resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==}
+ engines: {node: '>=18'}
+
google-auth-library@9.15.1:
resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
engines: {node: '>=14'}
@@ -1547,14 +2457,29 @@ packages:
resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==}
engines: {node: '>=14'}
+ google-gax@5.0.6:
+ resolution: {integrity: sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==}
+ engines: {node: '>=18'}
+
google-logging-utils@0.0.2:
resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==}
engines: {node: '>=14'}
+ google-logging-utils@1.1.3:
+ resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==}
+ engines: {node: '>=14'}
+
+ googleapis-common@8.0.2-rc.0:
+ resolution: {integrity: sha512-JTcxRvmFa9Ec1uyfMEimEMeeKq1sHNZX3vn2qmoUMtnvixXXvcqTcbDZvEZXkEWpGlPlOf4joyep6/qs0BrLyg==}
+ engines: {node: '>=18.0.0'}
+
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
+ graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -1562,6 +2487,10 @@ packages:
resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==}
engines: {node: '>=14.0.0'}
+ gtoken@8.0.0:
+ resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==}
+ engines: {node: '>=18'}
+
gzip-size@6.0.0:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
@@ -1578,6 +2507,10 @@ packages:
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
engines: {node: '>= 0.4'}
+ has-yarn@2.1.0:
+ resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
+ engines: {node: '>=8'}
+
hasha@5.2.2:
resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==}
engines: {node: '>=8'}
@@ -1586,15 +2519,37 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ heap-js@2.7.1:
+ resolution: {integrity: sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA==}
+ engines: {node: '>=10.0.0'}
+
+ highlight.js@10.7.3:
+ resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ hono@4.11.3:
+ resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==}
+ engines: {node: '>=16.9.0'}
+
+ hosted-git-info@7.0.2:
+ resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
html-entities@2.6.0:
resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
http-parser-js@0.5.10:
resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
@@ -1602,6 +2557,10 @@ packages:
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'}
+
http-signature@1.4.0:
resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==}
engines: {node: '>=0.10'}
@@ -1627,37 +2586,94 @@ packages:
engines: {node: '>=12'}
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.1:
+ resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==}
+ engines: {node: '>=0.10.0'}
+
idb@7.1.1:
resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
immer@10.2.0:
resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==}
immer@11.1.0:
resolution: {integrity: sha512-dlzb07f5LDY+tzs+iLCSXV2yuhaYfezqyZQc+n6baLECWkOMEWxkECAOnXL0ba7lsA25fM9b2jtzpu/uxo1a7g==}
+ import-lazy@2.1.0:
+ resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
+ engines: {node: '>=4'}
+
+ 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'}
+ infer-owner@1.0.4:
+ resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
+
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
ini@2.0.0:
resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
engines: {node: '>=10'}
+ install-artifact-from-github@1.4.0:
+ resolution: {integrity: sha512-+y6WywKZREw5rq7U2jvr2nmZpT7cbWbQQ0N/qfcseYnzHFz2cZz1Et52oY+XttYuYeTkI8Y+R2JNWj68MpQFSg==}
+ hasBin: true
+
internmap@2.0.3:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
+ ip-address@10.1.0:
+ resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
+ engines: {node: '>= 12'}
+
+ ip-regex@4.3.0:
+ resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==}
+ engines: {node: '>=8'}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
+ is-ci@2.0.0:
+ resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
+ hasBin: true
+
+ 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'}
@@ -1666,14 +2682,34 @@ packages:
resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
engines: {node: '>=12'}
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
is-installed-globally@0.4.0:
resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
engines: {node: '>=10'}
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-npm@5.0.0:
+ resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==}
+ engines: {node: '>=10'}
+
+ is-number@2.1.0:
+ resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==}
+ engines: {node: '>=0.10.0'}
+
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'}
@@ -1682,6 +2718,12 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
+ is-stream-ended@0.1.4:
+ resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==}
+
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
@@ -1693,31 +2735,90 @@ packages:
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
engines: {node: '>=10'}
+ is-url@1.2.4:
+ resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+
+ is-wsl@1.1.0:
+ resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
+ engines: {node: '>=4'}
+
+ is-yarn-global@0.3.0:
+ resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
+
+ is2@2.0.9:
+ resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==}
+ engines: {node: '>=v0.10.0'}
+
+ isarray@0.0.1:
+ resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ isexe@3.1.1:
+ resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
+ engines: {node: '>=16'}
+
+ isomorphic-fetch@3.0.0:
+ resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
+
isstream@0.1.2:
resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
+ jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+
+ join-path@1.1.1:
+ resolution: {integrity: sha512-jnt9OC34sLXMLJ6YfPQ2ZEKrR9mB5ZbSnQb4LPaOx1c5rTzxpR33L18jjp0r75mGGTJmsil3qwN1B5IBeTnSSA==}
+
jose@4.15.9:
resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+ jose@6.1.3:
+ resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==}
+
js-cookie@2.2.1:
resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
+ hasBin: true
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
jsbn@0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
json-bigint@1.0.0:
resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
+ json-parse-helpfulerror@1.0.3:
+ resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==}
+
+ json-ptr@3.1.1:
+ resolution: {integrity: sha512-SiSJQ805W1sDUCD1+/t1/1BIrveq2Fe9HJqENxZmMCILmrPI7WhS/pePpIOx85v6/H2z1Vy7AI08GV2TzfXocg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-schema-typed@8.0.2:
+ resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
+
json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
@@ -1742,12 +2843,30 @@ packages:
resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==}
engines: {node: '>=14'}
- jws@4.0.0:
- resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
-
jws@4.0.1:
resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==}
+ kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+
+ kuler@2.0.0:
+ resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
+
+ lazystream@1.0.1:
+ resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
+ engines: {node: '>= 0.6.3'}
+
+ leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+
+ libsodium-wrappers@0.7.15:
+ resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==}
+
+ libsodium@0.7.15:
+ resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==}
+
lightningcss-android-arm64@1.30.2:
resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
engines: {node: '>= 12.0.0'}
@@ -1851,6 +2970,9 @@ packages:
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+ lodash._objecttypes@2.4.1:
+ resolution: {integrity: sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==}
+
lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
@@ -1869,15 +2991,24 @@ packages:
lodash.isnumber@3.0.3:
resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
+ lodash.isobject@2.4.1:
+ resolution: {integrity: sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==}
+
lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
lodash.isstring@4.0.1:
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+ lodash.mapvalues@4.6.0:
+ resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==}
+
lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+ lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@@ -1889,6 +3020,10 @@ packages:
resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
engines: {node: '>=10'}
+ logform@2.7.0:
+ resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
+ engines: {node: '>= 12.0.0'}
+
long@5.3.2:
resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
@@ -1896,13 +3031,27 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
- lru-cache@6.0.0:
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@11.2.4:
+ resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==}
+ engines: {node: 20 || >=22}
+
+ 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'}
+
lru-memoizer@2.3.0:
resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==}
+ lsofi@1.0.0:
+ resolution: {integrity: sha512-MKr9vM1MSm+TSKfI05IYxpKV1NCxpJaBLnELyIf784zYJ5KV9lGCE1EvpA2DtXDNM3fCuFeCwXUzim/fyQRi+A==}
+
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
@@ -1910,13 +3059,54 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ make-dir@3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ make-fetch-happen@15.0.3:
+ resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ marked-terminal@7.3.0:
+ resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ marked: '>=1 <16'
+
+ marked@13.0.3:
+ resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==}
+ engines: {node: '>= 18'}
+ hasBin: true
+
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'}
+
+ media-typer@1.1.0:
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+ engines: {node: '>= 0.8'}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ merge-descriptors@2.0.0:
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+ engines: {node: '>=18'}
+
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ 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'}
@@ -1925,10 +3115,28 @@ packages:
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-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mime@2.6.0:
+ resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
+ engines: {node: '>=4.0.0'}
+ hasBin: true
+
mime@3.0.0:
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
engines: {node: '>=10.0.0'}
@@ -1938,21 +3146,115 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
+ minimatch@10.1.1:
+ resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
+ 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@6.2.0:
+ resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==}
+ 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-collect@2.0.1:
+ resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minipass-fetch@5.0.0:
+ resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ minipass-flush@1.0.5:
+ resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
+ engines: {node: '>= 8'}
+
+ minipass-pipeline@1.2.4:
+ resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==}
+ engines: {node: '>=8'}
+
+ minipass-sized@1.0.3:
+ resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==}
+ engines: {node: '>=8'}
+
+ minipass@3.3.6:
+ resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+ engines: {node: '>=8'}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minizlib@3.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
+
+ moo@0.5.2:
+ resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
+
+ morgan@1.10.1:
+ resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==}
+ engines: {node: '>= 0.8.0'}
+
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ nan@2.24.0:
+ resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==}
+
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nearley@2.20.1:
+ resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
+ 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'}
+
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
+ netmask@2.0.2:
+ resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
+ engines: {node: '>= 0.4.0'}
+
next@16.1.1:
resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==}
engines: {node: '>=20.9.0'}
@@ -1974,6 +3276,15 @@ packages:
sass:
optional: true
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ deprecated: Use your platform's native DOMException instead
+
+ node-emoji@2.2.0:
+ resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==}
+ engines: {node: '>=18'}
+
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
@@ -1983,17 +3294,47 @@ packages:
encoding:
optional: true
+ node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
node-forge@1.3.1:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
engines: {node: '>= 6.13.0'}
+ node-gyp@12.1.0:
+ resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+ hasBin: true
+
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+ nopt@9.0.0:
+ resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+ hasBin: true
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
+ npm-install-checks@6.3.0:
+ resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-normalize-package-bin@3.0.1:
+ resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-package-arg@11.0.3:
+ resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ npm-pick-manifest@9.1.0:
+ resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
@@ -2010,20 +3351,50 @@ packages:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
+ on-finished@2.3.0:
+ resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
+ engines: {node: '>= 0.8'}
+
+ 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==}
+ one-time@1.0.0:
+ resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
+
onetime@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
+ open@6.4.0:
+ resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==}
+ engines: {node: '>=8'}
+
+ openapi3-ts@3.2.0:
+ resolution: {integrity: sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg==}
+
opener@1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
ospath@1.2.2:
resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
+ p-defer@3.0.0:
+ resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==}
+ engines: {node: '>=8'}
+
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
@@ -2032,16 +3403,102 @@ packages:
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
engines: {node: '>=10'}
+ p-map@7.0.4:
+ resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
+ engines: {node: '>=18'}
+
+ p-throttle@7.0.0:
+ resolution: {integrity: sha512-aio0v+S0QVkH1O+9x4dHtD4dgCExACcL+3EtNaGqC01GBudS9ijMuUsmN8OVScyV4OOp0jqdLShZFuSlbL/AsA==}
+ engines: {node: '>=18'}
+
+ 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==}
+
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
+
+ parse5@5.1.1:
+ resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==}
+
+ parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-scurry@2.0.1:
+ resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==}
+ engines: {node: 20 || >=22}
+
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+ path-to-regexp@1.9.0:
+ resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==}
+
+ path-to-regexp@8.3.0:
+ resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
+
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
performance-now@2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ pg-cloudflare@1.2.7:
+ resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==}
+
+ pg-connection-string@2.9.1:
+ resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==}
+
+ pg-gateway@0.3.0-beta.4:
+ resolution: {integrity: sha512-CTjsM7Z+0Nx2/dyZ6r8zRsc3f9FScoD5UAOlfUx1Fdv/JOIWvRbF7gou6l6vP+uypXQVoYPgw8xZDXgMGvBa4Q==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.10.1:
+ resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.10.3:
+ resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.16.3:
+ resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -2049,6 +3506,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
pidtree@0.5.0:
resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==}
engines: {node: '>=0.10'}
@@ -2058,6 +3519,14 @@ packages:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
+ pkce-challenge@5.0.1:
+ resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
+ engines: {node: '>=16.20.0'}
+
+ portfinder@1.0.38:
+ resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==}
+ engines: {node: '>= 10.12'}
+
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@@ -2069,6 +3538,22 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.1:
+ resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
pretty-bytes@5.6.0:
resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
engines: {node: '>=6'}
@@ -2077,27 +3562,71 @@ packages:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+ proc-log@4.2.0:
+ resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ proc-log@6.1.0:
+ resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
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'}
+
+ promise-breaker@6.0.0:
+ resolution: {integrity: sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA==}
+
+ promise-retry@2.0.1:
+ resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
+ engines: {node: '>=10'}
+
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
proto3-json-serializer@2.0.2:
resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
engines: {node: '>=14.0.0'}
+ proto3-json-serializer@3.0.4:
+ resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==}
+ engines: {node: '>=18'}
+
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.0.0:
resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
+ pupa@2.1.1:
+ resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
+ engines: {node: '>=8'}
+
qr.js@0.0.0:
resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==}
@@ -2105,6 +3634,32 @@ packages:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
+ railroad-diagrams@1.0.0:
+ resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==}
+
+ randexp@0.4.6:
+ resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==}
+ engines: {node: '>=0.12'}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.3:
+ resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==}
+ engines: {node: '>= 0.8'}
+
+ raw-body@3.0.2:
+ resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
+ engines: {node: '>= 0.10'}
+
+ rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+
+ re2@1.23.0:
+ resolution: {integrity: sha512-mT7+/Lz+Akjm/C/X6PiaHihcJL92TNNXai/C4c/dfBbhtwMm1uKEEoA2Lz/FF6aBFfQzg5mAyv4BGjM4q44QwQ==}
+
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
@@ -2147,10 +3702,24 @@ packages:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
+ readable-stream@4.7.0:
+ resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ readdir-glob@1.1.3:
+ resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
recharts@3.6.0:
resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==}
engines: {node: '>=18'}
@@ -2167,6 +3736,14 @@ packages:
redux@5.0.1:
resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
+ registry-auth-token@5.1.0:
+ resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==}
+ engines: {node: '>=14'}
+
+ registry-url@5.1.0:
+ resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
+ engines: {node: '>=8'}
+
request-progress@3.0.0:
resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
@@ -2174,6 +3751,10 @@ packages:
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'}
+
reselect@5.1.1:
resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
@@ -2181,10 +3762,22 @@ packages:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
+ ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+
retry-request@7.0.2:
resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==}
engines: {node: '>=14'}
+ retry-request@8.0.2:
+ resolution: {integrity: sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==}
+ engines: {node: '>=18'}
+
+ retry@0.12.0:
+ resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
+ engines: {node: '>= 4'}
+
retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'}
@@ -2192,23 +3785,65 @@ packages:
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+ rimraf@5.0.10:
+ resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==}
+ hasBin: true
+
+ router@2.2.0:
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+ engines: {node: '>= 18'}
+
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+ semver-diff@3.1.1:
+ resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
+ engines: {node: '>=8'}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
semver@7.7.3:
resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
engines: {node: '>=10'}
hasBin: true
+ send@0.19.2:
+ resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
+ engines: {node: '>= 0.8.0'}
+
+ send@1.2.1:
+ resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+ engines: {node: '>= 18'}
+
+ serve-static@1.16.3:
+ resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==}
+ engines: {node: '>= 0.8.0'}
+
+ serve-static@2.2.1:
+ resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+ engines: {node: '>= 18'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
sharp@0.34.5:
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2240,10 +3875,18 @@ packages:
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'}
+
sirv@2.0.4:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
+ skin-tone@2.0.0:
+ resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==}
+ engines: {node: '>=8'}
+
slice-ansi@3.0.0:
resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
engines: {node: '>=8'}
@@ -2256,21 +3899,75 @@ packages:
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
engines: {node: '>=12'}
+ smart-buffer@4.2.0:
+ resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
+ engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+
+ 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'}
+
+ sort-any@2.0.0:
+ resolution: {integrity: sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ sql-formatter@15.6.12:
+ resolution: {integrity: sha512-mkpF+RG402P66VMsnQkWewTRzDBWfu9iLbOfxaW/nAKOS/2A9MheQmcU5cmX0D0At9azrorZwpvcBRNNBozACQ==}
+ hasBin: true
+
sshpk@1.18.0:
resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
engines: {node: '>=0.10.0'}
hasBin: true
+ ssri@13.0.0:
+ resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ stack-trace@0.0.10:
+ resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
+
+ statuses@1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
+ stream-chain@2.2.5:
+ resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==}
+
stream-events@1.0.5:
resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
+ stream-json@1.9.1:
+ resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==}
+
stream-shift@1.0.3:
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+ streamx@2.23.0:
+ resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==}
+
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
@@ -2283,6 +3980,9 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
@@ -2298,6 +3998,10 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
+ strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+
strnum@1.1.2:
resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
@@ -2317,6 +4021,11 @@ packages:
babel-plugin-macros:
optional: true
+ superstatic@10.0.0:
+ resolution: {integrity: sha512-4xIenBdrIIYuqXrIVx/lejyCh4EJwEMPCwfk9VGFfRlhZcdvzTd3oVOUILrAGfC4pFUWixzPgaOVzAEZgeYI3w==}
+ engines: {node: 20 || 22 || 24}
+ hasBin: true
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2329,6 +4038,10 @@ packages:
resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==}
engines: {node: '>=12'}
+ supports-hyperlinks@3.2.0:
+ resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
+ engines: {node: '>=14.18'}
+
systeminformation@5.28.3:
resolution: {integrity: sha512-crbaZrBH3TpTbqc0PKFqnUFHdAJOxV9UhF3KCGSrf+YP+SkoMHmxU2Nr9yIG2xgCr4645Z9Ec4GHQQQ7kGX/HA==}
engines: {node: '>=8.0.0'}
@@ -2345,13 +4058,43 @@ packages:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'}
+ tar-stream@3.1.7:
+ resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
+
+ tar@7.5.2:
+ resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==}
+ engines: {node: '>=18'}
+
+ tcp-port-used@1.0.2:
+ resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==}
+
+ teeny-request@10.1.0:
+ resolution: {integrity: sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==}
+ engines: {node: '>=18'}
+
teeny-request@9.0.0:
resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==}
engines: {node: '>=14'}
+ text-decoder@1.2.3:
+ resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==}
+
+ text-hex@1.0.0:
+ resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
throttleit@1.0.1:
resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==}
+ through2@2.0.5:
+ resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
+
through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
@@ -2361,6 +4104,10 @@ packages:
tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
tldts-core@6.1.86:
resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
@@ -2376,6 +4123,10 @@ packages:
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'}
+
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
@@ -2384,6 +4135,9 @@ packages:
resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
engines: {node: '>=16'}
+ toxic@1.0.1:
+ resolution: {integrity: sha512-WI3rIGdcaKULYg7KVoB0zcjikqvcYYvcuT6D89bFPz2rVR0Rl0PK6x8/X62rtdLtBKIE985NzVf/auTtGegIIg==}
+
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
@@ -2391,15 +4145,41 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
+ triple-beam@1.4.1:
+ resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
+ engines: {node: '>= 14.0.0'}
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ 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
+
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ tsscmp@1.0.6:
+ resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
+ engines: {node: '>=0.6.x'}
+
tunnel-agent@0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
@@ -2408,7 +4188,18 @@ packages:
resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
engines: {node: '>=8'}
- typescript@5.9.3:
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ type-is@2.0.1:
+ resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
+ engines: {node: '>= 0.6'}
+
+ typedarray-to-buffer@3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+
+ typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
hasBin: true
@@ -2419,10 +4210,34 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ unicode-emoji-modifier-base@1.0.0:
+ resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==}
+ engines: {node: '>=4'}
+
+ unique-filename@5.0.0:
+ resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ unique-slug@6.0.0:
+ resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ unique-string@2.0.0:
+ resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
+ engines: {node: '>=8'}
+
+ universal-analytics@0.5.3:
+ resolution: {integrity: sha512-HXSMyIcf2XTvwZ6ZZQLfxfViRm/yTGoRgDeTbojtq6rezeyKB0sTBcKH2fhddnteAHRcHiKgr/ACpbgjGOC6RQ==}
+ engines: {node: '>=12.18.2'}
+
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'}
+
untildify@4.0.0:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
@@ -2433,6 +4248,16 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ update-notifier-cjs@5.1.7:
+ resolution: {integrity: sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g==}
+ engines: {node: '>=14'}
+
+ url-join@0.0.1:
+ resolution: {integrity: sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw==}
+
+ url-template@2.0.8:
+ resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==}
+
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
@@ -2441,6 +4266,10 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
uuid@10.0.0:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
hasBin: true
@@ -2453,6 +4282,20 @@ packages:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+ valid-url@1.0.9:
+ resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==}
+
+ validate-npm-package-name@5.0.1:
+ resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
verror@1.10.0:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
@@ -2460,6 +4303,13 @@ packages:
victory-vendor@37.3.6:
resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==}
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
web-vitals@4.2.4:
resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
@@ -2479,6 +4329,9 @@ packages:
resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
engines: {node: '>=0.8.0'}
+ whatwg-fetch@3.6.20:
+ resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
+
whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
@@ -2487,6 +4340,23 @@ packages:
engines: {node: '>= 8'}
hasBin: true
+ which@6.0.0:
+ resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+ hasBin: true
+
+ widest-line@3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+
+ winston-transport@4.9.0:
+ resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
+ engines: {node: '>= 12.0.0'}
+
+ winston@3.19.0:
+ resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==}
+ engines: {node: '>= 12.0.0'}
+
wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
@@ -2495,9 +4365,16 @@ packages:
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==}
+
ws@7.5.10:
resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
engines: {node: '>=8.3.0'}
@@ -2510,6 +4387,14 @@ packages:
utf-8-validate:
optional: true
+ xdg-basedir@4.0.0:
+ resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
+ engines: {node: '>=8'}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -2517,14 +4402,31 @@ packages:
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
yaml@1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
+ yaml@2.8.2:
+ resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
+ yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+
yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
@@ -2532,14 +4434,59 @@ packages:
yauzl@2.10.0:
resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ yoctocolors-cjs@2.1.3:
+ resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
+ engines: {node: '>=18'}
+
+ zip-stream@6.0.1:
+ resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
+ engines: {node: '>= 14'}
+
+ zod-to-json-schema@3.25.1:
+ resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==}
+ peerDependencies:
+ zod: ^3.25 || ^4
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
snapshots:
'@alloc/quick-lru@5.2.0': {}
+ '@apidevtools/json-schema-ref-parser@9.1.2':
+ dependencies:
+ '@jsdevtools/ono': 7.1.3
+ '@types/json-schema': 7.0.15
+ call-me-maybe: 1.0.2
+ js-yaml: 4.1.1
+
+ '@apphosting/build@0.1.7(@types/node@22.19.3)(typescript@5.9.3)':
+ dependencies:
+ '@apphosting/common': 0.0.9
+ '@npmcli/promise-spawn': 3.0.0
+ colorette: 2.0.20
+ commander: 11.1.0
+ npm-pick-manifest: 9.1.0
+ ts-node: 10.9.2(@types/node@22.19.3)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ - '@types/node'
+ - typescript
+
+ '@apphosting/common@0.0.8': {}
+
+ '@apphosting/common@0.0.9': {}
+
'@babel/code-frame@7.27.1':
dependencies:
'@babel/helper-validator-identifier': 7.28.5
@@ -2585,6 +4532,15 @@ snapshots:
'@biomejs/cli-win32-x64@2.3.10':
optional: true
+ '@colors/colors@1.5.0':
+ optional: true
+
+ '@colors/colors@1.6.0': {}
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
'@cypress/request@3.0.9':
dependencies:
aws-sign2: 0.7.0
@@ -2613,8 +4569,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@dabh/diagnostics@2.0.8':
+ dependencies:
+ '@so-ric/colorspace': 1.1.6
+ enabled: 2.0.0
+ kuler: 2.0.0
+
'@discoveryjs/json-ext@0.5.7': {}
+ '@electric-sql/pglite-tools@0.2.19(@electric-sql/pglite@0.3.14)':
+ dependencies:
+ '@electric-sql/pglite': 0.3.14
+
+ '@electric-sql/pglite@0.2.17': {}
+
+ '@electric-sql/pglite@0.3.14': {}
+
'@emnapi/runtime@1.7.1':
dependencies:
tslib: 2.8.1
@@ -2983,6 +4953,15 @@ snapshots:
'@firebase/webchannel-wrapper@1.0.5': {}
+ '@google-cloud/cloud-sql-connector@1.8.5':
+ dependencies:
+ '@googleapis/sqladmin': 31.1.0
+ gaxios: 7.1.3
+ google-auth-library: 10.5.0
+ p-throttle: 7.0.0
+ transitivePeerDependencies:
+ - supports-color
+
'@google-cloud/firestore@7.11.6(encoding@0.1.13)':
dependencies:
'@opentelemetry/api': 1.9.0
@@ -3001,12 +4980,42 @@ snapshots:
extend: 3.0.2
optional: true
+ '@google-cloud/paginator@6.0.0':
+ dependencies:
+ extend: 3.0.2
+
+ '@google-cloud/precise-date@5.0.0': {}
+
'@google-cloud/projectify@4.0.0':
optional: true
+ '@google-cloud/projectify@5.0.0': {}
+
'@google-cloud/promisify@2.0.4':
optional: true
+ '@google-cloud/promisify@5.0.0': {}
+
+ '@google-cloud/pubsub@5.2.0':
+ dependencies:
+ '@google-cloud/paginator': 6.0.0
+ '@google-cloud/precise-date': 5.0.0
+ '@google-cloud/projectify': 5.0.0
+ '@google-cloud/promisify': 5.0.0
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.34.0
+ arrify: 2.0.1
+ extend: 3.0.2
+ google-auth-library: 10.5.0
+ google-gax: 5.0.6
+ heap-js: 2.7.1
+ is-stream-ended: 0.1.4
+ lodash.snakecase: 4.1.1
+ p-defer: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
'@google-cloud/storage@7.18.0(encoding@0.1.13)':
dependencies:
'@google-cloud/paginator': 5.0.2
@@ -3029,11 +5038,16 @@ snapshots:
- supports-color
optional: true
+ '@googleapis/sqladmin@31.1.0':
+ dependencies:
+ googleapis-common: 8.0.2-rc.0
+ transitivePeerDependencies:
+ - supports-color
+
'@grpc/grpc-js@1.14.1':
dependencies:
'@grpc/proto-loader': 0.8.0
'@js-sdsl/ordered-map': 4.4.2
- optional: true
'@grpc/grpc-js@1.9.15':
dependencies:
@@ -3053,7 +5067,10 @@ snapshots:
long: 5.3.2
protobufjs: 7.5.4
yargs: 17.7.2
- optional: true
+
+ '@hono/node-server@1.19.7(hono@4.11.3)':
+ dependencies:
+ hono: 4.11.3
'@img/colour@1.0.0':
optional: true
@@ -3152,6 +5169,153 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
+ '@inquirer/ansi@1.0.2': {}
+
+ '@inquirer/checkbox@4.3.2(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/confirm@5.1.21(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/core@10.3.2(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/editor@4.2.23(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/external-editor': 1.0.3(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/expand@4.0.23(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/external-editor@1.0.3(@types/node@22.19.3)':
+ dependencies:
+ chardet: 2.1.1
+ iconv-lite: 0.7.1
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/figures@1.0.15': {}
+
+ '@inquirer/input@4.3.1(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/number@3.0.23(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/password@4.0.23(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/prompts@7.10.1(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@22.19.3)
+ '@inquirer/confirm': 5.1.21(@types/node@22.19.3)
+ '@inquirer/editor': 4.2.23(@types/node@22.19.3)
+ '@inquirer/expand': 4.0.23(@types/node@22.19.3)
+ '@inquirer/input': 4.3.1(@types/node@22.19.3)
+ '@inquirer/number': 3.0.23(@types/node@22.19.3)
+ '@inquirer/password': 4.0.23(@types/node@22.19.3)
+ '@inquirer/rawlist': 4.1.11(@types/node@22.19.3)
+ '@inquirer/search': 3.2.2(@types/node@22.19.3)
+ '@inquirer/select': 4.4.2(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/rawlist@4.1.11(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/search@3.2.2(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/select@4.4.2(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/type@3.0.10(@types/node@22.19.3)':
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@isaacs/balanced-match@4.0.1':
+ optional: true
+
+ '@isaacs/brace-expansion@5.0.0':
+ dependencies:
+ '@isaacs/balanced-match': 4.0.1
+ optional: true
+
+ '@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
+
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.2
+ optional: true
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -3171,8 +5335,36 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
- '@js-sdsl/ordered-map@4.4.2':
- optional: true
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@js-sdsl/ordered-map@4.4.2': {}
+
+ '@jsdevtools/ono@7.1.3': {}
+
+ '@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@3.25.76)':
+ dependencies:
+ '@hono/node-server': 1.19.7(hono@4.11.3)
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ content-type: 1.0.5
+ cors: 2.8.5
+ cross-spawn: 7.0.6
+ eventsource: 3.0.7
+ eventsource-parser: 3.0.6
+ express: 5.2.1
+ express-rate-limit: 7.5.1(express@5.2.1)
+ jose: 6.1.3
+ json-schema-typed: 8.0.2
+ pkce-challenge: 5.0.1
+ raw-body: 3.0.2
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.1(zod@3.25.76)
+ transitivePeerDependencies:
+ - hono
+ - supports-color
'@next/bundle-analyzer@16.1.1':
dependencies:
@@ -3207,9 +5399,52 @@ snapshots:
'@next/swc-win32-x64-msvc@16.1.1':
optional: true
- '@opentelemetry/api@1.9.0':
+ '@npmcli/agent@4.0.0':
+ dependencies:
+ agent-base: 7.1.4
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ lru-cache: 11.2.4
+ socks-proxy-agent: 8.0.5
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@npmcli/fs@5.0.0':
+ dependencies:
+ semver: 7.7.3
+ optional: true
+
+ '@npmcli/promise-spawn@3.0.0':
+ dependencies:
+ infer-owner: 1.0.4
+
+ '@opentelemetry/api@1.9.0': {}
+
+ '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/semantic-conventions@1.28.0': {}
+
+ '@opentelemetry/semantic-conventions@1.34.0': {}
+
+ '@pkgjs/parseargs@0.11.0':
optional: true
+ '@pnpm/config.env-replace@1.1.0': {}
+
+ '@pnpm/network.ca-file@1.0.2':
+ dependencies:
+ graceful-fs: 4.2.10
+
+ '@pnpm/npm-conf@2.3.1':
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+
'@polka/url@1.0.0-next.29': {}
'@protobufjs/aspromise@1.1.2': {}
@@ -3247,6 +5482,13 @@ snapshots:
react: 18.3.1
react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1)
+ '@sindresorhus/is@4.6.0': {}
+
+ '@so-ric/colorspace@1.1.6':
+ dependencies:
+ color: 5.0.3
+ text-hex: 1.0.0
+
'@standard-schema/spec@1.1.0': {}
'@standard-schema/utils@0.3.0': {}
@@ -3363,8 +5605,17 @@ snapshots:
picocolors: 1.1.1
pretty-format: 27.5.1
- '@tootallnate/once@2.0.0':
- optional: true
+ '@tootallnate/once@2.0.0': {}
+
+ '@tootallnate/quickjs-emscripten@0.23.0': {}
+
+ '@tsconfig/node10@1.0.12': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
'@types/aria-query@5.0.4': {}
@@ -3427,6 +5678,8 @@ snapshots:
'@types/js-cookie@2.2.7': {}
+ '@types/json-schema@7.0.15': {}
+
'@types/jsonwebtoken@9.0.10':
dependencies:
'@types/ms': 2.1.0
@@ -3494,6 +5747,8 @@ snapshots:
'@types/tough-cookie@4.0.5':
optional: true
+ '@types/triple-beam@1.3.5': {}
+
'@types/underscore@1.13.0': {}
'@types/use-sync-external-store@0.0.6': {}
@@ -3503,10 +5758,22 @@ snapshots:
'@types/node': 22.19.3
optional: true
+ abbrev@4.0.0:
+ optional: true
+
abort-controller@3.0.0:
dependencies:
event-target-shim: 5.0.1
- optional: true
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ accepts@2.0.0:
+ dependencies:
+ mime-types: 3.0.2
+ negotiator: 1.0.0
acorn-walk@8.3.4:
dependencies:
@@ -3519,22 +5786,43 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
- agent-base@7.1.4:
- optional: true
+ agent-base@7.1.4: {}
aggregate-error@3.1.0:
dependencies:
clean-stack: 2.2.0
indent-string: 4.0.0
+ ajv-formats@2.1.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv-formats@3.0.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ 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
+
+ ansi-align@3.0.1:
+ dependencies:
+ string-width: 4.2.3
+
ansi-colors@4.1.3: {}
ansi-escapes@4.3.2:
dependencies:
type-fest: 0.21.3
+ ansi-escapes@7.2.0:
+ dependencies:
+ environment: 1.1.0
+
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {}
@@ -3547,28 +5835,77 @@ snapshots:
ansi-styles@6.2.3: {}
- arch@2.2.0: {}
+ any-promise@1.3.0: {}
- aria-query@5.3.0:
+ anymatch@3.1.3:
dependencies:
- dequal: 2.0.3
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
- arrify@2.0.1:
- optional: true
+ arch@2.2.0: {}
- asn1@0.2.6:
+ archiver-utils@5.0.2:
dependencies:
- safer-buffer: 2.1.2
-
+ glob: 10.5.0
+ graceful-fs: 4.2.11
+ is-stream: 2.0.1
+ lazystream: 1.0.1
+ lodash: 4.17.21
+ normalize-path: 3.0.0
+ readable-stream: 4.7.0
+
+ archiver@7.0.1:
+ dependencies:
+ archiver-utils: 5.0.2
+ async: 3.2.6
+ buffer-crc32: 1.0.0
+ readable-stream: 4.7.0
+ readdir-glob: 1.1.3
+ tar-stream: 3.1.7
+ zip-stream: 6.0.1
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
+
+ arg@4.1.3: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.0:
+ dependencies:
+ dequal: 2.0.3
+
+ array-flatten@1.1.1: {}
+
+ arrify@2.0.1: {}
+
+ as-array@2.0.0: {}
+
+ asn1@0.2.6:
+ dependencies:
+ safer-buffer: 2.1.2
+
assert-plus@1.0.0: {}
+ ast-types@0.13.4:
+ dependencies:
+ tslib: 2.8.1
+
astral-regex@2.0.0: {}
+ async-lock@1.4.1: {}
+
async-retry@1.3.3:
dependencies:
retry: 0.13.1
optional: true
+ async@3.2.6: {}
+
asynckit@0.4.0: {}
at-least-node@1.0.0: {}
@@ -3586,21 +5923,95 @@ snapshots:
aws4@1.13.2: {}
+ b4a@1.7.3: {}
+
+ balanced-match@1.0.2: {}
+
+ bare-events@2.8.2: {}
+
base64-js@1.5.1: {}
baseline-browser-mapping@2.9.11: {}
+ basic-auth-connect@1.1.0:
+ dependencies:
+ tsscmp: 1.0.6
+
+ basic-auth@2.0.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ basic-ftp@5.1.0: {}
+
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
- bignumber.js@9.3.1:
- optional: true
+ bignumber.js@9.3.1: {}
+
+ binary-extensions@2.3.0: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
blob-util@2.0.2: {}
bluebird@3.7.2: {}
+ body-parser@1.20.4:
+ 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.1
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.14.0
+ raw-body: 2.5.3
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ body-parser@2.2.1:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 4.4.3
+ http-errors: 2.0.1
+ iconv-lite: 0.7.1
+ on-finished: 2.4.1
+ qs: 6.14.0
+ raw-body: 3.0.2
+ type-is: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ boxen@5.1.2:
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ cli-boxes: 2.2.1
+ string-width: 4.2.3
+ type-fest: 0.20.2
+ widest-line: 3.1.0
+ wrap-ansi: 7.0.0
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
braces@3.0.3:
dependencies:
fill-range: 7.1.1
@@ -3615,6 +6026,8 @@ snapshots:
buffer-crc32@0.2.13: {}
+ buffer-crc32@1.0.0: {}
+
buffer-equal-constant-time@1.0.1: {}
buffer@5.7.1:
@@ -3622,6 +6035,28 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bytes@3.1.2: {}
+
+ cacache@20.0.3:
+ dependencies:
+ '@npmcli/fs': 5.0.0
+ fs-minipass: 3.0.3
+ glob: 13.0.0
+ lru-cache: 11.2.4
+ minipass: 7.1.2
+ minipass-collect: 2.0.1
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ p-map: 7.0.4
+ ssri: 13.0.0
+ unique-filename: 5.0.0
+ optional: true
+
cachedir@2.4.0: {}
call-bind-apply-helpers@1.0.2:
@@ -3634,6 +6069,10 @@ snapshots:
call-bind-apply-helpers: 1.0.2
get-intrinsic: 1.3.0
+ call-me-maybe@1.0.2: {}
+
+ camelcase@6.3.0: {}
+
caniuse-lite@1.0.30001761: {}
caseless@0.12.0: {}
@@ -3643,20 +6082,66 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ chalk@5.6.2: {}
+
+ char-regex@1.0.2: {}
+
+ chardet@2.1.1: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ chownr@3.0.0:
+ optional: true
+
+ ci-info@2.0.0: {}
+
ci-info@4.3.1: {}
+ cjson@0.3.3:
+ dependencies:
+ json-parse-helpfulerror: 1.0.3
+
clean-stack@2.2.0: {}
+ cli-boxes@2.2.1: {}
+
cli-cursor@3.1.0:
dependencies:
restore-cursor: 3.1.0
+ cli-highlight@2.1.11:
+ dependencies:
+ chalk: 4.1.2
+ highlight.js: 10.7.3
+ mz: 2.7.0
+ parse5: 5.1.1
+ parse5-htmlparser2-tree-adapter: 6.0.1
+ yargs: 16.2.0
+
+ cli-spinners@2.9.2: {}
+
cli-table3@0.6.1:
dependencies:
string-width: 4.2.3
optionalDependencies:
colors: 1.4.0
+ cli-table3@0.6.5:
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+
cli-truncate@2.1.0:
dependencies:
slice-ansi: 3.0.0
@@ -3667,22 +6152,47 @@ snapshots:
slice-ansi: 5.0.0
string-width: 5.1.2
+ cli-width@4.1.0: {}
+
client-only@0.0.1: {}
+ cliui@7.0.4:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
cliui@8.0.1:
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ clone@1.0.4: {}
+
clsx@2.1.1: {}
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
+ color-convert@3.1.3:
+ dependencies:
+ color-name: 2.1.0
+
color-name@1.1.4: {}
+ color-name@2.1.0: {}
+
+ color-string@2.1.4:
+ dependencies:
+ color-name: 2.1.0
+
+ color@5.0.3:
+ dependencies:
+ color-convert: 3.1.3
+ color-string: 2.1.4
+
colorette@2.0.20: {}
colors@1.4.0:
@@ -3692,6 +6202,14 @@ snapshots:
dependencies:
delayed-stream: 1.0.0
+ commander@10.0.1: {}
+
+ commander@11.1.0: {}
+
+ commander@2.20.3: {}
+
+ commander@5.1.0: {}
+
commander@6.2.1: {}
commander@7.2.0: {}
@@ -3700,18 +6218,103 @@ snapshots:
common-tags@1.8.2: {}
+ compress-commons@6.0.2:
+ dependencies:
+ crc-32: 1.2.2
+ crc32-stream: 6.0.0
+ is-stream: 2.0.1
+ normalize-path: 3.0.0
+ readable-stream: 4.7.0
+
+ compressible@2.0.18:
+ dependencies:
+ mime-db: 1.52.0
+
+ compression@1.8.1:
+ dependencies:
+ bytes: 3.1.2
+ compressible: 2.0.18
+ debug: 2.6.9
+ negotiator: 0.6.4
+ on-headers: 1.1.0
+ safe-buffer: 5.2.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ concat-map@0.0.1: {}
+
+ config-chain@1.1.13:
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
+ configstore@5.0.1:
+ dependencies:
+ dot-prop: 5.3.0
+ graceful-fs: 4.2.11
+ make-dir: 3.1.0
+ unique-string: 2.0.0
+ write-file-atomic: 3.0.3
+ xdg-basedir: 4.0.0
+
+ connect@3.7.0:
+ dependencies:
+ debug: 2.6.9
+ finalhandler: 1.1.2
+ parseurl: 1.3.3
+ utils-merge: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-disposition@1.0.1: {}
+
+ content-type@1.0.5: {}
+
+ cookie-signature@1.0.7: {}
+
+ cookie-signature@1.2.2: {}
+
+ cookie@0.7.2: {}
+
core-util-is@1.0.2: {}
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ crc-32@1.2.2: {}
+
+ crc32-stream@6.0.0:
+ dependencies:
+ crc-32: 1.2.2
+ readable-stream: 4.7.0
+
+ create-require@1.1.1: {}
+
+ cross-env@7.0.3:
+ dependencies:
+ cross-spawn: 7.0.6
+
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: {}
+
csstype@3.1.3: {}
csstype@3.2.3: {}
+ csv-parse@5.6.0: {}
+
cypress@15.8.1:
dependencies:
'@cypress/request': 3.0.9
@@ -3799,6 +6402,10 @@ snapshots:
dependencies:
assert-plus: 1.0.0
+ data-uri-to-buffer@4.0.1: {}
+
+ data-uri-to-buffer@6.0.2: {}
+
date-fns@2.30.0:
dependencies:
'@babel/runtime': 7.28.4
@@ -3807,12 +6414,20 @@ snapshots:
debounce@1.2.1: {}
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
debug@3.2.7(supports-color@8.1.1):
dependencies:
ms: 2.1.3
optionalDependencies:
supports-color: 8.1.1
+ debug@4.3.1:
+ dependencies:
+ ms: 2.1.2
+
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -3831,16 +6446,49 @@ snapshots:
decimal.js-light@2.5.1: {}
+ deep-equal-in-any-order@2.1.0:
+ dependencies:
+ lodash.mapvalues: 4.6.0
+ sort-any: 2.0.0
+
+ deep-extend@0.6.0: {}
+
+ deep-freeze@0.0.1: {}
+
+ deep-is@0.1.4: {}
+
deepmerge@2.2.1: {}
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ degenerator@5.0.1:
+ dependencies:
+ ast-types: 0.13.4
+ escodegen: 2.1.0
+ esprima: 4.0.1
+
delayed-stream@1.0.0: {}
+ depd@2.0.0: {}
+
dequal@2.0.3: {}
+ destroy@1.2.0: {}
+
detect-libc@2.1.2: {}
+ diff@4.0.2: {}
+
+ discontinuous-range@1.0.0: {}
+
dom-accessibility-api@0.5.16: {}
+ dot-prop@5.3.0:
+ dependencies:
+ is-obj: 2.0.0
+
dotenv@17.2.3: {}
dunder-proto@1.0.1:
@@ -3857,7 +6505,6 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
stream-shift: 1.0.3
- optional: true
eastasianwidth@0.2.0: {}
@@ -3870,12 +6517,22 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
+ ee-first@1.1.1: {}
+
electron-to-chromium@1.5.267: {}
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
+ emojilib@2.4.0: {}
+
+ enabled@2.0.0: {}
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
encoding@0.1.13:
dependencies:
iconv-lite: 0.6.3
@@ -3895,6 +6552,14 @@ snapshots:
ansi-colors: 4.1.3
strip-ansi: 6.0.1
+ env-paths@2.2.1:
+ optional: true
+
+ environment@1.1.0: {}
+
+ err-code@2.0.3:
+ optional: true
+
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
@@ -3914,17 +6579,52 @@ snapshots:
escalade@3.2.0: {}
+ escape-goat@2.1.1: {}
+
+ escape-html@1.0.3: {}
+
escape-string-regexp@1.0.5: {}
escape-string-regexp@4.0.0: {}
- event-target-shim@5.0.1:
- optional: true
+ escodegen@2.1.0:
+ dependencies:
+ esprima: 4.0.1
+ estraverse: 5.3.0
+ esutils: 2.0.3
+ optionalDependencies:
+ source-map: 0.6.1
+
+ esprima@4.0.1: {}
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ event-target-shim@5.0.1: {}
eventemitter2@6.4.7: {}
eventemitter3@5.0.1: {}
+ events-listener@1.1.0: {}
+
+ events-universal@1.0.1:
+ dependencies:
+ bare-events: 2.8.2
+ transitivePeerDependencies:
+ - bare-abort-controller
+
+ events@3.3.0: {}
+
+ eventsource-parser@3.0.6: {}
+
+ eventsource@3.0.7:
+ dependencies:
+ eventsource-parser: 3.0.6
+
execa@4.1.0:
dependencies:
cross-spawn: 7.0.6
@@ -3953,6 +6653,109 @@ snapshots:
dependencies:
pify: 2.3.0
+ exegesis-express@4.0.0:
+ dependencies:
+ exegesis: 4.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ exegesis@4.3.0:
+ dependencies:
+ '@apidevtools/json-schema-ref-parser': 9.1.2
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ body-parser: 1.20.4
+ content-type: 1.0.5
+ deep-freeze: 0.0.1
+ events-listener: 1.1.0
+ glob: 10.5.0
+ json-ptr: 3.1.1
+ json-schema-traverse: 1.0.0
+ lodash: 4.17.21
+ openapi3-ts: 3.2.0
+ promise-breaker: 6.0.0
+ qs: 6.14.0
+ raw-body: 2.5.3
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ exponential-backoff@3.1.3:
+ optional: true
+
+ express-rate-limit@7.5.1(express@5.2.1):
+ dependencies:
+ express: 5.2.1
+
+ express@4.22.1:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.4
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.0.7
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.2
+ fresh: 0.5.2
+ http-errors: 2.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.12
+ proxy-addr: 2.0.7
+ qs: 6.14.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.2
+ serve-static: 1.16.3
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ express@5.2.1:
+ dependencies:
+ accepts: 2.0.0
+ body-parser: 2.2.1
+ content-disposition: 1.0.1
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.2.2
+ debug: 4.4.3
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.2
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.14.0
+ range-parser: 1.2.1
+ router: 2.2.0
+ send: 1.2.1
+ serve-static: 2.2.1
+ statuses: 2.0.2
+ type-is: 2.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
extend@3.0.2: {}
extract-zip@2.0.1(supports-color@8.1.1):
@@ -3969,8 +6772,11 @@ snapshots:
farmhash-modern@1.1.0: {}
- fast-deep-equal@3.1.3:
- optional: true
+ fast-deep-equal@3.1.3: {}
+
+ fast-fifo@1.3.2: {}
+
+ fast-uri@3.1.0: {}
fast-xml-parser@4.5.3:
dependencies:
@@ -3985,14 +6791,63 @@ snapshots:
dependencies:
pend: 1.2.0
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+ optional: true
+
+ fecha@4.2.3: {}
+
+ fetch-blob@3.2.0:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+
figures@3.2.0:
dependencies:
escape-string-regexp: 1.0.5
+ filesize@6.4.0: {}
+
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
+ finalhandler@1.1.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ statuses: 1.5.0
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ finalhandler@1.3.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ finalhandler@2.1.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
firebase-admin@12.7.0(encoding@0.1.13):
dependencies:
'@fastify/busboy': 3.2.0
@@ -4011,9 +6866,101 @@ snapshots:
- encoding
- supports-color
- firebase@12.7.0:
+ firebase-tools@15.1.0(@types/node@22.19.3)(encoding@0.1.13)(hono@4.11.3)(typescript@5.9.3):
dependencies:
- '@firebase/ai': 2.6.1(@firebase/app-types@0.9.3)(@firebase/app@0.14.6)
+ '@apphosting/build': 0.1.7(@types/node@22.19.3)(typescript@5.9.3)
+ '@apphosting/common': 0.0.8
+ '@electric-sql/pglite': 0.3.14
+ '@electric-sql/pglite-tools': 0.2.19(@electric-sql/pglite@0.3.14)
+ '@google-cloud/cloud-sql-connector': 1.8.5
+ '@google-cloud/pubsub': 5.2.0
+ '@inquirer/prompts': 7.10.1(@types/node@22.19.3)
+ '@modelcontextprotocol/sdk': 1.25.1(hono@4.11.3)(zod@3.25.76)
+ abort-controller: 3.0.0
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ archiver: 7.0.1
+ async-lock: 1.4.1
+ body-parser: 1.20.4
+ chokidar: 3.6.0
+ cjson: 0.3.3
+ cli-table3: 0.6.5
+ colorette: 2.0.20
+ commander: 5.1.0
+ configstore: 5.0.1
+ cors: 2.8.5
+ cross-env: 7.0.3
+ cross-spawn: 7.0.6
+ csv-parse: 5.6.0
+ deep-equal-in-any-order: 2.1.0
+ exegesis: 4.3.0
+ exegesis-express: 4.0.0
+ express: 4.22.1
+ filesize: 6.4.0
+ form-data: 4.0.5
+ fs-extra: 10.1.0
+ fuzzy: 0.1.3
+ gaxios: 6.7.1(encoding@0.1.13)
+ glob: 10.5.0
+ google-auth-library: 9.15.1(encoding@0.1.13)
+ ignore: 7.0.5
+ js-yaml: 3.14.2
+ jsonwebtoken: 9.0.3
+ leven: 3.1.0
+ libsodium-wrappers: 0.7.15
+ lodash: 4.17.21
+ lsofi: 1.0.0
+ marked: 13.0.3
+ marked-terminal: 7.3.0(marked@13.0.3)
+ mime: 2.6.0
+ minimatch: 3.1.2
+ morgan: 1.10.1
+ node-fetch: 2.7.0(encoding@0.1.13)
+ open: 6.4.0
+ ora: 5.4.1
+ p-limit: 3.1.0
+ pg: 8.16.3
+ pg-gateway: 0.3.0-beta.4
+ pglite-2: '@electric-sql/pglite@0.2.17'
+ portfinder: 1.0.38
+ progress: 2.0.3
+ proxy-agent: 6.5.0
+ retry: 0.13.1
+ semver: 7.7.3
+ sql-formatter: 15.6.12
+ stream-chain: 2.2.5
+ stream-json: 1.9.1
+ superstatic: 10.0.0(encoding@0.1.13)
+ tcp-port-used: 1.0.2
+ tmp: 0.2.5
+ triple-beam: 1.4.1
+ universal-analytics: 0.5.3
+ update-notifier-cjs: 5.1.7(encoding@0.1.13)
+ uuid: 8.3.2
+ winston: 3.19.0
+ winston-transport: 4.9.0
+ ws: 7.5.10
+ yaml: 2.8.2
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.1(zod@3.25.76)
+ transitivePeerDependencies:
+ - '@cfworker/json-schema'
+ - '@swc/core'
+ - '@swc/wasm'
+ - '@types/node'
+ - bare-abort-controller
+ - bufferutil
+ - encoding
+ - hono
+ - pg-native
+ - react-native-b4a
+ - supports-color
+ - typescript
+ - utf-8-validate
+
+ firebase@12.7.0:
+ dependencies:
+ '@firebase/ai': 2.6.1(@firebase/app-types@0.9.3)(@firebase/app@0.14.6)
'@firebase/analytics': 0.10.19(@firebase/app@0.14.6)
'@firebase/analytics-compat': 0.2.25(@firebase/app-compat@0.5.6)(@firebase/app@0.14.6)
'@firebase/app': 0.14.6
@@ -4044,6 +6991,13 @@ snapshots:
transitivePeerDependencies:
- '@react-native-async-storage/async-storage'
+ fn.name@1.1.0: {}
+
+ foreground-child@3.3.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
forever-agent@0.6.1: {}
form-data@2.5.5:
@@ -4064,6 +7018,10 @@ snapshots:
hasown: 2.0.2
mime-types: 2.1.35
+ formdata-polyfill@4.0.10:
+ dependencies:
+ fetch-blob: 3.2.0
+
formik@2.4.9(@types/react@18.3.27)(react@18.3.1):
dependencies:
'@types/hoist-non-react-statics': 3.3.7(@types/react@18.3.27)
@@ -4078,8 +7036,20 @@ snapshots:
transitivePeerDependencies:
- '@types/react'
+ forwarded@0.2.0: {}
+
fraction.js@5.3.4: {}
+ fresh@0.5.2: {}
+
+ fresh@2.0.0: {}
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.0
+ universalify: 2.0.1
+
fs-extra@9.1.0:
dependencies:
at-least-node: 1.0.0
@@ -4087,11 +7057,21 @@ snapshots:
jsonfile: 6.2.0
universalify: 2.0.1
+ fs-minipass@3.0.3:
+ dependencies:
+ minipass: 7.1.2
+ optional: true
+
+ fsevents@2.3.3:
+ optional: true
+
function-bind@1.1.2: {}
functional-red-black-tree@1.0.1:
optional: true
+ fuzzy@0.1.3: {}
+
gaxios@6.7.1(encoding@0.1.13):
dependencies:
extend: 3.0.2
@@ -4102,7 +7082,15 @@ snapshots:
transitivePeerDependencies:
- encoding
- supports-color
- optional: true
+
+ gaxios@7.1.3:
+ dependencies:
+ extend: 3.0.2
+ https-proxy-agent: 7.0.6
+ node-fetch: 3.3.2
+ rimraf: 5.0.10
+ transitivePeerDependencies:
+ - supports-color
gcp-metadata@6.1.1(encoding@0.1.13):
dependencies:
@@ -4112,7 +7100,14 @@ snapshots:
transitivePeerDependencies:
- encoding
- supports-color
- optional: true
+
+ gcp-metadata@8.1.2:
+ dependencies:
+ gaxios: 7.1.3
+ google-logging-utils: 1.1.3
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
get-caller-file@2.0.5: {}
@@ -4140,10 +7135,46 @@ snapshots:
get-stream@6.0.1: {}
+ get-uri@6.0.5:
+ dependencies:
+ basic-ftp: 5.1.0
+ data-uri-to-buffer: 6.0.2
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
getpass@0.1.7:
dependencies:
assert-plus: 1.0.0
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-slash@1.0.0: {}
+
+ glob-slasher@1.0.1:
+ dependencies:
+ glob-slash: 1.0.0
+ lodash.isobject: 2.4.1
+ toxic: 1.0.1
+
+ glob@10.5.0:
+ dependencies:
+ 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@13.0.0:
+ dependencies:
+ minimatch: 10.1.1
+ minipass: 7.1.2
+ path-scurry: 2.0.1
+ optional: true
+
global-dirs@3.0.1:
dependencies:
ini: 2.0.0
@@ -4152,6 +7183,18 @@ snapshots:
dependencies:
csstype: 3.1.3
+ google-auth-library@10.5.0:
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 7.1.3
+ gcp-metadata: 8.1.2
+ google-logging-utils: 1.1.3
+ gtoken: 8.0.0
+ jws: 4.0.1
+ transitivePeerDependencies:
+ - supports-color
+
google-auth-library@9.15.1(encoding@0.1.13):
dependencies:
base64-js: 1.5.1
@@ -4159,11 +7202,10 @@ snapshots:
gaxios: 6.7.1(encoding@0.1.13)
gcp-metadata: 6.1.1(encoding@0.1.13)
gtoken: 7.1.0(encoding@0.1.13)
- jws: 4.0.0
+ jws: 4.0.1
transitivePeerDependencies:
- encoding
- supports-color
- optional: true
google-gax@4.6.1(encoding@0.1.13):
dependencies:
@@ -4184,21 +7226,56 @@ snapshots:
- supports-color
optional: true
- google-logging-utils@0.0.2:
- optional: true
+ google-gax@5.0.6:
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@grpc/proto-loader': 0.8.0
+ duplexify: 4.1.3
+ google-auth-library: 10.5.0
+ google-logging-utils: 1.1.3
+ node-fetch: 3.3.2
+ object-hash: 3.0.0
+ proto3-json-serializer: 3.0.4
+ protobufjs: 7.5.4
+ retry-request: 8.0.2
+ rimraf: 5.0.10
+ transitivePeerDependencies:
+ - supports-color
+
+ google-logging-utils@0.0.2: {}
+
+ google-logging-utils@1.1.3: {}
+
+ googleapis-common@8.0.2-rc.0:
+ dependencies:
+ extend: 3.0.2
+ gaxios: 7.1.3
+ google-auth-library: 10.5.0
+ qs: 6.14.0
+ url-template: 2.0.8
+ transitivePeerDependencies:
+ - supports-color
gopd@1.2.0: {}
+ graceful-fs@4.2.10: {}
+
graceful-fs@4.2.11: {}
gtoken@7.1.0(encoding@0.1.13):
dependencies:
gaxios: 6.7.1(encoding@0.1.13)
- jws: 4.0.0
+ jws: 4.0.1
transitivePeerDependencies:
- encoding
- supports-color
- optional: true
+
+ gtoken@8.0.0:
+ dependencies:
+ gaxios: 7.1.3
+ jws: 4.0.1
+ transitivePeerDependencies:
+ - supports-color
gzip-size@6.0.0:
dependencies:
@@ -4212,6 +7289,8 @@ snapshots:
dependencies:
has-symbols: 1.1.0
+ has-yarn@2.1.0: {}
+
hasha@5.2.2:
dependencies:
is-stream: 2.0.1
@@ -4221,15 +7300,36 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ heap-js@2.7.1: {}
+
+ highlight.js@10.7.3: {}
+
hoist-non-react-statics@3.3.2:
dependencies:
react-is: 16.13.1
+ hono@4.11.3: {}
+
+ hosted-git-info@7.0.2:
+ dependencies:
+ lru-cache: 10.4.3
+
html-entities@2.6.0:
optional: true
html-escaper@2.0.2: {}
+ http-cache-semantics@4.2.0:
+ optional: true
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
http-parser-js@0.5.10: {}
http-proxy-agent@5.0.0:
@@ -4239,7 +7339,13 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
http-signature@1.4.0:
dependencies:
@@ -4253,7 +7359,6 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
https-proxy-agent@7.0.6:
dependencies:
@@ -4261,7 +7366,6 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
human-signals@1.1.1: {}
@@ -4269,67 +7373,183 @@ snapshots:
husky@7.0.4: {}
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
optional: true
+ iconv-lite@0.7.1:
+ dependencies:
+ safer-buffer: 2.1.2
+
idb@7.1.1: {}
ieee754@1.2.1: {}
+ ignore@7.0.5: {}
+
immer@10.2.0: {}
immer@11.1.0: {}
+ import-lazy@2.1.0: {}
+
+ imurmurhash@0.1.4: {}
+
indent-string@4.0.0: {}
- inherits@2.0.4:
- optional: true
+ infer-owner@1.0.4: {}
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
ini@2.0.0: {}
+ install-artifact-from-github@1.4.0:
+ optional: true
+
internmap@2.0.3: {}
+ ip-address@10.1.0: {}
+
+ ip-regex@4.3.0: {}
+
+ ipaddr.js@1.9.1: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-buffer@1.1.6: {}
+
+ is-ci@2.0.0:
+ dependencies:
+ ci-info: 2.0.0
+
+ is-extglob@2.1.1: {}
+
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@4.0.0: {}
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
is-installed-globally@0.4.0:
dependencies:
global-dirs: 3.0.1
is-path-inside: 3.0.3
+ is-interactive@1.0.0: {}
+
+ is-npm@5.0.0: {}
+
+ is-number@2.1.0:
+ dependencies:
+ kind-of: 3.2.2
+
is-number@7.0.0: {}
+ is-obj@2.0.0: {}
+
is-path-inside@3.0.3: {}
is-plain-object@5.0.0: {}
+ is-promise@4.0.0: {}
+
+ is-stream-ended@0.1.4: {}
+
is-stream@2.0.1: {}
is-typedarray@1.0.0: {}
is-unicode-supported@0.1.0: {}
+ is-url@1.2.4: {}
+
+ is-wsl@1.1.0: {}
+
+ is-yarn-global@0.3.0: {}
+
+ is2@2.0.9:
+ dependencies:
+ deep-is: 0.1.4
+ ip-regex: 4.3.0
+ is-url: 1.2.4
+
+ isarray@0.0.1: {}
+
+ isarray@1.0.0: {}
+
isexe@2.0.0: {}
+ isexe@3.1.1:
+ optional: true
+
+ isomorphic-fetch@3.0.0(encoding@0.1.13):
+ dependencies:
+ node-fetch: 2.7.0(encoding@0.1.13)
+ whatwg-fetch: 3.6.20
+ transitivePeerDependencies:
+ - encoding
+
isstream@0.1.2: {}
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
jiti@2.6.1: {}
+ jju@1.4.0: {}
+
+ join-path@1.1.1:
+ dependencies:
+ as-array: 2.0.0
+ url-join: 0.0.1
+ valid-url: 1.0.9
+
jose@4.15.9: {}
+ jose@6.1.3: {}
+
js-cookie@2.2.1: {}
js-tokens@4.0.0: {}
+ js-yaml@3.14.2:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
jsbn@0.1.1: {}
json-bigint@1.0.0:
dependencies:
bignumber.js: 9.3.1
- optional: true
+
+ json-parse-helpfulerror@1.0.3:
+ dependencies:
+ jju: 1.4.0
+
+ json-ptr@3.1.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-schema-typed@8.0.2: {}
json-schema@0.4.0: {}
@@ -4378,16 +7598,28 @@ snapshots:
transitivePeerDependencies:
- supports-color
- jws@4.0.0:
+ jws@4.0.1:
dependencies:
jwa: 2.0.1
safe-buffer: 5.2.1
- optional: true
- jws@4.0.1:
+ kind-of@3.2.2:
dependencies:
- jwa: 2.0.1
- safe-buffer: 5.2.1
+ is-buffer: 1.1.6
+
+ kuler@2.0.0: {}
+
+ lazystream@1.0.1:
+ dependencies:
+ readable-stream: 2.3.8
+
+ leven@3.1.0: {}
+
+ libsodium-wrappers@0.7.15:
+ dependencies:
+ libsodium: 0.7.15
+
+ libsodium@0.7.15: {}
lightningcss-android-arm64@1.30.2:
optional: true
@@ -4489,6 +7721,8 @@ snapshots:
lodash-es@4.17.21: {}
+ lodash._objecttypes@2.4.1: {}
+
lodash.camelcase@4.3.0: {}
lodash.clonedeep@4.5.0: {}
@@ -4501,12 +7735,20 @@ snapshots:
lodash.isnumber@3.0.3: {}
+ lodash.isobject@2.4.1:
+ dependencies:
+ lodash._objecttypes: 2.4.1
+
lodash.isplainobject@4.0.6: {}
lodash.isstring@4.0.1: {}
+ lodash.mapvalues@4.6.0: {}
+
lodash.once@4.1.1: {}
+ lodash.snakecase@4.1.1: {}
+
lodash@4.17.21: {}
log-symbols@4.1.0:
@@ -4521,31 +7763,98 @@ snapshots:
slice-ansi: 4.0.0
wrap-ansi: 6.2.0
+ logform@2.7.0:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@types/triple-beam': 1.3.5
+ fecha: 4.2.3
+ ms: 2.1.3
+ safe-stable-stringify: 2.5.0
+ triple-beam: 1.4.1
+
long@5.3.2: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
+ lru-cache@10.4.3: {}
+
+ lru-cache@11.2.4:
+ optional: true
+
lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
+ lru-cache@7.18.3: {}
+
lru-memoizer@2.3.0:
dependencies:
lodash.clonedeep: 4.5.0
lru-cache: 6.0.0
+ lsofi@1.0.0:
+ dependencies:
+ is-number: 2.1.0
+ through2: 2.0.5
+
lz-string@1.5.0: {}
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ make-dir@3.1.0:
+ dependencies:
+ semver: 6.3.1
+
+ make-error@1.3.6: {}
+
+ make-fetch-happen@15.0.3:
+ dependencies:
+ '@npmcli/agent': 4.0.0
+ cacache: 20.0.3
+ http-cache-semantics: 4.2.0
+ minipass: 7.1.2
+ minipass-fetch: 5.0.0
+ minipass-flush: 1.0.5
+ minipass-pipeline: 1.2.4
+ negotiator: 1.0.0
+ proc-log: 6.1.0
+ promise-retry: 2.0.1
+ ssri: 13.0.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ marked-terminal@7.3.0(marked@13.0.3):
+ dependencies:
+ ansi-escapes: 7.2.0
+ ansi-regex: 6.2.2
+ chalk: 5.6.2
+ cli-highlight: 2.1.11
+ cli-table3: 0.6.5
+ marked: 13.0.3
+ node-emoji: 2.2.0
+ supports-hyperlinks: 3.2.0
+
+ marked@13.0.3: {}
+
math-intrinsics@1.1.0: {}
+ media-typer@0.3.0: {}
+
+ media-typer@1.1.0: {}
+
+ merge-descriptors@1.0.3: {}
+
+ merge-descriptors@2.0.0: {}
+
merge-stream@2.0.0: {}
+ methods@1.1.2: {}
+
micromatch@4.0.8:
dependencies:
braces: 3.0.3
@@ -4553,23 +7862,137 @@ snapshots:
mime-db@1.52.0: {}
+ mime-db@1.54.0: {}
+
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
+ mime@1.6.0: {}
+
+ mime@2.6.0: {}
+
mime@3.0.0:
optional: true
mimic-fn@2.1.0: {}
+ minimatch@10.1.1:
+ dependencies:
+ '@isaacs/brace-expansion': 5.0.0
+ optional: true
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimatch@6.2.0:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
minimist@1.2.8: {}
+ minipass-collect@2.0.1:
+ dependencies:
+ minipass: 7.1.2
+ optional: true
+
+ minipass-fetch@5.0.0:
+ dependencies:
+ minipass: 7.1.2
+ minipass-sized: 1.0.3
+ minizlib: 3.1.0
+ optionalDependencies:
+ encoding: 0.1.13
+ optional: true
+
+ minipass-flush@1.0.5:
+ dependencies:
+ minipass: 3.3.6
+ optional: true
+
+ minipass-pipeline@1.2.4:
+ dependencies:
+ minipass: 3.3.6
+ optional: true
+
+ minipass-sized@1.0.3:
+ dependencies:
+ minipass: 3.3.6
+ optional: true
+
+ minipass@3.3.6:
+ dependencies:
+ yallist: 4.0.0
+ optional: true
+
+ minipass@7.1.2: {}
+
+ minizlib@3.1.0:
+ dependencies:
+ minipass: 7.1.2
+ optional: true
+
+ moo@0.5.2: {}
+
+ morgan@1.10.1:
+ dependencies:
+ basic-auth: 2.0.1
+ debug: 2.6.9
+ depd: 2.0.0
+ on-finished: 2.3.0
+ on-headers: 1.1.0
+ transitivePeerDependencies:
+ - supports-color
+
mrmime@2.0.1: {}
+ ms@2.0.0: {}
+
+ ms@2.1.2: {}
+
ms@2.1.3: {}
+ mute-stream@2.0.0: {}
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ nan@2.24.0:
+ optional: true
+
nanoid@3.3.11: {}
+ nearley@2.20.1:
+ dependencies:
+ commander: 2.20.3
+ moo: 0.5.2
+ railroad-diagrams: 1.0.0
+ randexp: 0.4.6
+
+ negotiator@0.6.3: {}
+
+ negotiator@0.6.4: {}
+
+ negotiator@1.0.0: {}
+
+ netmask@2.0.2: {}
+
next@16.1.1(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 16.1.1
@@ -4595,65 +8018,257 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ node-domexception@1.0.0: {}
+
+ node-emoji@2.2.0:
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ char-regex: 1.0.2
+ emojilib: 2.4.0
+ skin-tone: 2.0.0
+
node-fetch@2.7.0(encoding@0.1.13):
dependencies:
whatwg-url: 5.0.0
optionalDependencies:
encoding: 0.1.13
- optional: true
+
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
node-forge@1.3.1: {}
+ node-gyp@12.1.0:
+ dependencies:
+ env-paths: 2.2.1
+ exponential-backoff: 3.1.3
+ graceful-fs: 4.2.11
+ make-fetch-happen: 15.0.3
+ nopt: 9.0.0
+ proc-log: 6.1.0
+ semver: 7.7.3
+ tar: 7.5.2
+ tinyglobby: 0.2.15
+ which: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
node-releases@2.0.27: {}
+ nopt@9.0.0:
+ dependencies:
+ abbrev: 4.0.0
+ optional: true
+
normalize-path@3.0.0: {}
+ npm-install-checks@6.3.0:
+ dependencies:
+ semver: 7.7.3
+
+ npm-normalize-package-bin@3.0.1: {}
+
+ npm-package-arg@11.0.3:
+ dependencies:
+ hosted-git-info: 7.0.2
+ proc-log: 4.2.0
+ semver: 7.7.3
+ validate-npm-package-name: 5.0.1
+
+ npm-pick-manifest@9.1.0:
+ dependencies:
+ npm-install-checks: 6.3.0
+ npm-normalize-package-bin: 3.0.1
+ npm-package-arg: 11.0.3
+ semver: 7.7.3
+
npm-run-path@4.0.1:
dependencies:
path-key: 3.1.1
object-assign@4.1.1: {}
- object-hash@3.0.0:
- optional: true
+ object-hash@3.0.0: {}
object-inspect@1.13.4: {}
+ on-finished@2.3.0:
+ dependencies:
+ ee-first: 1.1.1
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ on-headers@1.1.0: {}
+
once@1.4.0:
dependencies:
wrappy: 1.0.2
+ one-time@1.0.0:
+ dependencies:
+ fn.name: 1.1.0
+
onetime@5.1.2:
dependencies:
mimic-fn: 2.1.0
+ open@6.4.0:
+ dependencies:
+ is-wsl: 1.1.0
+
+ openapi3-ts@3.2.0:
+ dependencies:
+ yaml: 2.8.2
+
opener@1.5.2: {}
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
ospath@1.2.2: {}
+ p-defer@3.0.0: {}
+
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
- optional: true
p-map@4.0.0:
dependencies:
aggregate-error: 3.1.0
+ p-map@7.0.4:
+ optional: true
+
+ p-throttle@7.0.0: {}
+
+ pac-proxy-agent@7.2.0:
+ dependencies:
+ '@tootallnate/quickjs-emscripten': 0.23.0
+ agent-base: 7.1.4
+ debug: 4.4.3
+ 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
+
+ pac-resolver@7.0.1:
+ dependencies:
+ degenerator: 5.0.1
+ netmask: 2.0.2
+
+ package-json-from-dist@1.0.1: {}
+
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ dependencies:
+ parse5: 6.0.1
+
+ parse5@5.1.1: {}
+
+ parse5@6.0.1: {}
+
+ parseurl@1.3.3: {}
+
path-key@3.1.1: {}
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ path-scurry@2.0.1:
+ dependencies:
+ lru-cache: 11.2.4
+ minipass: 7.1.2
+ optional: true
+
+ path-to-regexp@0.1.12: {}
+
+ path-to-regexp@1.9.0:
+ dependencies:
+ isarray: 0.0.1
+
+ path-to-regexp@8.3.0: {}
+
pend@1.2.0: {}
performance-now@2.1.0: {}
+ pg-cloudflare@1.2.7:
+ optional: true
+
+ pg-connection-string@2.9.1: {}
+
+ pg-gateway@0.3.0-beta.4: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.10.1(pg@8.16.3):
+ dependencies:
+ pg: 8.16.3
+
+ pg-protocol@1.10.3: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.1
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.16.3:
+ dependencies:
+ pg-connection-string: 2.9.1
+ pg-pool: 3.10.1(pg@8.16.3)
+ pg-protocol: 1.10.3
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.2.7
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
+ picomatch@4.0.3:
+ optional: true
+
pidtree@0.5.0: {}
pify@2.3.0: {}
+ pkce-challenge@5.0.1: {}
+
+ portfinder@1.0.38:
+ dependencies:
+ async: 3.2.6
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
postcss-value-parser@4.2.0: {}
postcss@8.4.31:
@@ -4668,6 +8283,16 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ postgres-array@2.0.0: {}
+
+ postgres-bytea@1.0.1: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+
pretty-bytes@5.6.0: {}
pretty-format@27.5.1:
@@ -4676,19 +8301,42 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
+ proc-log@4.2.0: {}
+
+ proc-log@6.1.0:
+ optional: true
+
+ process-nextick-args@2.0.1: {}
+
process@0.11.10: {}
+ progress@2.0.3: {}
+
+ promise-breaker@6.0.0: {}
+
+ promise-retry@2.0.1:
+ dependencies:
+ err-code: 2.0.3
+ retry: 0.12.0
+ optional: true
+
prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
react-is: 16.13.1
+ proto-list@1.2.4: {}
+
proto3-json-serializer@2.0.2:
dependencies:
protobufjs: 7.5.4
optional: true
+ proto3-json-serializer@3.0.4:
+ dependencies:
+ protobufjs: 7.5.4
+
protobufjs@7.5.4:
dependencies:
'@protobufjs/aspromise': 1.1.2
@@ -4704,18 +8352,81 @@ snapshots:
'@types/node': 20.19.24
long: 5.3.2
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ proxy-agent@6.5.0:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ lru-cache: 7.18.3
+ pac-proxy-agent: 7.2.0
+ proxy-from-env: 1.1.0
+ socks-proxy-agent: 8.0.5
+ transitivePeerDependencies:
+ - supports-color
+
proxy-from-env@1.0.0: {}
+ proxy-from-env@1.1.0: {}
+
pump@3.0.3:
dependencies:
end-of-stream: 1.4.5
once: 1.4.0
+ pupa@2.1.1:
+ dependencies:
+ escape-goat: 2.1.1
+
qr.js@0.0.0: {}
- qs@6.14.0:
+ qs@6.14.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ railroad-diagrams@1.0.0: {}
+
+ randexp@0.4.6:
+ dependencies:
+ discontinuous-range: 1.0.0
+ ret: 0.1.15
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.3:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ raw-body@3.0.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.7.1
+ unpipe: 1.0.0
+
+ rc@1.2.8:
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+
+ re2@1.23.0:
dependencies:
- side-channel: 1.1.0
+ install-artifact-from-github: 1.4.0
+ nan: 2.24.0
+ node-gyp: 12.1.0
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
react-dom@18.3.1(react@18.3.1):
dependencies:
@@ -4755,12 +8466,37 @@ snapshots:
dependencies:
loose-envify: 1.4.0
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.2
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
readable-stream@3.6.2:
dependencies:
inherits: 2.0.4
string_decoder: 1.3.0
util-deprecate: 1.0.2
- optional: true
+
+ readable-stream@4.7.0:
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+
+ readdir-glob@1.1.3:
+ dependencies:
+ minimatch: 5.1.6
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
recharts@3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@17.0.2)(react@18.3.1)(redux@5.0.1):
dependencies:
@@ -4788,12 +8524,22 @@ snapshots:
redux@5.0.1: {}
+ registry-auth-token@5.1.0:
+ dependencies:
+ '@pnpm/npm-conf': 2.3.1
+
+ registry-url@5.1.0:
+ dependencies:
+ rc: 1.2.8
+
request-progress@3.0.0:
dependencies:
throttleit: 1.0.1
require-directory@2.1.1: {}
+ require-from-string@2.0.2: {}
+
reselect@5.1.1: {}
restore-cursor@3.1.0:
@@ -4801,6 +8547,8 @@ snapshots:
onetime: 5.1.2
signal-exit: 3.0.7
+ ret@0.1.15: {}
+
retry-request@7.0.2(encoding@0.1.13):
dependencies:
'@types/request': 2.48.13
@@ -4811,25 +8559,112 @@ snapshots:
- supports-color
optional: true
- retry@0.13.1:
+ retry-request@8.0.2:
+ dependencies:
+ extend: 3.0.2
+ teeny-request: 10.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ retry@0.12.0:
optional: true
+ retry@0.13.1: {}
+
rfdc@1.4.1: {}
+ rimraf@5.0.10:
+ dependencies:
+ glob: 10.5.0
+
+ router@2.2.0:
+ dependencies:
+ debug: 4.4.3
+ depd: 2.0.0
+ is-promise: 4.0.0
+ parseurl: 1.3.3
+ path-to-regexp: 8.3.0
+ transitivePeerDependencies:
+ - supports-color
+
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
+ safe-buffer@5.1.2: {}
+
safe-buffer@5.2.1: {}
+ safe-stable-stringify@2.5.0: {}
+
safer-buffer@2.1.2: {}
scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
+ semver-diff@3.1.1:
+ dependencies:
+ semver: 6.3.1
+
+ semver@6.3.1: {}
+
semver@7.7.3: {}
+ send@0.19.2:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.1
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ send@1.2.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ mime-types: 3.0.2
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@1.16.3:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.2
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@2.2.1:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ setprototypeof@1.2.0: {}
+
sharp@0.34.5:
dependencies:
'@img/colour': 1.0.0
@@ -4898,12 +8733,18 @@ snapshots:
signal-exit@3.0.7: {}
+ signal-exit@4.1.0: {}
+
sirv@2.0.4:
dependencies:
'@polka/url': 1.0.0-next.29
mrmime: 2.0.1
totalist: 3.0.1
+ skin-tone@2.0.0:
+ dependencies:
+ unicode-emoji-modifier-base: 1.0.0
+
slice-ansi@3.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -4921,8 +8762,39 @@ snapshots:
ansi-styles: 6.2.3
is-fullwidth-code-point: 4.0.0
+ smart-buffer@4.2.0: {}
+
+ socks-proxy-agent@8.0.5:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ socks: 2.8.7
+ transitivePeerDependencies:
+ - supports-color
+
+ socks@2.8.7:
+ dependencies:
+ ip-address: 10.1.0
+ smart-buffer: 4.2.0
+
+ sort-any@2.0.0:
+ dependencies:
+ lodash: 4.17.21
+
source-map-js@1.2.1: {}
+ source-map@0.6.1:
+ optional: true
+
+ split2@4.2.0: {}
+
+ sprintf-js@1.0.3: {}
+
+ sql-formatter@15.6.12:
+ dependencies:
+ argparse: 2.0.1
+ nearley: 2.20.1
+
sshpk@1.18.0:
dependencies:
asn1: 0.2.6
@@ -4935,13 +8807,37 @@ snapshots:
safer-buffer: 2.1.2
tweetnacl: 0.14.5
+ ssri@13.0.0:
+ dependencies:
+ minipass: 7.1.2
+ optional: true
+
+ stack-trace@0.0.10: {}
+
+ statuses@1.5.0: {}
+
+ statuses@2.0.2: {}
+
+ stream-chain@2.2.5: {}
+
stream-events@1.0.5:
dependencies:
stubs: 3.0.0
- optional: true
- stream-shift@1.0.3:
- optional: true
+ stream-json@1.9.1:
+ dependencies:
+ stream-chain: 2.2.5
+
+ stream-shift@1.0.3: {}
+
+ streamx@2.23.0:
+ dependencies:
+ events-universal: 1.0.1
+ fast-fifo: 1.3.2
+ text-decoder: 1.2.3
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
string-argv@0.3.2: {}
@@ -4957,10 +8853,13 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.2
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
- optional: true
strip-ansi@6.0.1:
dependencies:
@@ -4972,17 +8871,43 @@ snapshots:
strip-final-newline@2.0.0: {}
+ strip-json-comments@2.0.1: {}
+
strnum@1.1.2:
optional: true
- stubs@3.0.0:
- optional: true
+ stubs@3.0.0: {}
styled-jsx@5.1.6(react@18.3.1):
dependencies:
client-only: 0.0.1
react: 18.3.1
+ superstatic@10.0.0(encoding@0.1.13):
+ dependencies:
+ basic-auth-connect: 1.1.0
+ commander: 10.0.1
+ compression: 1.8.1
+ connect: 3.7.0
+ destroy: 1.2.0
+ glob-slasher: 1.0.1
+ is-url: 1.2.4
+ join-path: 1.1.1
+ lodash: 4.17.21
+ mime-types: 2.1.35
+ minimatch: 6.2.0
+ morgan: 1.10.1
+ on-finished: 2.4.1
+ on-headers: 1.1.0
+ path-to-regexp: 1.9.0
+ router: 2.2.0
+ update-notifier-cjs: 5.1.7(encoding@0.1.13)
+ optionalDependencies:
+ re2: 1.23.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -4993,6 +8918,11 @@ snapshots:
supports-color@9.4.0: {}
+ supports-hyperlinks@3.2.0:
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+
systeminformation@5.28.3: {}
tailwindcss@4.0.0: {}
@@ -5001,6 +8931,40 @@ snapshots:
tapable@2.3.0: {}
+ tar-stream@3.1.7:
+ dependencies:
+ b4a: 1.7.3
+ fast-fifo: 1.3.2
+ streamx: 2.23.0
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
+
+ tar@7.5.2:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.2
+ minizlib: 3.1.0
+ yallist: 5.0.0
+ optional: true
+
+ tcp-port-used@1.0.2:
+ dependencies:
+ debug: 4.3.1
+ is2: 2.0.9
+ transitivePeerDependencies:
+ - supports-color
+
+ teeny-request@10.1.0:
+ dependencies:
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ node-fetch: 3.3.2
+ stream-events: 1.0.5
+ transitivePeerDependencies:
+ - supports-color
+
teeny-request@9.0.0(encoding@0.1.13):
dependencies:
http-proxy-agent: 5.0.0
@@ -5013,14 +8977,41 @@ snapshots:
- supports-color
optional: true
+ text-decoder@1.2.3:
+ dependencies:
+ b4a: 1.7.3
+ transitivePeerDependencies:
+ - react-native-b4a
+
+ text-hex@1.0.0: {}
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
throttleit@1.0.1: {}
+ through2@2.0.5:
+ dependencies:
+ readable-stream: 2.3.8
+ xtend: 4.0.2
+
through@2.3.8: {}
tiny-invariant@1.3.3: {}
tiny-warning@1.0.3: {}
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ optional: true
+
tldts-core@6.1.86: {}
tldts@6.1.86:
@@ -5033,37 +9024,106 @@ snapshots:
dependencies:
is-number: 7.0.0
+ toidentifier@1.0.1: {}
+
totalist@3.0.1: {}
tough-cookie@5.1.2:
dependencies:
tldts: 6.1.86
- tr46@0.0.3:
- optional: true
+ toxic@1.0.1:
+ dependencies:
+ lodash: 4.17.21
+
+ tr46@0.0.3: {}
tree-kill@1.2.2: {}
+ triple-beam@1.4.1: {}
+
+ ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.12
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 22.19.3
+ acorn: 8.15.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.9.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+
tslib@2.8.1: {}
+ tsscmp@1.0.6: {}
+
tunnel-agent@0.6.0:
dependencies:
safe-buffer: 5.2.1
tweetnacl@0.14.5: {}
+ type-fest@0.20.2: {}
+
type-fest@0.21.3: {}
type-fest@0.8.1: {}
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ type-is@2.0.1:
+ dependencies:
+ content-type: 1.0.5
+ media-typer: 1.1.0
+ mime-types: 3.0.2
+
+ typedarray-to-buffer@3.1.5:
+ dependencies:
+ is-typedarray: 1.0.0
+
typescript@5.9.3: {}
underscore@1.13.7: {}
undici-types@6.21.0: {}
+ unicode-emoji-modifier-base@1.0.0: {}
+
+ unique-filename@5.0.0:
+ dependencies:
+ unique-slug: 6.0.0
+ optional: true
+
+ unique-slug@6.0.0:
+ dependencies:
+ imurmurhash: 0.1.4
+ optional: true
+
+ unique-string@2.0.0:
+ dependencies:
+ crypto-random-string: 2.0.0
+
+ universal-analytics@0.5.3:
+ dependencies:
+ debug: 4.4.3
+ uuid: 8.3.2
+ transitivePeerDependencies:
+ - supports-color
+
universalify@2.0.1: {}
+ unpipe@1.0.0: {}
+
untildify@4.0.0: {}
update-browserslist-db@1.2.3(browserslist@4.28.1):
@@ -5072,19 +9132,52 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ update-notifier-cjs@5.1.7(encoding@0.1.13):
+ dependencies:
+ boxen: 5.1.2
+ chalk: 4.1.2
+ configstore: 5.0.1
+ has-yarn: 2.1.0
+ import-lazy: 2.1.0
+ is-ci: 2.0.0
+ is-installed-globally: 0.4.0
+ is-npm: 5.0.0
+ is-yarn-global: 0.3.0
+ isomorphic-fetch: 3.0.0(encoding@0.1.13)
+ pupa: 2.1.1
+ registry-auth-token: 5.1.0
+ registry-url: 5.1.0
+ semver: 7.7.3
+ semver-diff: 3.1.1
+ xdg-basedir: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+
+ url-join@0.0.1: {}
+
+ url-template@2.0.8: {}
+
use-sync-external-store@1.6.0(react@18.3.1):
dependencies:
react: 18.3.1
- util-deprecate@1.0.2:
- optional: true
+ util-deprecate@1.0.2: {}
+
+ utils-merge@1.0.1: {}
uuid@10.0.0: {}
uuid@8.3.2: {}
- uuid@9.0.1:
- optional: true
+ uuid@9.0.1: {}
+
+ v8-compile-cache-lib@3.0.1: {}
+
+ valid-url@1.0.9: {}
+
+ validate-npm-package-name@5.0.1: {}
+
+ vary@1.1.2: {}
verror@1.10.0:
dependencies:
@@ -5109,10 +9202,15 @@ snapshots:
d3-time: 3.1.0
d3-timer: 3.0.1
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ web-streams-polyfill@3.3.3: {}
+
web-vitals@4.2.4: {}
- webidl-conversions@3.0.1:
- optional: true
+ webidl-conversions@3.0.1: {}
webpack-bundle-analyzer@4.10.1:
dependencies:
@@ -5141,16 +9239,46 @@ snapshots:
websocket-extensions@0.1.4: {}
+ whatwg-fetch@3.6.20: {}
+
whatwg-url@5.0.0:
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
- optional: true
which@2.0.2:
dependencies:
isexe: 2.0.0
+ which@6.0.0:
+ dependencies:
+ isexe: 3.1.1
+ optional: true
+
+ widest-line@3.1.0:
+ dependencies:
+ string-width: 4.2.3
+
+ winston-transport@4.9.0:
+ dependencies:
+ logform: 2.7.0
+ readable-stream: 3.6.2
+ triple-beam: 1.4.1
+
+ winston@3.19.0:
+ dependencies:
+ '@colors/colors': 1.6.0
+ '@dabh/diagnostics': 2.0.8
+ async: 3.2.6
+ is-stream: 2.0.1
+ logform: 2.7.0
+ one-time: 1.0.0
+ readable-stream: 3.6.2
+ safe-stable-stringify: 2.5.0
+ stack-trace: 0.0.10
+ triple-beam: 1.4.1
+ winston-transport: 4.9.0
+
wrap-ansi@6.2.0:
dependencies:
ansi-styles: 4.3.0
@@ -5163,18 +9291,52 @@ snapshots:
string-width: 4.2.3
strip-ansi: 6.0.1
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 5.1.2
+ strip-ansi: 7.1.2
+
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
+
ws@7.5.10: {}
+ xdg-basedir@4.0.0: {}
+
+ xtend@4.0.2: {}
+
y18n@5.0.8: {}
yallist@4.0.0: {}
+ yallist@5.0.0:
+ optional: true
+
yaml@1.10.2: {}
+ yaml@2.8.2: {}
+
+ yargs-parser@20.2.9: {}
+
yargs-parser@21.1.1: {}
+ yargs@16.2.0:
+ dependencies:
+ cliui: 7.0.4
+ 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: 20.2.9
+
yargs@17.7.2:
dependencies:
cliui: 8.0.1
@@ -5190,5 +9352,20 @@ snapshots:
buffer-crc32: 0.2.13
fd-slicer: 1.1.0
- yocto-queue@0.1.0:
- optional: true
+ yn@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ yoctocolors-cjs@2.1.3: {}
+
+ zip-stream@6.0.1:
+ dependencies:
+ archiver-utils: 5.0.2
+ compress-commons: 6.0.2
+ readable-stream: 4.7.0
+
+ zod-to-json-schema@3.25.1(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod@3.25.76: {}
From 5205d4fe10dd68b2dfffa1541aa5405353781ea8 Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Mon, 29 Dec 2025 13:04:36 -0800
Subject: [PATCH 10/15] fix formatting
---
next-env.d.ts | 2 +-
src/components/home/treatmentModal.tsx | 67 +++++++++++++++-----------
2 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/next-env.d.ts b/next-env.d.ts
index c4b7818..c4e7c0e 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import "./.next/dev/types/routes.d.ts";
+import './.next/types/routes.d.ts'
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/src/components/home/treatmentModal.tsx b/src/components/home/treatmentModal.tsx
index 3b4c0ac..67392f0 100644
--- a/src/components/home/treatmentModal.tsx
+++ b/src/components/home/treatmentModal.tsx
@@ -56,13 +56,11 @@ export default function TreatmentModal(
// TODO:(michael) should probably move to toLocaleString()
const { date, brand, lot, units, cause, sites, type } = treatmentValues
-
+
// For antibody treatments, use monoclonal antibody from profile and clear cause/sites
const isAntibody = type === TreatmentTypeEnum.ANTIBODY
- const medicationBrand = isAntibody
- ? (user?.monoclonalAntibody || '')
- : brand
-
+ const medicationBrand = isAntibody ? user?.monoclonalAntibody || '' : brand
+
const payload: TreatmentType = {
cause: isAntibody ? '' : cause,
createdAt: new Date().toISOString(),
@@ -71,7 +69,7 @@ export default function TreatmentModal(
medication: {
brand: medicationBrand,
lot: isAntibody ? undefined : lot,
- units: isAntibody ? 0 : (units ? parseInt(units, 10) : 0),
+ units: isAntibody ? 0 : units ? parseInt(units, 10) : 0,
},
sites: isAntibody ? '' : sites,
type,
@@ -90,13 +88,11 @@ export default function TreatmentModal(
}
const { uid, date, brand, lot, units, cause, sites, type } = treatmentValues
-
+
// For antibody treatments, use monoclonal antibody from profile and clear cause/sites
const isAntibody = type === TreatmentTypeEnum.ANTIBODY
- const medicationBrand = isAntibody
- ? (user?.monoclonalAntibody || '')
- : brand
-
+ const medicationBrand = isAntibody ? user?.monoclonalAntibody || '' : brand
+
const payload: TreatmentType = {
cause: isAntibody ? '' : cause,
createdAt: new Date().toISOString(),
@@ -105,7 +101,7 @@ export default function TreatmentModal(
medication: {
brand: medicationBrand,
lot: isAntibody ? undefined : lot,
- units: isAntibody ? 0 : (units ? parseInt(units, 10) : 0),
+ units: isAntibody ? 0 : units ? parseInt(units, 10) : 0,
},
sites: isAntibody ? '' : sites,
type,
@@ -129,31 +125,37 @@ export default function TreatmentModal(
// TODO(michael) Add formik validation
const formik = useFormik({
initialValues: {
- brand: displayTreatment
- ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? (user?.monoclonalAntibody || '')
- : displayTreatment.medication.brand)
+ brand: displayTreatment
+ ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? user?.monoclonalAntibody || ''
+ : displayTreatment.medication.brand
: '',
- cause: displayTreatment
- ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY ? '' : displayTreatment.cause)
+ cause: displayTreatment
+ ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? ''
+ : displayTreatment.cause
: '',
date:
displayTreatment && treatment
? displayTreatment.date
: format(new Date(), 'yyyy-MM-dd'),
- lot: displayTreatment
- ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY ? '' : (displayTreatment.medication.lot || ''))
+ lot: displayTreatment
+ ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? ''
+ : displayTreatment.medication.lot || ''
: '',
- sites: displayTreatment
- ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY ? '' : displayTreatment.sites)
+ sites: displayTreatment
+ ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? ''
+ : displayTreatment.sites
: '',
type: displayTreatment
? displayTreatment.type
: (TreatmentTypeEnum.PROPHY as TreatmentTypeOptions),
units: displayTreatment
- ? (displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? '0'
- : displayTreatment.medication.units.toString())
+ ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
+ ? '0'
+ : displayTreatment.medication.units.toString()
: '',
uid: displayTreatment ? displayTreatment.uid : null,
},
@@ -169,7 +171,10 @@ export default function TreatmentModal(
// Update brand to monoclonal antibody when type changes to ANTIBODY
useEffect(() => {
- if (formik.values.type === TreatmentTypeEnum.ANTIBODY && user?.monoclonalAntibody) {
+ if (
+ formik.values.type === TreatmentTypeEnum.ANTIBODY &&
+ user?.monoclonalAntibody
+ ) {
if (formik.values.brand !== user.monoclonalAntibody) {
formik.setFieldValue('brand', user.monoclonalAntibody)
}
@@ -242,7 +247,10 @@ export default function TreatmentModal(
{
- formik.setFieldValue('type', TreatmentTypeEnum.PREVENTATIVE)
+ formik.setFieldValue(
+ 'type',
+ TreatmentTypeEnum.PREVENTATIVE
+ )
// Clear antibody-specific fields when switching away from antibody
if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
formik.setFieldValue('brand', '')
@@ -266,7 +274,10 @@ export default function TreatmentModal(
onClick={() => {
formik.setFieldValue('type', TreatmentTypeEnum.ANTIBODY)
// Set brand to monoclonal antibody and clear cause/sites when switching to antibody
- formik.setFieldValue('brand', user?.monoclonalAntibody || '')
+ formik.setFieldValue(
+ 'brand',
+ user?.monoclonalAntibody || ''
+ )
formik.setFieldValue('cause', '')
formik.setFieldValue('sites', '')
formik.setFieldValue('units', '0')
From 869f1f4836afd94e699a0f4e0feff5fcb7077a37 Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Mon, 29 Dec 2025 13:07:20 -0800
Subject: [PATCH 11/15] fix effect deps
---
src/components/home/treatmentModal.tsx | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/components/home/treatmentModal.tsx b/src/components/home/treatmentModal.tsx
index 67392f0..25ba9cc 100644
--- a/src/components/home/treatmentModal.tsx
+++ b/src/components/home/treatmentModal.tsx
@@ -169,24 +169,25 @@ export default function TreatmentModal(
},
})
+ const monoclonalAntibody = user?.monoclonalAntibody
+ const { brand, cause, sites, type } = formik.values
+ const { setFieldValue } = formik
+
// Update brand to monoclonal antibody when type changes to ANTIBODY
useEffect(() => {
- if (
- formik.values.type === TreatmentTypeEnum.ANTIBODY &&
- user?.monoclonalAntibody
- ) {
- if (formik.values.brand !== user.monoclonalAntibody) {
- formik.setFieldValue('brand', user.monoclonalAntibody)
+ if (type === TreatmentTypeEnum.ANTIBODY && monoclonalAntibody) {
+ if (brand !== monoclonalAntibody) {
+ setFieldValue('brand', monoclonalAntibody)
}
// Ensure cause and sites are empty for antibody treatments
- if (formik.values.cause !== '') {
- formik.setFieldValue('cause', '')
+ if (cause !== '') {
+ setFieldValue('cause', '')
}
- if (formik.values.sites !== '') {
- formik.setFieldValue('sites', '')
+ if (sites !== '') {
+ setFieldValue('sites', '')
}
}
- }, [formik.values.type, user?.monoclonalAntibody])
+ }, [brand, cause, monoclonalAntibody, setFieldValue, sites, type])
const handleSubmit = () => {
track('Logged Treatment', {
From 2ecc2c46c066a3d80bfede94e387e8797d04165f Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Mon, 29 Dec 2025 13:39:58 -0800
Subject: [PATCH 12/15] try to fix ci workflow
---
.github/workflows/main.yml | 41 ++++++++++++++++++++++++++++++++------
1 file changed, 35 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index e09c54e..b6ccf7c 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -11,22 +11,50 @@ jobs:
runs-on: ubuntu-latest
env:
FIREBASE_EMULATORS_PATH: ${{ github.workspace }}/emulator-cache
+ CYPRESS_CACHE_FOLDER: ~/.cache/Cypress
steps:
- name: Checkout repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Install pnpm
- uses: pnpm/action-setup@v2
+ uses: pnpm/action-setup@v4
with:
version: 10.13.1
run_install: false
- name: Set up Node
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
node-version: 22
- cache: 'pnpm'
+
+ - name: Set up Java
+ uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: '21'
+
+ - name: Determine pnpm store path
+ id: pnpm-store
+ run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}
+ restore-keys: |
+ pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-
+ pnpm-store-${{ runner.os }}-
+
+ - name: Cache Cypress binary
+ uses: actions/cache@v4
+ with:
+ path: ~/.cache/Cypress
+ key: cypress-binary-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}
+ restore-keys: |
+ cypress-binary-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-
+ cypress-binary-${{ runner.os }}-
- run: pnpm install --frozen-lockfile # optional, --immutable
@@ -49,8 +77,9 @@ jobs:
uses: cypress-io/github-action@v4
with:
build: pnpm build
- start: pnpm start
- wait-on: 'http://localhost:8082, http://localhost:8081'
+ start: node .next/standalone/server.js
+ wait-on: 'http://localhost:8082, http://localhost:8081, http://localhost:3000'
+ install: false
env:
FIREBASE_PRIVATE_KEY: ${{ secrets.FIREBASE_PRIVATE_KEY }}
FIREBASE_CLIENT_EMAIL: ${{ secrets.FIREBASE_CLIENT_EMAIL }}
From 5696b9440dd39d4b1fc0162a941f2d9b280289ca Mon Sep 17 00:00:00 2001
From: Michael Schultz
Date: Sat, 10 Jan 2026 15:02:57 -0800
Subject: [PATCH 13/15] fix hydration issues and treatmet dialog
---
.github/workflows/main.yml | 78 ++++++--
next-env.d.ts | 2 +-
next.config.js | 17 +-
package.json | 2 +-
src/app/head.tsx | 17 ++
src/app/layout.tsx | 29 +--
src/app/page.tsx | 2 +-
src/app/providers.tsx | 5 +
src/components/blog/blogFooter.tsx | 16 +-
src/components/home/actionMenu.tsx | 121 +++++++++++++
src/components/home/header.tsx | 15 +-
src/components/home/treatmentModal.tsx | 198 ++++++++++++---------
src/components/home/treatmentTable.tsx | 176 +++++++++++-------
src/components/shared/emergencySnippet.tsx | 10 +-
src/components/shared/footer.tsx | 11 +-
src/components/shared/staticHeader.tsx | 13 +-
src/lib/contexts/ThemeContext.tsx | 24 ++-
src/lib/hooks/useTreatmentsQuery.ts | 17 +-
18 files changed, 530 insertions(+), 223 deletions(-)
create mode 100644 src/app/head.tsx
create mode 100644 src/components/home/actionMenu.tsx
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index b6ccf7c..6cec2e6 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -7,7 +7,8 @@ on:
workflow_dispatch:
jobs:
- test-app:
+ setup-environment:
+ name: Setup environment
runs-on: ubuntu-latest
env:
FIREBASE_EMULATORS_PATH: ${{ github.workspace }}/emulator-cache
@@ -42,42 +43,81 @@ jobs:
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-store.outputs.path }}
- key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}
+ key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: |
- pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-
pnpm-store-${{ runner.os }}-
- name: Cache Cypress binary
uses: actions/cache@v4
with:
path: ~/.cache/Cypress
- key: cypress-binary-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }}
+ key: cypress-binary-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
restore-keys: |
- cypress-binary-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-
cypress-binary-${{ runner.os }}-
- - run: pnpm install --frozen-lockfile # optional, --immutable
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile # optional, --immutable
- - name: Start firebase in background
- run: pnpm firebase &
+ run-tests:
+ name: Run E2E tests
+ runs-on: ubuntu-latest
+ needs: setup-environment
+ env:
+ FIREBASE_EMULATORS_PATH: ${{ github.workspace }}/emulator-cache
+ CYPRESS_CACHE_FOLDER: ~/.cache/Cypress
- # - name: sleep for 30 seconds
- # run: sleep 30
- # shell: bash
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v4
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10.13.1
+ run_install: false
+
+ - name: Set up Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
- # - name: Cache firebase emulators
- # uses: actions/cache@v3
- # with:
- # path: ${{ env.FIREBASE_EMULATORS_PATH }}
- # key:
- # ${{ runner.os }}-firebase-emulators-${{ hashFiles('emulator-cache/**') }}
- # continue-on-error: true
+ - name: Set up Java
+ uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: '21'
+
+ - name: Determine pnpm store path
+ id: pnpm-store
+ run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.pnpm-store.outputs.path }}
+ key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
+ restore-keys: |
+ pnpm-store-${{ runner.os }}-
+
+ - name: Cache Cypress binary
+ uses: actions/cache@v4
+ with:
+ path: ~/.cache/Cypress
+ key: cypress-binary-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
+ restore-keys: |
+ cypress-binary-${{ runner.os }}-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile # optional, --immutable
+
+ - name: Start firebase in background
+ run: pnpm firebase &
- name: Start app and run tests
uses: cypress-io/github-action@v4
with:
build: pnpm build
- start: node .next/standalone/server.js
+ start: pnpm start
wait-on: 'http://localhost:8082, http://localhost:8081, http://localhost:3000'
install: false
env:
diff --git a/next-env.d.ts b/next-env.d.ts
index c4e7c0e..a3e4680 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import './.next/types/routes.d.ts'
+import './.next/dev/types/routes.d.ts'
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.js b/next.config.js
index 4b60420..3888717 100644
--- a/next.config.js
+++ b/next.config.js
@@ -15,6 +15,11 @@ const nextConfig = {
hostname: 'lh3.googleusercontent.com',
pathname: '/**', // Allow all paths on this hostname
},
+ {
+ protocol: 'https',
+ hostname: 'fonts.gstatic.com',
+ pathname: '/**', // Allow all paths on this hostname
+ },
{
protocol: 'https',
hostname: 'assets.onedollarstats.com',
@@ -67,12 +72,12 @@ const nextConfig = {
// },
// Production optimizations
- ...(process.env.NODE_ENV === 'production' && {
- // Enable standalone output for better deployment
- output: 'standalone',
- // Compress responses
- compress: true,
- }),
+ // ...(process.env.NODE_ENV === 'production' && {
+ // // // Enable standalone output for better deployment
+ // // output: 'standalone',
+ // // // Compress responses
+ // compress: true,
+ // }),
}
export default withBundleAnalyzer(nextConfig)
diff --git a/package.json b/package.json
index f3f68e9..787cd54 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "hemolog",
"version": "2.9.0",
"type": "module",
- "packageManager": "pnpm@10.13.1",
+ "packageManager": "pnpm@10.28.0",
"scripts": {
"build": "pnpm run lint:fix; next build",
"build:prod": "pnpm run rules:prod && pnpm run lint:fix && next build",
diff --git a/src/app/head.tsx b/src/app/head.tsx
new file mode 100644
index 0000000..3ac37f6
--- /dev/null
+++ b/src/app/head.tsx
@@ -0,0 +1,17 @@
+const googleRichResultsSchema = {
+ '@context': 'https://schema.org',
+ '@type': 'Organization',
+ url: 'https://hemolog.com',
+ logo: 'https://hemolog.com/images/hemolog-logo.png',
+}
+
+export default function Head(): JSX.Element {
+ return (
+
+ )
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 5e8918b..7c8ecfe 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,7 +1,15 @@
import type { Metadata } from 'next'
+import { Nanum_Pen_Script } from 'next/font/google'
import { Providers } from './providers'
import './globals.css'
+const nanumPenScript = Nanum_Pen_Script({
+ weight: '400',
+ subsets: ['latin'],
+ display: 'swap',
+ variable: '--font-nanum-pen-script',
+})
+
export const metadata: Metadata = {
title: 'Hemolog',
description:
@@ -51,32 +59,13 @@ export const metadata: Metadata = {
},
}
-const googleRichResultsSchema = {
- '@context': 'https://schema.org',
- '@type': 'Organization',
- url: 'https://hemolog.com',
- logo: 'https://hemolog.com/images/hemolog-logo.png',
-}
-
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
-
-
-
-
-
+
{children}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 17a636c..168281a 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -24,7 +24,7 @@ export default function Landing(): JSX.Element {
{/* Content */}
-
+
TREATMENT INSIGHTS
THAT MATTER
diff --git a/src/app/providers.tsx b/src/app/providers.tsx
index 48622bd..2857c69 100644
--- a/src/app/providers.tsx
+++ b/src/app/providers.tsx
@@ -1,11 +1,16 @@
'use client'
+import { useEffect } from 'react'
import { Toaster } from 'react-hot-toast'
import { AuthProvider } from '@/lib/auth'
import { ThemeProvider } from '@/lib/contexts/ThemeContext'
import { QueryProvider } from '@/lib/providers/query-provider'
export function Providers({ children }: { children: React.ReactNode }) {
+ useEffect(() => {
+ document.body.setAttribute('data-hydrated', 'true')
+ }, [])
+
return (
diff --git a/src/components/blog/blogFooter.tsx b/src/components/blog/blogFooter.tsx
index 9d3e57e..0978948 100644
--- a/src/components/blog/blogFooter.tsx
+++ b/src/components/blog/blogFooter.tsx
@@ -2,12 +2,22 @@
import Image from 'next/image'
import { useRouter } from 'next/navigation'
+import { useEffect, useState } from 'react'
import { useAuth } from '@/lib/auth'
export default function BlogFooter(): JSX.Element {
const { user, loading } = useAuth()
const router = useRouter()
+ const [mounted, setMounted] = useState(false)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ // Use consistent state during SSR and initial hydration
+ const isLoading = !mounted || loading
+ const showUserContent = mounted && !loading && user
return (
@@ -15,7 +25,7 @@ export default function BlogFooter(): JSX.Element {
Designed and developed by Michael Schultz in Oakland, California.
- {user ? (
+ {showUserContent ? (
Thanks for being part of the Hemolog community!
@@ -25,10 +35,10 @@ export default function BlogFooter(): JSX.Element {
router.push('/signin')}
- disabled={loading}
+ disabled={isLoading}
className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2 w-fit'
>
- {loading && (
+ {isLoading && (
)}
Register
diff --git a/src/components/home/actionMenu.tsx b/src/components/home/actionMenu.tsx
new file mode 100644
index 0000000..2262138
--- /dev/null
+++ b/src/components/home/actionMenu.tsx
@@ -0,0 +1,121 @@
+'use client'
+
+import { IconDots } from '@tabler/icons-react'
+import { useEffect, useRef, useState } from 'react'
+import { createPortal } from 'react-dom'
+import type { TreatmentType } from '@/lib/db/treatments'
+
+interface ActionMenuProps {
+ treatment: TreatmentType
+ onEdit: (treatment: TreatmentType) => void
+ onDelete: (uid: string) => void
+}
+
+export default function ActionMenu({
+ treatment,
+ onEdit,
+ onDelete,
+}: ActionMenuProps) {
+ const [isOpen, setIsOpen] = useState(false)
+ const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })
+ const buttonRef = useRef(null)
+ const menuRef = useRef(null)
+ const [mounted, setMounted] = useState(false)
+
+ // Track if component is mounted (for portal)
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ // Calculate menu position when opening
+ useEffect(() => {
+ if (isOpen && buttonRef.current) {
+ const rect = buttonRef.current.getBoundingClientRect()
+ setMenuPosition({
+ top: rect.bottom + 4,
+ left: rect.right - 128, // 128px = w-32 menu width
+ })
+ }
+ }, [isOpen])
+
+ // Close menu when clicking outside
+ useEffect(() => {
+ if (!isOpen) return
+
+ const handleClickOutside = (e: MouseEvent) => {
+ const target = e.target as Node
+ if (
+ menuRef.current &&
+ !menuRef.current.contains(target) &&
+ buttonRef.current &&
+ !buttonRef.current.contains(target)
+ ) {
+ setIsOpen(false)
+ }
+ }
+
+ // Close on scroll to prevent menu from floating away
+ const handleScroll = () => setIsOpen(false)
+
+ document.addEventListener('mousedown', handleClickOutside)
+ window.addEventListener('scroll', handleScroll, true)
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside)
+ window.removeEventListener('scroll', handleScroll, true)
+ }
+ }, [isOpen])
+
+ const handleEdit = () => {
+ setIsOpen(false)
+ // Use setTimeout to ensure menu closes before triggering the edit
+ setTimeout(() => {
+ onEdit(treatment)
+ }, 0)
+ }
+
+ const handleDelete = () => {
+ setIsOpen(false)
+ if (treatment.uid) {
+ onDelete(treatment.uid)
+ }
+ }
+
+ const menu =
+ isOpen && mounted ? (
+
+
+ Update
+
+
+ Delete
+
+
+ ) : null
+
+ return (
+ <>
+ setIsOpen(!isOpen)}
+ >
+
+
+
+ {menu && createPortal(menu, document.body)}
+ >
+ )
+}
diff --git a/src/components/home/header.tsx b/src/components/home/header.tsx
index 48772fa..4d8ce92 100644
--- a/src/components/home/header.tsx
+++ b/src/components/home/header.tsx
@@ -4,6 +4,7 @@ import React from 'react'
import TreatmentModal from '@/components/home/treatmentModal'
import Logo from '@/components/shared/logo'
import { useAuth } from '@/lib/auth'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
interface Props {
version?: string
@@ -12,6 +13,7 @@ interface Props {
const Header = (props: Props): JSX.Element | null => {
const { version } = props
const { user, signout } = useAuth()
+ const { data: treatments } = useTreatmentsQuery()
const [treatmentModal, setTreatmentModal] = React.useState(false)
@@ -132,11 +134,14 @@ const Header = (props: Props): JSX.Element | null => {
)}
-
+ {treatmentModal && (
+
+ )}
>
)
}
diff --git a/src/components/home/treatmentModal.tsx b/src/components/home/treatmentModal.tsx
index 25ba9cc..6a70e1f 100644
--- a/src/components/home/treatmentModal.tsx
+++ b/src/components/home/treatmentModal.tsx
@@ -1,6 +1,6 @@
import { format } from 'date-fns'
import { useFormik } from 'formik'
-import { useEffect } from 'react'
+import React from 'react'
import toast from 'react-hot-toast'
import { useAuth } from '@/lib/auth'
import {
@@ -10,7 +10,6 @@ import {
} from '@/lib/db/treatments'
import { track } from '@/lib/helpers'
import { useTreatmentMutations } from '@/lib/hooks/useTreatmentMutations'
-import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
import type { AttachedUserType } from '@/lib/types/users'
interface TreatmentValues {
@@ -30,21 +29,124 @@ interface TreatmentModalProps {
// biome-ignore lint/suspicious/noExplicitAny: not sure what this should be
bindings: any
treatment?: TreatmentType
+ // Previous treatment for prefilling form when creating new treatments
+ previousTreatment?: TreatmentType
}
+// Helper function to compute initial values - called once when modal mounts
+function getInitialValues(
+ treatment: TreatmentType | undefined,
+ previousTreatment: TreatmentType | undefined,
+ monoclonalAntibody: string | undefined
+) {
+ const displayTreatment = treatment || previousTreatment
+ const isAntibody = displayTreatment?.type === TreatmentTypeEnum.ANTIBODY
+
+ return {
+ brand: displayTreatment
+ ? isAntibody
+ ? monoclonalAntibody || ''
+ : displayTreatment.medication.brand
+ : '',
+ cause: displayTreatment ? (isAntibody ? '' : displayTreatment.cause) : '',
+ date: treatment
+ ? displayTreatment?.date || format(new Date(), 'yyyy-MM-dd')
+ : format(new Date(), 'yyyy-MM-dd'),
+ lot: displayTreatment
+ ? isAntibody
+ ? ''
+ : displayTreatment.medication.lot || ''
+ : '',
+ sites: displayTreatment ? (isAntibody ? '' : displayTreatment.sites) : '',
+ type: displayTreatment
+ ? displayTreatment.type
+ : (TreatmentTypeEnum.PROPHY as TreatmentTypeOptions),
+ units: displayTreatment
+ ? isAntibody
+ ? '0'
+ : displayTreatment.medication.units.toString()
+ : '',
+ uid: displayTreatment?.uid || null,
+ }
+}
+
+// Debug: Track render count
+let renderCount = 0
+
export default function TreatmentModal(
props: TreatmentModalProps
): JSX.Element {
- const { visible, setVisible, treatment } = props
+ const { visible, setVisible, treatment, previousTreatment } = props
+
+ // Debug: Log every render
+ renderCount++
+ console.log(`[TreatmentModal] Render #${renderCount}`, {
+ visible,
+ treatmentUid: treatment?.uid,
+ previousTreatmentUid: previousTreatment?.uid,
+ })
+
const { user } = useAuth()
- const { data: treatments } = useTreatmentsQuery()
- const { createTreatment, updateTreatment } = useTreatmentMutations({
- onCreateSuccess: () => closeModal(),
- onUpdateSuccess: () => closeModal(),
+ console.log('[TreatmentModal] useAuth result:', { userUid: user?.uid })
+
+ // Use the mutations hook without callbacks - we'll handle success in the handlers
+ const { createTreatment, updateTreatment } = useTreatmentMutations()
+ console.log('[TreatmentModal] useTreatmentMutations called')
+
+ // Compute initial values once when component mounts
+ const [initialValues] = React.useState(() => {
+ console.log(
+ '[TreatmentModal] Computing initial values (should only happen once)'
+ )
+ return getInitialValues(
+ treatment,
+ previousTreatment,
+ user?.monoclonalAntibody
+ )
+ })
+
+ // TODO(michael) Add formik validation
+ const formik = useFormik({
+ initialValues,
+ enableReinitialize: false,
+ onSubmit: async (values) => {
+ if (treatment) {
+ await handleUpdateTreatment(values)
+ } else {
+ await handleCreateTreatment(values)
+ }
+ },
})
- // Treatments are already sorted by the query hook (newest first)
- const previousTreatment = treatments?.[0]
+ if (visible) {
+ // #region agent log
+ fetch('http://127.0.0.1:7242/ingest/3dc15767-f349-4da6-9392-58b37a9964f4', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ sessionId: 'debug-session',
+ runId: 'pre-fix',
+ hypothesisId: 'H2',
+ location: 'src/components/home/treatmentModal.tsx:103',
+ message: 'Formik state inside TreatmentModal',
+ data: {
+ treatmentUid: treatment?.uid || null,
+ previousTreatmentUid: previousTreatment?.uid || null,
+ formUid: formik.values.uid || null,
+ formType: formik.values.type,
+ initialUid: initialValues.uid || null,
+ isDirty: formik.dirty,
+ isValid: formik.isValid,
+ isSubmitting: formik.isSubmitting,
+ dateValue: formik.values.date,
+ },
+ timestamp: Date.now(),
+ }),
+ }).catch(() => {})
+ // #endregion
+ }
+
+ console.log('[TreatmentModal] formik values:', formik.values)
const handleCreateTreatment = async (treatmentValues: TreatmentValues) => {
const treatmentUser: AttachedUserType = {
@@ -76,7 +178,9 @@ export default function TreatmentModal(
user: treatmentUser,
}
- createTreatment(payload)
+ createTreatment(payload, {
+ onSuccess: () => setVisible(false),
+ })
}
const handleUpdateTreatment = async (treatmentValues: TreatmentValues) => {
@@ -109,7 +213,10 @@ export default function TreatmentModal(
}
if (uid) {
- updateTreatment({ uid, userUid: user?.uid || '', data: payload })
+ updateTreatment(
+ { uid, userUid: user?.uid || '', data: payload },
+ { onSuccess: () => setVisible(false) }
+ )
} else {
toast.error('Treatment database entry not found')
}
@@ -120,75 +227,6 @@ export default function TreatmentModal(
formik.resetForm()
}
- const displayTreatment = treatment ? treatment : previousTreatment
-
- // TODO(michael) Add formik validation
- const formik = useFormik({
- initialValues: {
- brand: displayTreatment
- ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? user?.monoclonalAntibody || ''
- : displayTreatment.medication.brand
- : '',
- cause: displayTreatment
- ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? ''
- : displayTreatment.cause
- : '',
- date:
- displayTreatment && treatment
- ? displayTreatment.date
- : format(new Date(), 'yyyy-MM-dd'),
- lot: displayTreatment
- ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? ''
- : displayTreatment.medication.lot || ''
- : '',
- sites: displayTreatment
- ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? ''
- : displayTreatment.sites
- : '',
- type: displayTreatment
- ? displayTreatment.type
- : (TreatmentTypeEnum.PROPHY as TreatmentTypeOptions),
- units: displayTreatment
- ? displayTreatment.type === TreatmentTypeEnum.ANTIBODY
- ? '0'
- : displayTreatment.medication.units.toString()
- : '',
- uid: displayTreatment ? displayTreatment.uid : null,
- },
- enableReinitialize: true,
- onSubmit: async (values) => {
- if (treatment) {
- await handleUpdateTreatment(values)
- } else {
- await handleCreateTreatment(values)
- }
- },
- })
-
- const monoclonalAntibody = user?.monoclonalAntibody
- const { brand, cause, sites, type } = formik.values
- const { setFieldValue } = formik
-
- // Update brand to monoclonal antibody when type changes to ANTIBODY
- useEffect(() => {
- if (type === TreatmentTypeEnum.ANTIBODY && monoclonalAntibody) {
- if (brand !== monoclonalAntibody) {
- setFieldValue('brand', monoclonalAntibody)
- }
- // Ensure cause and sites are empty for antibody treatments
- if (cause !== '') {
- setFieldValue('cause', '')
- }
- if (sites !== '') {
- setFieldValue('sites', '')
- }
- }
- }, [brand, cause, monoclonalAntibody, setFieldValue, sites, type])
-
const handleSubmit = () => {
track('Logged Treatment', {
type: formik.values.type,
diff --git a/src/components/home/treatmentTable.tsx b/src/components/home/treatmentTable.tsx
index 4299fbc..e5fbec5 100644
--- a/src/components/home/treatmentTable.tsx
+++ b/src/components/home/treatmentTable.tsx
@@ -1,6 +1,6 @@
'use client'
-import { IconChevronDown, IconChevronUp, IconDots } from '@tabler/icons-react'
+import { IconChevronDown, IconChevronUp } from '@tabler/icons-react'
import {
type ColumnDef,
flexRender,
@@ -17,6 +17,7 @@ import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/treatments'
import { filterTreatments } from '@/lib/helpers'
import { useTreatmentMutations } from '@/lib/hooks/useTreatmentMutations'
import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+import ActionMenu from './actionMenu'
import TreatmentModal from './treatmentModal'
interface TreatmentTableProps {
@@ -34,10 +35,13 @@ export default function TreatmentTable(
isLoading,
isError,
error,
+ isFetching,
} = useTreatmentsQuery({ limit, uid })
const { user } = useAuth()
const { deleteTreatment } = useTreatmentMutations()
- const [selectedTreatment, setSelectedTreatment] = useState()
+ const [selectedTreatmentUid, setSelectedTreatmentUid] = useState<
+ string | null
+ >(null)
const [treatmentModal, setTreatmentModal] = useState(false)
const [sorting, setSorting] = useState([
{ id: 'date', desc: true },
@@ -45,6 +49,15 @@ export default function TreatmentTable(
const filteredTreatments = filterTreatments(treatments, filterYear)
+ // Look up the selected treatment by UID - memoized to prevent unnecessary re-renders
+ const selectedTreatment = useMemo(
+ () =>
+ selectedTreatmentUid
+ ? treatments.find((t) => t.uid === selectedTreatmentUid)
+ : undefined,
+ [selectedTreatmentUid, treatments]
+ )
+
// Determine if user can edit/delete treatments
const isLoggedInUser = user && (!uid || uid === user.uid)
@@ -56,6 +69,62 @@ export default function TreatmentTable(
[deleteTreatment, user?.uid]
)
+ // Edit function - memoized to prevent column recreation
+ const editRow = useCallback((treatment: TreatmentType) => {
+ // #region agent log
+ fetch('http://127.0.0.1:7242/ingest/3dc15767-f349-4da6-9392-58b37a9964f4', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ sessionId: 'debug-session',
+ runId: 'pre-fix',
+ hypothesisId: 'H1',
+ location: 'src/components/home/treatmentTable.tsx:70',
+ message: 'editRow invoked',
+ data: {
+ treatmentUid: treatment.uid || null,
+ modalOpen: true,
+ },
+ timestamp: Date.now(),
+ }),
+ }).catch(() => {})
+ // #endregion
+ setSelectedTreatmentUid(treatment.uid || null)
+ setTreatmentModal(true)
+ }, [])
+
+ // Close modal handler - clears selected treatment when closing
+ const handleModalClose = useCallback(
+ (visible: boolean) => {
+ // #region agent log
+ fetch(
+ 'http://127.0.0.1:7242/ingest/3dc15767-f349-4da6-9392-58b37a9964f4',
+ {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ sessionId: 'debug-session',
+ runId: 'pre-fix',
+ hypothesisId: 'H1',
+ location: 'src/components/home/treatmentTable.tsx:76',
+ message: 'handleModalClose called',
+ data: {
+ nextVisible: visible,
+ selectedTreatmentUid,
+ },
+ timestamp: Date.now(),
+ }),
+ }
+ ).catch(() => {})
+ // #endregion
+ setTreatmentModal(visible)
+ if (!visible) {
+ setSelectedTreatmentUid(null)
+ }
+ },
+ [selectedTreatmentUid]
+ )
+
// Column definitions - memoized to prevent recreation on every render
const columns: ColumnDef[] = useMemo(() => {
const baseColumns: ColumnDef[] = [
@@ -117,7 +186,6 @@ export default function TreatmentTable(
},
]
- // Add actions column for logged-in users
if (isLoggedInUser) {
baseColumns.push({
id: 'actions',
@@ -125,76 +193,19 @@ export default function TreatmentTable(
cell: ({ row }) => {
const treatment = row.original
return (
-
- {
- // Simple dropdown implementation
- const menu = document.createElement('div')
- menu.innerHTML = `
-