From bedf7708ba05c9812174efe6ef5f0a715e055625 Mon Sep 17 00:00:00 2001 From: aube-dev Date: Thu, 19 Sep 2024 05:54:11 +0900 Subject: [PATCH] feat: add sentry & use vite env & add kakao oauth --- .eslintrc.cjs | 6 + app/apis/auth.ts | 11 +- .../KakaoLoginButton/KakaoLoginButton.tsx | 27 +- app/contexts/AuthContext.tsx | 11 + app/contexts/EnvContext.tsx | 4 - app/entry.client.tsx | 36 + app/entry.server.tsx | 88 ++ app/hooks/useAuth.ts | 10 + app/hooks/useEnv.tsx | 21 - app/hooks/useTypedFetcher.ts | 1 - app/models/api.ts | 4 +- app/root.tsx | 40 +- app/routes/_index.tsx | 20 +- app/routes/oauth.kakao.tsx | 20 +- app/routes/oauth.tsx | 24 + app/utils/server.ts | 27 + app/vite-env.d.ts | 9 + functions/[[path]].ts | 30 +- package.json | 8 +- patches/vite@5.3.3.patch | 12 + pnpm-lock.yaml | 1276 ++++++++++++++++- server/constants/env.ts | 20 +- server/index.ts | 9 +- server/models/auth.ts | 55 +- server/types/env.ts | 8 +- server/utils/cloudflare.ts | 66 +- vite.config.ts | 95 +- 27 files changed, 1644 insertions(+), 294 deletions(-) create mode 100644 app/contexts/AuthContext.tsx delete mode 100644 app/contexts/EnvContext.tsx create mode 100644 app/entry.client.tsx create mode 100644 app/entry.server.tsx create mode 100644 app/hooks/useAuth.ts delete mode 100644 app/hooks/useEnv.tsx create mode 100644 app/routes/oauth.tsx create mode 100644 app/utils/server.ts create mode 100644 app/vite-env.d.ts create mode 100644 patches/vite@5.3.3.patch diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 6cf947a..bcdba01 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -194,6 +194,12 @@ module.exports = { importNames: ['useFetcher'], message: '`@/hooks/useTypedFetcher`를 사용해 주세요.', }, + { + group: ['@remix-run/cloudflare'], + importNames: ['redirect'], + message: + '`@/utils/server`의 `redirectWithAuthCookie`를 사용해 주세요.', + }, ], }, ], diff --git a/app/apis/auth.ts b/app/apis/auth.ts index 61c7990..a2118f4 100644 --- a/app/apis/auth.ts +++ b/app/apis/auth.ts @@ -1,7 +1,7 @@ import { Api } from '@/models/api'; -export const api_loginWithKakao = new Api< - { code: string; state: string }, +export const api_loginWithOauth = new Api< + { oauthKey: string }, { userId: number; accessToken: string; @@ -10,13 +10,12 @@ export const api_loginWithKakao = new Api< refreshTokenExpiresAt: string; } >({ - method: 'POST', - endpoint: '/login/oauth2/code/kakao', + method: 'GET', + endpoint: '/oauth2/token', needToLogin: false, request: (variables) => ({ queryParams: { - code: variables.code, - state: variables.state, + oauthKey: variables.oauthKey, }, }), }); diff --git a/app/components/KakaoLoginButton/KakaoLoginButton.tsx b/app/components/KakaoLoginButton/KakaoLoginButton.tsx index 6191d99..1dd175a 100644 --- a/app/components/KakaoLoginButton/KakaoLoginButton.tsx +++ b/app/components/KakaoLoginButton/KakaoLoginButton.tsx @@ -1,24 +1,7 @@ -import React, { useEffect, useState } from 'react'; -import useEnv from '@/hooks/useEnv'; - -const KakaoLoginButton: React.FC = () => { - const env = useEnv(); - const [kakaoAuthUrl, setKakaoAuthUrl] = useState(''); - - useEffect(() => { - const redirectUri = - window.location.origin.replace('localhost', '127.0.0.1') + '/oauth/kakao'; - setKakaoAuthUrl( - `${env.API_URL}/oauth2/authorization/kakao?redirect_to=${redirectUri}`, - ); - // setKakaoAuthUrl('http://146.56.161.252:8080/oauth2/authorization/kakao'); - }, [env.API_URL]); - - return ( - - - - ); -}; +const KakaoLoginButton: React.FC = () => ( + + + +); export default KakaoLoginButton; diff --git a/app/contexts/AuthContext.tsx b/app/contexts/AuthContext.tsx new file mode 100644 index 0000000..6df32f8 --- /dev/null +++ b/app/contexts/AuthContext.tsx @@ -0,0 +1,11 @@ +import { createContext } from 'react'; + +export interface AuthStore { + isLoggedIn: boolean; +} + +const AuthContext = createContext({ + isLoggedIn: false, +}); + +export default AuthContext; diff --git a/app/contexts/EnvContext.tsx b/app/contexts/EnvContext.tsx deleted file mode 100644 index 7323636..0000000 --- a/app/contexts/EnvContext.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import { createContext } from 'react'; -import { type ClientEnv } from '@server'; - -export const EnvContext = createContext(null); diff --git a/app/entry.client.tsx b/app/entry.client.tsx new file mode 100644 index 0000000..4a8aa9a --- /dev/null +++ b/app/entry.client.tsx @@ -0,0 +1,36 @@ +import { RemixBrowser, useLocation, useMatches } from '@remix-run/react'; +import * as Sentry from '@sentry/remix'; +import { startTransition, StrictMode, useEffect } from 'react'; +import { hydrateRoot } from 'react-dom/client'; + +Sentry.init({ + dsn: import.meta.env.SHARED_SENTRY_DSN, + tracesSampleRate: 1, + + integrations: [ + Sentry.browserTracingIntegration({ + useEffect, + useLocation, + useMatches, + }), + // https://github.com/import-js/eslint-plugin-import/issues/2969#issuecomment-1967510143 + // eslint-disable-next-line import/namespace + Sentry.replayIntegration({ + maskAllText: true, + blockAllMedia: true, + }), + ], + + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1, + environment: import.meta.env.SHARED_APP_MODE, +}); + +startTransition(() => { + hydrateRoot( + document, + + + , + ); +}); diff --git a/app/entry.server.tsx b/app/entry.server.tsx new file mode 100644 index 0000000..fc15130 --- /dev/null +++ b/app/entry.server.tsx @@ -0,0 +1,88 @@ +import type { + AppLoadContext, + EntryContext, + HandleDataRequestFunction, +} from '@remix-run/cloudflare'; +import { RemixServer } from '@remix-run/react'; +import * as Sentry from '@sentry/remix'; +import * as isbotModule from 'isbot'; +import { renderToReadableStream } from 'react-dom/server'; + +Sentry.init({ + dsn: import.meta.env.SHARED_SENTRY_DSN, + tracesSampleRate: 1, + autoInstrumentRemix: true, + environment: import.meta.env.SHARED_APP_MODE, +}); + +export const handleError = Sentry.sentryHandleError; + +export default async function handleRequest( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext, + loadContext: AppLoadContext, +) { + const body = await renderToReadableStream( + , + { + signal: request.signal, + onError(error: unknown) { + // Log streaming rendering errors from inside the shell + console.error(error); + responseStatusCode = 500; + }, + }, + ); + + if (isBotRequest(request.headers.get('user-agent'))) { + await body.allReady; + } + + responseHeaders.set('Content-Type', 'text/html'); + + const cookieHeader = await loadContext.authSessionService.commitSession(); + if (cookieHeader) { + responseHeaders.append('Set-Cookie', cookieHeader); + } + + const response = new Response(body, { + headers: responseHeaders, + status: responseStatusCode, + }); + + return response; +} + +export const handleDataRequest: HandleDataRequestFunction = async ( + response, + { context }, +) => { + const cookieHeader = await context.authSessionService.commitSession(); + if (cookieHeader) { + response.headers.append('Set-Cookie', cookieHeader); + } + return response; +}; + +// We have some Remix apps in the wild already running with isbot@3 so we need +// to maintain backwards compatibility even though we want new apps to use +// isbot@4. That way, we can ship this as a minor Semver update to @remix-run/dev. +function isBotRequest(userAgent: string | null) { + if (!userAgent) { + return false; + } + + // isbot >= 3.8.0, >4 + if ('isbot' in isbotModule && typeof isbotModule.isbot === 'function') { + return isbotModule.isbot(userAgent); + } + + // isbot < 3.8.0 + if ('default' in isbotModule && typeof isbotModule.default === 'function') { + return isbotModule.default(userAgent); + } + + return false; +} diff --git a/app/hooks/useAuth.ts b/app/hooks/useAuth.ts new file mode 100644 index 0000000..76d5aaa --- /dev/null +++ b/app/hooks/useAuth.ts @@ -0,0 +1,10 @@ +import { useContext } from 'react'; +import AuthContext from '@/contexts/AuthContext'; + +const useAuth = () => { + const authStore = useContext(AuthContext); + + return authStore; +}; + +export default useAuth; diff --git a/app/hooks/useEnv.tsx b/app/hooks/useEnv.tsx deleted file mode 100644 index 07b1c39..0000000 --- a/app/hooks/useEnv.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { useContext } from 'react'; -import { EnvContext } from '@/contexts/EnvContext'; -import { type ClientEnv, clientEnvSchema } from '@server'; - -/** - * 클라이언트용 환경 변수를 얻는 hook - * @example - * ``` - * const env = useEnv(); - * console.log(env.KAKAO_CLIENT_ID); - * ``` - */ -const useEnv = (): ClientEnv => { - const envFromContext = useContext(EnvContext); - - const env = clientEnvSchema.parse(envFromContext); - - return env; -}; - -export default useEnv; diff --git a/app/hooks/useTypedFetcher.ts b/app/hooks/useTypedFetcher.ts index 416e822..c07d113 100644 --- a/app/hooks/useTypedFetcher.ts +++ b/app/hooks/useTypedFetcher.ts @@ -1,5 +1,4 @@ import { type TypedResponse } from '@remix-run/cloudflare'; -// `useTypedFetcher`를 사용하라는 규칙인데 이 파일이 바로 그 구현체이므로 무시 // eslint-disable-next-line no-restricted-imports import { useFetcher } from '@remix-run/react'; import { useEffect } from 'react'; diff --git a/app/models/api.ts b/app/models/api.ts index afc6063..b159b42 100644 --- a/app/models/api.ts +++ b/app/models/api.ts @@ -148,10 +148,10 @@ export class Api { options?: ApiOptions, ): Promise> { try { - const baseUrl = this.baseUrl ?? context.API_URL; + const baseUrl: string = this.baseUrl ?? import.meta.env.SERVER_API_URL; const token = context.authSession - ? await context.authSessionService.getAuthToken(context) + ? await context.authSessionService.getAuthToken() : null; const fetchInfo = this.getFetchInfo(variables, token?.accessToken); diff --git a/app/root.tsx b/app/root.tsx index cf55a44..0c72d6a 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -8,26 +8,35 @@ import { ScrollRestoration, useFetchers, useLoaderData, - useRouteError, } from '@remix-run/react'; -import { useEffect, useRef } from 'react'; -import useErrorToast from './hooks/useErrorToast'; +import { withSentry } from '@sentry/remix'; +import { useEffect, useMemo, useRef } from 'react'; import * as styles from './root.css'; -import { EnvContext } from '@/contexts/EnvContext'; +import AuthContext, { type AuthStore } from '@/contexts/AuthContext'; +import useErrorToast from '@/hooks/useErrorToast'; import '@/styles/theme.css'; -export const loader = async (args: LoaderFunctionArgs) => - json({ - env: args.context.clientEnv, - }); +export const loader = async ({ context }: LoaderFunctionArgs) => { + const authToken = await context.authSessionService.getAuthToken(); + const isLoggedIn = authToken !== null; + return json({ isLoggedIn }); +}; const App = () => { - const data = useLoaderData(); + const loaderData = useLoaderData(); + const fetchers = useFetchers(); const { error, clearError } = useErrorToast(); const errorToastRemovalTimeoutIdRef = useRef(null); + const authStoreValue = useMemo( + () => ({ + isLoggedIn: loaderData.isLoggedIn, + }), + [loaderData.isLoggedIn], + ); + useEffect(() => { if (error) { if (errorToastRemovalTimeoutIdRef.current) { @@ -52,7 +61,7 @@ const App = () => { - + {fetchers.length > 0 && (
@@ -69,7 +78,7 @@ const App = () => {
)} -
+ @@ -77,11 +86,4 @@ const App = () => { ); }; -export const ErrorBoundary = () => { - const error = useRouteError(); - console.log('ErrorBoundary', error); - - return

Error

; -}; - -export default App; +export default withSentry(App); diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index d8ff1e0..e538c92 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -1,5 +1,6 @@ import type { MetaFunction } from '@remix-run/cloudflare'; import KakaoLoginButton from '@/components/KakaoLoginButton'; +import useAuth from '@/hooks/useAuth'; // import Test from '@/components/Test'; export const meta: MetaFunction = () => [ @@ -11,12 +12,17 @@ export const meta: MetaFunction = () => [ }, ]; -const Index = () => ( -
-

Ort

- {/* */} - -
-); +const Index = () => { + const { isLoggedIn } = useAuth(); + + return ( +
+

Ort

+ isLoggedIn: {isLoggedIn ? 'true' : 'false'} + {/* */} + +
+ ); +}; export default Index; diff --git a/app/routes/oauth.kakao.tsx b/app/routes/oauth.kakao.tsx index f3f4e13..b8b7faa 100644 --- a/app/routes/oauth.kakao.tsx +++ b/app/routes/oauth.kakao.tsx @@ -1,12 +1,12 @@ -export const loader = async () => null; +import { type LoaderFunctionArgs } from '@remix-run/cloudflare'; +import { redirectWithAuthCookie } from '@/utils/server'; -const KakaoRedirect = () => ( -
- {/*

{fetcher.state}

- - - */} -
-); +export const loader = async ({ request, context }: LoaderFunctionArgs) => { + const url = new URL(request.url); + const { origin } = url; -export default KakaoRedirect; + return redirectWithAuthCookie( + `${import.meta.env.SERVER_API_URL}/oauth2/authorization/kakao?redirect_to=${origin}/oauth`, + context.authSessionService, + ); +}; diff --git a/app/routes/oauth.tsx b/app/routes/oauth.tsx new file mode 100644 index 0000000..d8d1116 --- /dev/null +++ b/app/routes/oauth.tsx @@ -0,0 +1,24 @@ +import { type LoaderFunctionArgs } from '@remix-run/cloudflare'; +import { api_loginWithOauth } from '@/apis/auth'; +import { redirectWithAuthCookie } from '@/utils/server'; + +export const loader = async ({ request, context }: LoaderFunctionArgs) => { + const url = new URL(request.url); + const oauthKey = url.searchParams.get('oauthKey'); + if (!oauthKey) { + throw new Error('No oauthKey provided'); + } + + const { result } = await api_loginWithOauth.fetch({ oauthKey }, context, { + throwOnError: true, + }); + + await context.authSessionService.updateAuthToken({ + accessToken: result.accessToken, + accessTokenExpiresAt: result.accessTokenExpiresAt, + refreshToken: result.refreshToken, + refreshTokenExpiresAt: result.refreshTokenExpiresAt, + }); + + return redirectWithAuthCookie('/', context.authSessionService); +}; diff --git a/app/utils/server.ts b/app/utils/server.ts new file mode 100644 index 0000000..12a49c9 --- /dev/null +++ b/app/utils/server.ts @@ -0,0 +1,27 @@ +// eslint-disable-next-line no-restricted-imports +import { redirect as remixRedirect } from '@remix-run/cloudflare'; +import { type AuthSessionService } from '@server'; + +/** + * `@remix-run/cloudflare`의 `redirect` 재구현체 + * - 필요한 경우 `Set-Cookie` header를 주입해줌 + * >- redirect 응답 시 `entry.server.tsx`의 `handleRequest`, `handleDataRequest`를 통하지 않기 때문 ([관련 이슈](https://github.com/remix-run/remix/issues/2997)) + */ +export const redirectWithAuthCookie = async ( + url: string, + authSessionService: AuthSessionService, + init?: ResponseInit, +) => { + const authCookieHeader = await authSessionService.commitSession(); + if (authCookieHeader) { + return remixRedirect(url, { + status: 302, + ...init, + headers: { + 'Set-Cookie': authCookieHeader, + ...init?.headers, + }, + }); + } + return remixRedirect(url, init); +}; diff --git a/app/vite-env.d.ts b/app/vite-env.d.ts new file mode 100644 index 0000000..5f6c524 --- /dev/null +++ b/app/vite-env.d.ts @@ -0,0 +1,9 @@ +/// + +type ClientEnv = import('../server/types/env').Env; + +interface ImportMetaEnv extends ClientEnv {} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/functions/[[path]].ts b/functions/[[path]].ts index f76f89f..57cb5a1 100644 --- a/functions/[[path]].ts +++ b/functions/[[path]].ts @@ -1,11 +1,5 @@ import { createPagesFunctionHandler } from '@remix-run/cloudflare-pages'; -import { - clientEnvSchema, - type ContextEnv, - serverEnvSchema, - getLoadContext, - makeAuthSessionService, -} from '@server'; +import { type ContextEnv, getLoadContext } from '@server'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - the server build file is generated by `remix vite:build` @@ -16,28 +10,16 @@ export const onRequest = async ( // eslint-disable-next-line @typescript-eslint/no-explicit-any context: EventContext, ): Promise => { - clientEnvSchema.parse(context.env); - serverEnvSchema.parse(context.env); - - const authSessionService = await makeAuthSessionService( - { - authCookieSessionSecret: context.env.AUTH_COOKIE_SESSION_SECRET, - kvNamespace: context.env.KV_NAMESPACE, - }, - context.request.headers.get('Cookie'), - ); - const handleRequest = createPagesFunctionHandler({ build, - getLoadContext: (args) => getLoadContext(authSessionService, args), + getLoadContext: (args) => + getLoadContext(args, { + authCookieSessionSecret: import.meta.env + .SERVER_AUTH_COOKIE_SESSION_SECRET, + }), }); const response = await handleRequest(context); - response.headers.append( - 'Set-Cookie', - await authSessionService.commitSession(), - ); - return response; }; diff --git a/package.json b/package.json index aeff5d6..2c31ea7 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "@remix-run/cloudflare-pages": "2.11.2", "@remix-run/react": "2.11.2", "@remix-run/serve": "2.11.2", + "@sentry/remix": "8.30.0", + "@sentry/vite-plugin": "2.22.4", "@vanilla-extract/css": "1.15.3", "isbot": "4.4.0", "react": "18.3.1", @@ -32,7 +34,6 @@ "devDependencies": { "@commitlint/cli": "19.3.0", "@commitlint/config-conventional": "19.2.2", - "@majority-elite/remix-dev-utils": "0.1.2", "@remix-run/dev": "2.11.2", "@remix-run/testing": "2.11.2", "@storybook/addon-essentials": "8.2.9", @@ -72,5 +73,10 @@ }, "lint-staged": { "*.{js,ts,jsx,tsx}": "eslint --max-warnings=0" + }, + "pnpm": { + "patchedDependencies": { + "vite@5.3.3": "patches/vite@5.3.3.patch" + } } } diff --git a/patches/vite@5.3.3.patch b/patches/vite@5.3.3.patch new file mode 100644 index 0000000..ceed946 --- /dev/null +++ b/patches/vite@5.3.3.patch @@ -0,0 +1,12 @@ +diff --git a/types/importMeta.d.ts b/types/importMeta.d.ts +index bd4418379951b36d96cdaa98d7e2dd4973c56989..337013f37546d7f6857e176984ebdabfc1e65925 100644 +--- a/types/importMeta.d.ts ++++ b/types/importMeta.d.ts +@@ -3,7 +3,6 @@ + // + + interface ImportMetaEnv { +- [key: string]: any + BASE_URL: string + MODE: string + DEV: boolean diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df969d7..9efb6e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + vite@5.3.3: + hash: ng7gibuvnft5mzxgmesrpubqd4 + path: patches/vite@5.3.3.patch + importers: .: @@ -23,6 +28,12 @@ importers: '@remix-run/serve': specifier: 2.11.2 version: 2.11.2(typescript@5.5.3) + '@sentry/remix': + specifier: 8.30.0 + version: 8.30.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)(@remix-run/node@2.11.2(typescript@5.5.3))(@remix-run/react@2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(react@18.3.1) + '@sentry/vite-plugin': + specifier: 2.22.4 + version: 2.22.4 '@vanilla-extract/css': specifier: 1.15.3 version: 1.15.3 @@ -51,18 +62,15 @@ importers: '@commitlint/config-conventional': specifier: 19.2.2 version: 19.2.2 - '@majority-elite/remix-dev-utils': - specifier: 0.1.2 - version: 0.1.2(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))(wrangler@3.72.2(@cloudflare/workers-types@4.20240903.0)) '@remix-run/dev': specifier: 2.11.2 - version: 2.11.2(@remix-run/react@2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/serve@2.11.2(typescript@5.5.3))(@types/node@22.5.3)(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))(wrangler@3.72.2(@cloudflare/workers-types@4.20240903.0)) + version: 2.11.2(@remix-run/react@2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/serve@2.11.2(typescript@5.5.3))(@types/node@22.5.3)(ts-node@10.9.2(@types/node@22.5.3)(typescript@5.5.3))(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))(wrangler@3.72.2(@cloudflare/workers-types@4.20240903.0)) '@remix-run/testing': specifier: 2.11.2 version: 2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3) '@storybook/addon-essentials': specifier: 8.2.9 - version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3) '@storybook/addon-interactions': specifier: 8.2.9 version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) @@ -77,7 +85,7 @@ importers: version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3) '@storybook/react-vite': specifier: 8.2.9 - version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3)) + version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))(webpack-sources@3.2.3) '@storybook/test': specifier: 8.2.9 version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) @@ -101,7 +109,7 @@ importers: version: 7.16.0(eslint@8.57.0)(typescript@5.5.3) '@vanilla-extract/vite-plugin': specifier: 4.0.13 - version: 4.0.13(@types/node@22.5.3)(vite@5.3.3(@types/node@22.5.3)) + version: 4.0.13(@types/node@22.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3)) autoprefixer: specifier: 10.4.19 version: 10.4.19(postcss@8.4.45) @@ -146,10 +154,10 @@ importers: version: 5.5.3 vite: specifier: 5.3.3 - version: 5.3.3(@types/node@22.5.3) + version: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) vite-tsconfig-paths: specifier: 4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3)) + version: 4.3.2(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3)) wrangler: specifier: 3.72.2 version: 3.72.2(@cloudflare/workers-types@4.20240903.0) @@ -1553,21 +1561,6 @@ packages: '@lottiefiles/dotlottie-web@0.33.0': resolution: {integrity: sha512-/KerIs0UkmwuDKYWlNGWYSSZkZaLNXXHqg6qCnP7P2JuzgI4bHRmlIk3+LoJjl/jWqd3WyI4t5oRV6ch0sQwvg==} - '@majority-elite/remix-dev-utils@0.1.2': - resolution: {integrity: sha512-+nuPSvR4jboUs70YiNMHje2kS+wszQl0lt2bR7lGCDlzFidxuMNuMKAJgBU1lf8Seq7eFUCVpB+YltHPA5ULDQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - typescript: ^5.1.0 - vite: ^5.1.0 - wrangler: ^3.28.2 - peerDependenciesMeta: - typescript: - optional: true - vite: - optional: true - wrangler: - optional: true - '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -1605,6 +1598,194 @@ packages: resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@opentelemetry/api-logs@0.52.1': + resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} + engines: {node: '>=14'} + + '@opentelemetry/api-logs@0.53.0': + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@1.26.0': + resolution: {integrity: sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.26.0': + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-connect@0.39.0': + resolution: {integrity: sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.42.0': + resolution: {integrity: sha512-YNcy7ZfGnLsVEqGXQPT+S0G1AE46N21ORY7i7yUQyfhGAL4RBjnZUqefMI0NwqIl6nGbr1IpF0rZGoN8Q7x12Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.39.0': + resolution: {integrity: sha512-SS9uSlKcsWZabhBp2szErkeuuBDgxOUlllwkS92dVaWRnMmwysPhcEgHKB8rUe3BHg/GnZC1eo1hbTZv4YhfoA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.15.0': + resolution: {integrity: sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.39.0': + resolution: {integrity: sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.43.0': + resolution: {integrity: sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.41.0': + resolution: {integrity: sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.53.0': + resolution: {integrity: sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.43.0': + resolution: {integrity: sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.3.0': + resolution: {integrity: sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.43.0': + resolution: {integrity: sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.47.0': + resolution: {integrity: sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.42.0': + resolution: {integrity: sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.41.0': + resolution: {integrity: sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.41.0': + resolution: {integrity: sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.40.0': + resolution: {integrity: sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.44.0': + resolution: {integrity: sha512-oTWVyzKqXud1BYEGX1loo2o4k4vaU1elr3vPO8NZolrBtFvQ34nx4HgUaexUDuEog00qQt+MLR5gws/p+JXMLQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis-4@0.42.0': + resolution: {integrity: sha512-NaD+t2JNcOzX/Qa7kMy68JbmoVIV37fT/fJYzLKu2Wwd+0NCxt+K2OOsOakA8GVg8lSpFdbx4V/suzZZ2Pvdjg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.6.0': + resolution: {integrity: sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation@0.43.0': + resolution: {integrity: sha512-S1uHE+sxaepgp+t8lvIDuRgyjJWisAb733198kwQTUc9ZtYQ2V2gmyCtR1x21ePGVLoMiX/NWY7WA290hwkjJQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.52.1': + resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.53.0': + resolution: {integrity: sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resources@1.26.0': + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.26.0': + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.26.0': + resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1613,6 +1794,9 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@prisma/instrumentation@5.19.1': + resolution: {integrity: sha512-VLnzMQq7CWroL5AeaW0Py2huiNKeoMfCH3SUxstdzPrlWQi6UQ9UrfcbUkNHlVFqOMacqy8X/8YtE0kuKDpD9w==} + '@remix-run/cloudflare-pages@2.11.2': resolution: {integrity: sha512-Sa/LED9qPJfpk6IgJvXiUIzjCRC2B6dyfOH286YttoKOGmEiMaXYt4KTEssyiT8LY7nR3IPsprA8kohjpRujhg==} engines: {node: '>=18.0.0'} @@ -1816,6 +2000,125 @@ packages: cpu: [x64] os: [win32] + '@sentry-internal/browser-utils@8.30.0': + resolution: {integrity: sha512-pwX+awNWaxSOAsBLVLqc1+Hw+Fm1Nci9mbKFA6Ed5YzCG049PnBVQwugpmx2dcyyCqJpORhcIqb9jHdCkYmCiA==} + engines: {node: '>=14.18'} + + '@sentry-internal/feedback@8.30.0': + resolution: {integrity: sha512-ParFRxQY6helxkwUDmro77Wc5uSIC6rZos88jYMrYwFmoTJaNWf4lDzPyECfdSiSYyzSMZk4dorSUN85Ul7DCg==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay-canvas@8.30.0': + resolution: {integrity: sha512-y/QqcvchhtMlVA6eOZicIfTxtZarazQZJuFW0018ynPxBTiuuWSxMCLqduulXUYsFejfD8/eKHb3BpCIFdDYjg==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay@8.30.0': + resolution: {integrity: sha512-/KFre+BrovPCiovgAu5N1ErJtkDVzkJA5hV3Jw011AlxRWxrmPwu6+9sV9/rn3tqYAGyq6IggYqeIOHhLh1Ihg==} + engines: {node: '>=14.18'} + + '@sentry/babel-plugin-component-annotate@2.22.4': + resolution: {integrity: sha512-hbSq067KwmeKIEkmyzkTNJbmbtx2KRqvpiy9Q/DynI5Z46Nko/ppvgIfyFXK9DelwvEPOqZic4WXTIhO4iv3DA==} + engines: {node: '>= 14'} + + '@sentry/browser@8.30.0': + resolution: {integrity: sha512-M+tKqawH9S3CqlAIcqdZcHbcsNQkEa9MrPqPCYvXco3C4LRpNizJP2XwBiGQY2yK+fOSvbaWpPtlI938/wuRZQ==} + engines: {node: '>=14.18'} + + '@sentry/bundler-plugin-core@2.22.4': + resolution: {integrity: sha512-25NiyV3v6mdqOXlpzbbJnq0FHdAu1uTEDr+DU8CzNLjIXlq2Sr2CFZ/mhRcR6daM8OAretJdQ34lu0yHUVeE4Q==} + engines: {node: '>= 14'} + + '@sentry/cli-darwin@2.36.1': + resolution: {integrity: sha512-JOHQjVD8Kqxm1jUKioAP5ohLOITf+Dh6+DBz4gQjCNdotsvNW5m63TKROwq2oB811p+Jzv5304ujmN4cAqW1Ww==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.36.1': + resolution: {integrity: sha512-R//3ZEkbzvoStr3IA7nxBZNiBYyxOljOqAhgiTnejXHmnuwDzM3TBA2n5vKPE/kBFxboEBEw0UTzTIRb1T0bgw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + + '@sentry/cli-linux-arm@2.36.1': + resolution: {integrity: sha512-gvEOKN0fWL2AVqUBKHNXPRZfJNvKTs8kQhS8cQqahZGgZHiPCI4BqW45cKMq+ZTt1UUbLmt6khx5Dz7wi+0i5A==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + + '@sentry/cli-linux-i686@2.36.1': + resolution: {integrity: sha512-R7sW5Vk/HacVy2YgQoQB+PwccvFYf2CZVPSFSFm2z7MEfNe77UYHWUq+sjJ4vxWG6HDWGVmaX0fjxyDkE01JRA==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + + '@sentry/cli-linux-x64@2.36.1': + resolution: {integrity: sha512-UMr3ik8ksA7zQfbzsfwCb+ztenLnaeAbX94Gp+bzANZwPfi/vVHf2bLyqsBs4OyVt9SPlN1bbM/RTGfMjZ3JOw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + + '@sentry/cli-win32-i686@2.36.1': + resolution: {integrity: sha512-CflvhnvxPEs5GWQuuDtYSLqPrBaPbcSJFlBuUIb+8WNzRxvVfjgw1qzfZmkQqABqiy/YEsEekllOoMFZAvCcVA==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.36.1': + resolution: {integrity: sha512-wWqht2xghcK3TGnooHZSzA3WSjdtno/xFjZLvWmw38rblGwgKMxLZnlxV6uDyS+OJ6CbfDTlCRay/0TIqA0N8g==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.36.1': + resolution: {integrity: sha512-gzK5uQKDWKhyH5udoB5+oaUNrS//urWyaXgKvHKz4gFfl744HuKY9dpLPP2nMnf0zLGmGM6xJnMXLqILq0mtxw==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/core@8.30.0': + resolution: {integrity: sha512-CJ/FuWLw0QEKGKXGL/nm9eaOdajEcmPekLuHAuOCxID7N07R9l9laz3vFbAkUZ97GGDv3sYrJZgywfY3Moropg==} + engines: {node: '>=14.18'} + + '@sentry/node@8.30.0': + resolution: {integrity: sha512-Tog0Ag7sU3lNj4cPUZy1KRJXyYXZlWiwlk34KYNNxAk0vDiK6W0bF8mvS+aaUukgb7FO5A0eu9l+VApdBJOr3Q==} + engines: {node: '>=14.18'} + + '@sentry/opentelemetry@8.30.0': + resolution: {integrity: sha512-6mCIP2zvxAiEsNEoF8kv+UUD4XGWSKJU6RY5BF1U26HLitXv1fNPtzaTR96Ehv9h0zktjLfqfpVUZ7DGkdBvLA==} + engines: {node: '>=14.18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.25.1 + '@opentelemetry/instrumentation': ^0.53.0 + '@opentelemetry/sdk-trace-base': ^1.26.0 + '@opentelemetry/semantic-conventions': ^1.27.0 + + '@sentry/react@8.30.0': + resolution: {integrity: sha512-ktQjXs87jdsxW0YrHci3sb6zcSzhMECWnrTVU/KGZF8UoDsk4P4xRCknijd2SSmDIjSkwzUAANR43UkCi4BTQg==} + engines: {node: '>=14.18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/remix@8.30.0': + resolution: {integrity: sha512-q6pwPxoMOkekKXmVaxVppn5lUAwE4cCXGALdmfeixgUl4xCFbQ0nu5T8bltvn6E9LQxbqSXNx80c/aqpwC59Ow==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + '@remix-run/node': 1.x || 2.x + '@remix-run/react': 1.x || 2.x + react: 16.x || 17.x || 18.x + + '@sentry/types@8.30.0': + resolution: {integrity: sha512-kgWW2BCjBmVlSQRG32GonHEVyeDbys74xf9mLPvynwHTgw3+NUlNAlEdu05xnb2ow4bCTHfbkS5G1zRgyv5k4Q==} + engines: {node: '>=14.18'} + + '@sentry/utils@8.30.0': + resolution: {integrity: sha512-wZxU2HWlzsnu8214Xy7S7cRIuD6h8Z5DnnkojJfX0i0NLooepZQk2824el1Q13AakLb7/S8CHSHXOMnCtoSduw==} + engines: {node: '>=14.18'} + + '@sentry/vite-plugin@2.22.4': + resolution: {integrity: sha512-C51PUlTv0BXN3+e9SjPHptNX3b9E0clrsaR5c//l/sFkQjuteDHKChA1gNzZSvfoa3gm9NzZAgpk3hVF2O3nBA==} + engines: {node: '>= 14'} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -2031,6 +2334,18 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@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/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -2052,6 +2367,9 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -2133,6 +2451,9 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/mysql@2.15.26': + resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} @@ -2142,6 +2463,12 @@ packages: '@types/node@22.5.3': resolution: {integrity: sha512-njripolh85IA9SQGTAqbmnNZTdxv7X/4OYGPz8tgy5JDr8MP+uDBa921GpYEoDDnwm0Hmn5ZPeJgiiSTPoOzkQ==} + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -2169,6 +2496,9 @@ packages: '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -2327,6 +2657,16 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2350,6 +2690,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -2392,6 +2736,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -2640,6 +2987,9 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -2785,6 +3135,9 @@ packages: typescript: optional: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2925,6 +3278,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -3499,6 +3856,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -3584,6 +3945,9 @@ packages: hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hosted-git-info@6.1.1: resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3596,6 +3960,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3630,6 +3998,12 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-in-the-middle@1.11.0: + resolution: {integrity: sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==} + + import-in-the-middle@1.4.2: + resolution: {integrity: sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==} + import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -4101,6 +4475,10 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -4109,6 +4487,9 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} @@ -4325,6 +4706,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -4348,6 +4733,10 @@ packages: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} @@ -4374,6 +4763,9 @@ packages: modern-ahocorasick@1.0.1: resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + morgan@1.10.0: resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} engines: {node: '>= 0.8.0'} @@ -4421,6 +4813,15 @@ packages: node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -4539,6 +4940,11 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + opentelemetry-instrumentation-remix@0.7.1: + resolution: {integrity: sha512-zzJ8CAsf4Pem+B1zY0NEKQcQjXIORgylPBIQMO2x1OdRc9HzBPLUp7JIlGt/RAfPsp5qaEs7QqvX9xtsrZgtFQ==} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4668,6 +5074,17 @@ packages: periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} @@ -4765,6 +5182,22 @@ packages: resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + 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'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4809,6 +5242,10 @@ packages: 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-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -4835,6 +5272,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} @@ -5000,6 +5440,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@7.4.0: + resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} + engines: {node: '>=8.6.0'} + require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} @@ -5152,6 +5596,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -5411,6 +5858,9 @@ packages: toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -5427,6 +5877,20 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + 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 + tsconfck@3.1.3: resolution: {integrity: sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==} engines: {node: ^18 || >=20} @@ -5603,6 +6067,9 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + unplugin@1.13.1: resolution: {integrity: sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==} engines: {node: '>=14.0.0'} @@ -5649,6 +6116,9 @@ packages: engines: {node: '>=8'} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -5720,9 +6190,22 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -5844,6 +6327,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + 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'} @@ -7189,13 +7676,13 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 react-docgen-typescript: 2.2.2(typescript@5.5.3) - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) optionalDependencies: typescript: 5.5.3 @@ -7231,16 +7718,6 @@ snapshots: '@lottiefiles/dotlottie-web@0.33.0': {} - '@majority-elite/remix-dev-utils@0.1.2(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))(wrangler@3.72.2(@cloudflare/workers-types@4.20240903.0))': - dependencies: - '@remix-run/node': 2.11.2(typescript@5.5.3) - '@remix-run/server-runtime': 2.11.2(typescript@5.5.3) - set-cookie-parser: 2.7.0 - optionalDependencies: - typescript: 5.5.3 - vite: 5.3.3(@types/node@22.5.3) - wrangler: 3.72.2(@cloudflare/workers-types@4.20240903.0) - '@mdx-js/mdx@2.3.0': dependencies: '@types/estree-jsx': 1.0.5 @@ -7314,27 +7791,284 @@ snapshots: dependencies: which: 3.0.1 - '@pkgjs/parseargs@0.11.0': - optional: true + '@opentelemetry/api-logs@0.52.1': + dependencies: + '@opentelemetry/api': 1.9.0 - '@pkgr/core@0.1.1': {} + '@opentelemetry/api-logs@0.53.0': + dependencies: + '@opentelemetry/api': 1.9.0 - '@remix-run/cloudflare-pages@2.11.2(@cloudflare/workers-types@4.20240903.0)(typescript@5.5.3)': + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.26.0(@opentelemetry/api@1.9.0)': dependencies: - '@cloudflare/workers-types': 4.20240903.0 - '@remix-run/cloudflare': 2.11.2(@cloudflare/workers-types@4.20240903.0)(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 + '@opentelemetry/api': 1.9.0 - '@remix-run/cloudflare@2.11.2(@cloudflare/workers-types@4.20240903.0)(typescript@5.5.3)': + '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': dependencies: - '@cloudflare/kv-asset-handler': 0.1.3 - '@cloudflare/workers-types': 4.20240903.0 - '@remix-run/server-runtime': 2.11.2(typescript@5.5.3) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/instrumentation-connect@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@types/connect': 3.4.36 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.15.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.3.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@types/mysql': 2.15.26 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.44.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis-4@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.6.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.4.2 + require-in-the-middle: 7.4.0 + semver: 7.6.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.11.0 + require-in-the-middle: 7.4.0 + semver: 7.6.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.11.0 + require-in-the-middle: 7.4.0 + semver: 7.6.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/redis-common@0.36.2': {} + + '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@prisma/instrumentation@5.19.1': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@remix-run/cloudflare-pages@2.11.2(@cloudflare/workers-types@4.20240903.0)(typescript@5.5.3)': + dependencies: + '@cloudflare/workers-types': 4.20240903.0 + '@remix-run/cloudflare': 2.11.2(@cloudflare/workers-types@4.20240903.0)(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + + '@remix-run/cloudflare@2.11.2(@cloudflare/workers-types@4.20240903.0)(typescript@5.5.3)': + dependencies: + '@cloudflare/kv-asset-handler': 0.1.3 + '@cloudflare/workers-types': 4.20240903.0 + '@remix-run/server-runtime': 2.11.2(typescript@5.5.3) optionalDependencies: typescript: 5.5.3 - '@remix-run/dev@2.11.2(@remix-run/react@2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/serve@2.11.2(typescript@5.5.3))(@types/node@22.5.3)(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))(wrangler@3.72.2(@cloudflare/workers-types@4.20240903.0))': + '@remix-run/dev@2.11.2(@remix-run/react@2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/serve@2.11.2(typescript@5.5.3))(@types/node@22.5.3)(ts-node@10.9.2(@types/node@22.5.3)(typescript@5.5.3))(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))(wrangler@3.72.2(@cloudflare/workers-types@4.20240903.0))': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -7378,7 +8112,7 @@ snapshots: pidtree: 0.6.0 postcss: 8.4.45 postcss-discard-duplicates: 5.1.0(postcss@8.4.45) - postcss-load-config: 4.0.2(postcss@8.4.45) + postcss-load-config: 4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@22.5.3)(typescript@5.5.3)) postcss-modules: 6.0.0(postcss@8.4.45) prettier: 2.8.8 pretty-ms: 7.0.1 @@ -7393,7 +8127,7 @@ snapshots: optionalDependencies: '@remix-run/serve': 2.11.2(typescript@5.5.3) typescript: 5.5.3 - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) wrangler: 3.72.2(@cloudflare/workers-types@4.20240903.0) transitivePeerDependencies: - '@types/node' @@ -7565,6 +8299,200 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true + '@sentry-internal/browser-utils@8.30.0': + dependencies: + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry-internal/feedback@8.30.0': + dependencies: + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry-internal/replay-canvas@8.30.0': + dependencies: + '@sentry-internal/replay': 8.30.0 + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry-internal/replay@8.30.0': + dependencies: + '@sentry-internal/browser-utils': 8.30.0 + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry/babel-plugin-component-annotate@2.22.4': {} + + '@sentry/browser@8.30.0': + dependencies: + '@sentry-internal/browser-utils': 8.30.0 + '@sentry-internal/feedback': 8.30.0 + '@sentry-internal/replay': 8.30.0 + '@sentry-internal/replay-canvas': 8.30.0 + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry/bundler-plugin-core@2.22.4': + dependencies: + '@babel/core': 7.25.2 + '@sentry/babel-plugin-component-annotate': 2.22.4 + '@sentry/cli': 2.36.1 + dotenv: 16.4.5 + find-up: 5.0.0 + glob: 9.3.5 + magic-string: 0.30.8 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.36.1': + optional: true + + '@sentry/cli-linux-arm64@2.36.1': + optional: true + + '@sentry/cli-linux-arm@2.36.1': + optional: true + + '@sentry/cli-linux-i686@2.36.1': + optional: true + + '@sentry/cli-linux-x64@2.36.1': + optional: true + + '@sentry/cli-win32-i686@2.36.1': + optional: true + + '@sentry/cli-win32-x64@2.36.1': + optional: true + + '@sentry/cli@2.36.1': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.36.1 + '@sentry/cli-linux-arm': 2.36.1 + '@sentry/cli-linux-arm64': 2.36.1 + '@sentry/cli-linux-i686': 2.36.1 + '@sentry/cli-linux-x64': 2.36.1 + '@sentry/cli-win32-i686': 2.36.1 + '@sentry/cli-win32-x64': 2.36.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/core@8.30.0': + dependencies: + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry/node@8.30.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.15.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.44.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@prisma/instrumentation': 5.19.1 + '@sentry/core': 8.30.0 + '@sentry/opentelemetry': 8.30.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + import-in-the-middle: 1.11.0 + transitivePeerDependencies: + - supports-color + + '@sentry/opentelemetry@8.30.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + + '@sentry/react@8.30.0(react@18.3.1)': + dependencies: + '@sentry/browser': 8.30.0 + '@sentry/core': 8.30.0 + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + + '@sentry/remix@8.30.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)(@remix-run/node@2.11.2(typescript@5.5.3))(@remix-run/react@2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(react@18.3.1)': + dependencies: + '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) + '@remix-run/node': 2.11.2(typescript@5.5.3) + '@remix-run/react': 2.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3) + '@remix-run/router': 1.19.1 + '@sentry/cli': 2.36.1 + '@sentry/core': 8.30.0 + '@sentry/node': 8.30.0 + '@sentry/opentelemetry': 8.30.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) + '@sentry/react': 8.30.0(react@18.3.1) + '@sentry/types': 8.30.0 + '@sentry/utils': 8.30.0 + glob: 10.4.5 + opentelemetry-instrumentation-remix: 0.7.1(@opentelemetry/api@1.9.0) + react: 18.3.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/core' + - '@opentelemetry/instrumentation' + - '@opentelemetry/sdk-trace-base' + - '@opentelemetry/semantic-conventions' + - encoding + - supports-color + + '@sentry/types@8.30.0': {} + + '@sentry/utils@8.30.0': + dependencies: + '@sentry/types': 8.30.0 + + '@sentry/vite-plugin@2.22.4': + dependencies: + '@sentry/bundler-plugin-core': 2.22.4 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + '@sinclair/typebox@0.27.8': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -7592,12 +8520,12 @@ snapshots: storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) ts-dedent: 2.2.0 - '@storybook/addon-docs@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))': + '@storybook/addon-docs@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3)': dependencies: '@babel/core': 7.25.2 '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) '@storybook/blocks': 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) - '@storybook/csf-plugin': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + '@storybook/csf-plugin': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3) '@storybook/global': 5.0.0 '@storybook/react-dom-shim': 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@types/react': 18.3.3 @@ -7612,12 +8540,12 @@ snapshots: - supports-color - webpack-sources - '@storybook/addon-essentials@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))': + '@storybook/addon-essentials@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3)': dependencies: '@storybook/addon-actions': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/addon-backgrounds': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/addon-controls': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) - '@storybook/addon-docs': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + '@storybook/addon-docs': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3) '@storybook/addon-highlight': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/addon-measure': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/addon-outline': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) @@ -7700,9 +8628,9 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))': + '@storybook/builder-vite@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))(webpack-sources@3.2.3)': dependencies: - '@storybook/csf-plugin': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + '@storybook/csf-plugin': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3) '@types/find-cache-dir': 3.2.1 browser-assert: 1.2.1 es-module-lexer: 1.5.4 @@ -7712,7 +8640,7 @@ snapshots: magic-string: 0.30.11 storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) ts-dedent: 2.2.0 - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: @@ -7761,10 +8689,10 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))': + '@storybook/csf-plugin@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(webpack-sources@3.2.3)': dependencies: storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) - unplugin: 1.13.1 + unplugin: 1.13.1(webpack-sources@3.2.3) transitivePeerDependencies: - webpack-sources @@ -7804,11 +8732,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) - '@storybook/react-vite@8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3))': + '@storybook/react-vite@8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.21.2)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))(webpack-sources@3.2.3)': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3)) '@rollup/pluginutils': 5.1.0(rollup@4.21.2) - '@storybook/builder-vite': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3)) + '@storybook/builder-vite': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))(webpack-sources@3.2.3) '@storybook/react': 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.5.3) find-up: 5.0.0 magic-string: 0.30.11 @@ -7818,7 +8746,7 @@ snapshots: resolve: 1.22.8 storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) tsconfig-paths: 4.2.0 - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) transitivePeerDependencies: - '@preact/preset-vite' - rollup @@ -7904,6 +8832,18 @@ snapshots: dependencies: '@testing-library/dom': 10.1.0 + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 @@ -7936,6 +8876,10 @@ snapshots: '@types/connect': 3.4.38 '@types/node': 18.19.49 + '@types/connect@3.4.36': + dependencies: + '@types/node': 22.5.3 + '@types/connect@3.4.38': dependencies: '@types/node': 18.19.49 @@ -8022,6 +8966,10 @@ snapshots: '@types/ms@0.7.34': {} + '@types/mysql@2.15.26': + dependencies: + '@types/node': 22.5.3 + '@types/node-forge@1.3.11': dependencies: '@types/node': 22.5.3 @@ -8034,6 +8982,16 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.6.1 + + '@types/pg@8.6.1': + dependencies: + '@types/node': 22.5.3 + pg-protocol: 1.6.1 + pg-types: 2.2.0 + '@types/prop-types@15.7.12': {} '@types/qs@6.9.15': {} @@ -8064,6 +9022,8 @@ snapshots: '@types/node': 18.19.49 '@types/send': 0.17.4 + '@types/shimmer@1.2.0': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -8248,7 +9208,7 @@ snapshots: lodash: 4.17.21 mlly: 1.7.1 outdent: 0.8.0 - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) vite-node: 1.6.0(@types/node@22.5.3) transitivePeerDependencies: - '@types/node' @@ -8273,7 +9233,7 @@ snapshots: find-up: 5.0.0 javascript-stringify: 2.1.0 mlly: 1.7.1 - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) vite-node: 1.6.0(@types/node@22.5.3) transitivePeerDependencies: - '@types/node' @@ -8288,10 +9248,10 @@ snapshots: '@vanilla-extract/private@1.0.6': {} - '@vanilla-extract/vite-plugin@4.0.13(@types/node@22.5.3)(vite@5.3.3(@types/node@22.5.3))': + '@vanilla-extract/vite-plugin@4.0.13(@types/node@22.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3))': dependencies: '@vanilla-extract/integration': 7.1.9(@types/node@22.5.3) - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -8349,6 +9309,14 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-import-assertions@1.9.0(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-import-attributes@1.9.5(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@7.4.1): dependencies: acorn: 7.4.1 @@ -8367,6 +9335,12 @@ snapshots: acorn@8.12.1: {} + agent-base@6.0.2: + dependencies: + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -8411,6 +9385,9 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: + optional: true + arg@5.0.2: {} argparse@2.0.1: {} @@ -8735,6 +9712,8 @@ snapshots: dependencies: consola: 3.2.3 + cjs-module-lexer@1.4.1: {} + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -8868,6 +9847,9 @@ snapshots: optionalDependencies: typescript: 5.5.3 + create-require@1.1.1: + optional: true + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -8991,6 +9973,9 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: + optional: true + diff@5.2.0: {} dir-glob@3.0.1: @@ -9854,6 +10839,13 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.11.1 + global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -9962,6 +10954,10 @@ snapshots: hast-util-whitespace@2.0.1: {} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hosted-git-info@6.1.1: dependencies: lru-cache: 7.18.3 @@ -9976,6 +10972,13 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.6 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -9999,6 +11002,20 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.11.0: + dependencies: + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + cjs-module-lexer: 1.4.1 + module-details-from-path: 1.0.3 + + import-in-the-middle@1.4.2: + dependencies: + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) + cjs-module-lexer: 1.4.1 + module-details-from-path: 1.0.3 + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -10424,6 +11441,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.8: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -10433,6 +11454,9 @@ snapshots: dependencies: semver: 6.3.1 + make-error@1.3.6: + optional: true + map-or-similar@1.5.0: {} markdown-extensions@1.1.1: {} @@ -10831,6 +11855,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@8.0.4: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -10853,6 +11881,8 @@ snapshots: dependencies: yallist: 4.0.0 + minipass@4.2.8: {} + minipass@5.0.0: {} minipass@7.1.2: {} @@ -10875,6 +11905,8 @@ snapshots: modern-ahocorasick@1.0.1: {} + module-details-from-path@1.0.3: {} + morgan@1.10.0: dependencies: basic-auth: 2.0.1 @@ -10911,6 +11943,10 @@ snapshots: node-fetch-native@1.6.4: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-forge@1.3.1: {} node-releases@2.0.18: {} @@ -11040,6 +12076,14 @@ snapshots: dependencies: mimic-function: 5.0.1 + opentelemetry-instrumentation-remix@0.7.1(@opentelemetry/api@1.9.0): + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -11170,6 +12214,18 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 + pg-int8@1.0.1: {} + + pg-protocol@1.6.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -11204,12 +12260,13 @@ snapshots: dependencies: postcss: 8.4.45 - postcss-load-config@4.0.2(postcss@8.4.45): + postcss-load-config@4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@22.5.3)(typescript@5.5.3)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: postcss: 8.4.45 + ts-node: 10.9.2(@types/node@22.5.3)(typescript@5.5.3) postcss-modules-extract-imports@3.1.0(postcss@8.4.45): dependencies: @@ -11257,6 +12314,16 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.0 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -11291,6 +12358,8 @@ snapshots: process@0.11.10: {} + progress@2.0.3: {} + promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -11316,6 +12385,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} + pump@2.0.1: dependencies: end-of-stream: 1.4.4 @@ -11545,6 +12616,14 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@7.4.0: + dependencies: + debug: 4.3.6 + module-details-from-path: 1.0.3 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + require-like@0.1.2: {} requireindex@1.2.0: {} @@ -11728,6 +12807,8 @@ snapshots: shebang-regex@3.0.0: {} + shimmer@1.2.1: {} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -12028,6 +13109,8 @@ snapshots: toml@3.0.0: {} + tr46@0.0.3: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -12038,6 +13121,25 @@ snapshots: ts-dedent@2.2.0: {} + ts-node@10.9.2(@types/node@22.5.3)(typescript@5.5.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.3 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + tsconfck@3.1.3(typescript@5.5.3): optionalDependencies: typescript: 5.5.3 @@ -12233,10 +13335,19 @@ snapshots: unpipe@1.0.0: {} - unplugin@1.13.1: + unplugin@1.0.1: + dependencies: + acorn: 8.12.1 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + + unplugin@1.13.1(webpack-sources@3.2.3): dependencies: acorn: 8.12.1 webpack-virtual-modules: 0.6.2 + optionalDependencies: + webpack-sources: 3.2.3 update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: @@ -12275,6 +13386,9 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 + v8-compile-cache-lib@3.0.1: + optional: true + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -12302,7 +13416,7 @@ snapshots: debug: 4.3.6 pathe: 1.1.2 picocolors: 1.1.0 - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) transitivePeerDependencies: - '@types/node' - less @@ -12313,18 +13427,18 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.5.3)(vite@5.3.3(@types/node@22.5.3)): + vite-tsconfig-paths@4.3.2(typescript@5.5.3)(vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3)): dependencies: debug: 4.3.6 globrex: 0.1.2 tsconfck: 3.1.3(typescript@5.5.3) optionalDependencies: - vite: 5.3.3(@types/node@22.5.3) + vite: 5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3) transitivePeerDependencies: - supports-color - typescript - vite@5.3.3(@types/node@22.5.3): + vite@5.3.3(patch_hash=ng7gibuvnft5mzxgmesrpubqd4)(@types/node@22.5.3): dependencies: esbuild: 0.21.5 postcss: 8.4.45 @@ -12347,8 +13461,19 @@ snapshots: web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + + webpack-sources@3.2.3: {} + + webpack-virtual-modules@0.5.0: {} + webpack-virtual-modules@0.6.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -12489,6 +13614,9 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: + optional: true + yocto-queue@0.1.0: {} yocto-queue@1.1.1: {} diff --git a/server/constants/env.ts b/server/constants/env.ts index 63ff568..9ae9c34 100644 --- a/server/constants/env.ts +++ b/server/constants/env.ts @@ -1,14 +1,16 @@ import { z } from 'zod'; -export const clientEnvSchema = z.object({ - API_URL: z.string().regex(/^(.*[^/])$/g, { +// 클라이언트용은 CLIENT_, 서버용은 SERVER_, 양쪽 모두 사용하는 용도는 SHARED_ +const envSchemaObject = { + SERVER_AUTH_COOKIE_SESSION_SECRET: z.string(), + SERVER_API_URL: z.string().regex(/^(.*[^/])$/g, { message: 'API 주소는 슬래시(/)로 끝나지 않아야 합니다.', }), -}); + SHARED_SENTRY_DSN: z.string(), + SHARED_APP_MODE: z.enum(['development', 'preview', 'production']), +} satisfies Record< + `${'SERVER_' | 'CLIENT_' | 'SHARED_'}${string}`, + z.ZodString | z.ZodEnum<[string, ...string[]]> +>; -export const serverEnvSchema = z.object({ - AUTH_COOKIE_SESSION_SECRET: z.string(), - API_URL: z.string().regex(/^(.*[^/])$/g, { - message: 'API 주소는 슬래시(/)로 끝나지 않아야 합니다.', - }), -}); +export const envSchema = z.object(envSchemaObject); diff --git a/server/index.ts b/server/index.ts index 40fe4b6..6912fd0 100644 --- a/server/index.ts +++ b/server/index.ts @@ -1,4 +1,4 @@ -export { serverEnvSchema, clientEnvSchema } from './constants/env'; +export { envSchema } from './constants/env'; export { AuthSessionService } from './models/auth'; @@ -7,11 +7,6 @@ export type { AuthSessionData, AuthSessionStorage, } from './types/auth'; -export type { - ServerEnv, - ClientEnv, - CloudflareEnv, - ContextEnv, -} from './types/env'; +export type { CloudflareEnv, ContextEnv } from './types/env'; export { getLoadContext, makeAuthSessionService } from './utils/cloudflare'; diff --git a/server/models/auth.ts b/server/models/auth.ts index eef6d3d..ee4e984 100644 --- a/server/models/auth.ts +++ b/server/models/auth.ts @@ -1,4 +1,4 @@ -import { type AppLoadContext } from '@remix-run/cloudflare'; +import { type Cookie } from '@remix-run/cloudflare'; import type { AuthSession, AuthSessionData, @@ -6,19 +6,48 @@ import type { } from '../types/auth'; export class AuthSessionService { + private authSessionCookie: Cookie; private authSessionStorage: AuthSessionStorage; private authSession: AuthSession; + private nextAction: 'none' | 'commit' | 'destroy' = 'none'; constructor( + authSessionCookie: Cookie, authSessionStorage: AuthSessionStorage, authSession: AuthSession, ) { + this.authSessionCookie = authSessionCookie; this.authSessionStorage = authSessionStorage; this.authSession = authSession; } - async commitSession(): Promise { - return await this.authSessionStorage.commitSession(this.authSession); + async parseCookieHeader(cookieHeader: string | null): Promise { + return await this.authSessionCookie.parse(cookieHeader); + } + + /** + * session 수정사항을 반영하고 Set-Cookie header를 얻는 method + * - Set-Cookie를 할 필요가 없는 경우 `null` 반환 + */ + async commitSession(): Promise { + console.log('commitSession', this.nextAction); + if (this.nextAction === 'destroy') { + const cookieHeader = await this.authSessionStorage.destroySession( + this.authSession, + ); + this.nextAction = 'none'; + return cookieHeader; + } + + if (this.nextAction === 'commit') { + const cookieHeader = await this.authSessionStorage.commitSession( + this.authSession, + ); + this.nextAction = 'none'; + return cookieHeader; + } + + return null; } async clearAuthToken() { @@ -26,6 +55,7 @@ export class AuthSessionService { this.authSession.unset('accessTokenExpiresAt'); this.authSession.unset('refreshToken'); this.authSession.unset('refreshTokenExpiresAt'); + this.nextAction = 'destroy'; } /** @@ -44,6 +74,7 @@ export class AuthSessionService { (Object.keys(newToken) as (keyof typeof newToken)[]).forEach((key) => { if (newToken[key]) { this.authSession.set(key, newToken[key]); + this.nextAction = 'commit'; } }); } @@ -52,7 +83,7 @@ export class AuthSessionService { * auth token을 얻는 method * - access token이 만료된 경우 refresh token으로 자동 업데이트 */ - async getAuthToken(context: AppLoadContext): Promise<{ + async getAuthToken(): Promise<{ accessToken: string; refreshToken: string; } | null> { @@ -71,7 +102,6 @@ export class AuthSessionService { accessTokenExpiresAtString === undefined || refreshTokenExpiresAtString === undefined ) { - await this.clearAuthToken(); return null; } @@ -85,13 +115,16 @@ export class AuthSessionService { // refresh token이 만료되지 않음 (서버 응답 시간 등을 고려해 1분 여유 포함) if (refreshTokenExpiresAt.getTime() > now.getTime() + 1000 * 60) { try { - const response = await fetch(`${context.API_URL}/token/access`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', + const response = await fetch( + `${import.meta.env.SERVER_API_URL}/token/access`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ refreshToken }), }, - body: JSON.stringify({ refreshToken }), - }); + ); const result = await response.json<{ accessToken: string; accessTokenExpiresAt: string; diff --git a/server/types/env.ts b/server/types/env.ts index 8396c58..279d323 100644 --- a/server/types/env.ts +++ b/server/types/env.ts @@ -1,12 +1,10 @@ import type { z } from 'zod'; -import type { clientEnvSchema, serverEnvSchema } from '../constants/env'; +import type { envSchema } from '../constants/env'; -export type ClientEnv = Readonly>; - -export type ServerEnv = Readonly>; +export type Env = z.infer; export type CloudflareEnv = { readonly KV_NAMESPACE: KVNamespace; }; -export type ContextEnv = ClientEnv & ServerEnv & CloudflareEnv; +export type ContextEnv = CloudflareEnv; diff --git a/server/utils/cloudflare.ts b/server/utils/cloudflare.ts index fec2f69..d67ca1a 100644 --- a/server/utils/cloudflare.ts +++ b/server/utils/cloudflare.ts @@ -4,42 +4,16 @@ import { } from '@remix-run/cloudflare'; import { type GetLoadContextFunction } from '@remix-run/cloudflare-pages'; import { type PlatformProxy } from 'wrangler'; -import { clientEnvSchema, serverEnvSchema } from '../constants/env'; import { AuthSessionService } from '../models/auth'; import type { AuthSessionData } from '../types/auth'; -import type { - ClientEnv, - CloudflareEnv, - ContextEnv, - ServerEnv, -} from '../types/env'; +import type { CloudflareEnv, ContextEnv } from '../types/env'; declare module '@remix-run/cloudflare' { - interface AppLoadContext extends ServerEnv, CloudflareEnv { - readonly clientEnv: ClientEnv; + interface AppLoadContext extends CloudflareEnv { readonly authSessionService: AuthSessionService; } } -export const getLoadContext = ( - authSessionService: AuthSessionService, - args: { - request: Request; - context: { - cloudflare: Omit, 'dispose'>; - }; - }, -): ReturnType> => { - const clientEnv = clientEnvSchema.parse(args.context.cloudflare.env); - serverEnvSchema.parse(args.context.cloudflare.env); - - return { - ...args.context.cloudflare.env, - clientEnv, - authSessionService, - }; -}; - export const makeAuthSessionService = async ( env: { authCookieSessionSecret: string; @@ -50,11 +24,45 @@ export const makeAuthSessionService = async ( const authSessionCookie = createCookie('__auth_session', { secrets: [env.authCookieSessionSecret], sameSite: true, + maxAge: 60 * 60 * 24 * 30, + httpOnly: true, + secure: true, }); const authSessionStorage = createWorkersKVSessionStorage({ cookie: authSessionCookie, kv: env.kvNamespace, }); const authSession = await authSessionStorage.getSession(cookieHeader); - return new AuthSessionService(authSessionStorage, authSession); + return new AuthSessionService( + authSessionCookie, + authSessionStorage, + authSession, + ); +}; + +export const getLoadContext = async ( + args: { + request: Request; + context: { + cloudflare: Omit, 'dispose'>; + }; + }, + env: { + authCookieSessionSecret: string; + }, +): Promise>>> => { + const authSessionService = await makeAuthSessionService( + { + authCookieSessionSecret: + env?.authCookieSessionSecret ?? + import.meta.env.SERVER_AUTH_COOKIE_SESSION_SECRET, + kvNamespace: args.context.cloudflare.env.KV_NAMESPACE, + }, + args.request.headers.get('cookie'), + ); + + return { + ...args.context.cloudflare.env, + authSessionService, + }; }; diff --git a/vite.config.ts b/vite.config.ts index 21e27f8..dcfd01b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,46 +1,57 @@ -import { cloudflareDevProxyVitePlugin as remixCloudflareDevProxyVitePlugin } from '@majority-elite/remix-dev-utils'; -import { vitePlugin as remix } from '@remix-run/dev'; +import { + vitePlugin as remix, + cloudflareDevProxyVitePlugin as remixCloudflareDevProxyVitePlugin, +} from '@remix-run/dev'; +import { sentryVitePlugin } from '@sentry/vite-plugin'; import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; -import { defineConfig } from 'vite'; +import { defineConfig, loadEnv } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; -import { - type ContextEnv, - getLoadContext, - makeAuthSessionService, -} from './server'; +import { z } from 'zod'; +import { type ContextEnv, envSchema, getLoadContext } from './server'; + +export default defineConfig(({ mode }) => { + const viteEnv = loadEnv(mode, process.cwd(), [ + 'CLIENT_', + 'SERVER_', + 'SHARED_', + 'SENTRY_', + ]); + + envSchema.parse(viteEnv); + + const configEnv = z + .object({ + SENTRY_AUTH_TOKEN: z.string(), + }) + .parse(viteEnv); -export default defineConfig({ - plugins: [ - remixCloudflareDevProxyVitePlugin({ - getLoadContext: async (args) => { - const authSessionService = await makeAuthSessionService( - { - authCookieSessionSecret: - args.context.cloudflare.env.AUTH_COOKIE_SESSION_SECRET, - kvNamespace: args.context.cloudflare.env.KV_NAMESPACE, - }, - args.request.headers.get('Cookie'), - ); - const loadContext = await getLoadContext(authSessionService, args); - return loadContext; - }, - getResponse: async (req, loadContext, handler) => { - const response = await handler(req, loadContext); - response.headers.append( - 'Set-Cookie', - await loadContext.authSessionService.commitSession(), - ); - return response; - }, - }), - remix({ - future: { - v3_fetcherPersist: true, - v3_relativeSplatPath: true, - v3_throwAbortReason: true, - }, - }), - tsconfigPaths(), - vanillaExtractPlugin(), - ], + return { + envPrefix: ['CLIENT_', 'SERVER_', 'SHARED_'], + plugins: [ + remixCloudflareDevProxyVitePlugin({ + getLoadContext: (args) => + getLoadContext(args, { + authCookieSessionSecret: viteEnv.SERVER_AUTH_COOKIE_SESSION_SECRET, + }), + }), + remix({ + future: { + v3_fetcherPersist: true, + v3_relativeSplatPath: true, + v3_throwAbortReason: true, + }, + }), + tsconfigPaths(), + vanillaExtractPlugin(), + sentryVitePlugin({ + org: 'majority-elite', + project: 'ort-frontend', + url: 'https://sentry.io/', + authToken: configEnv.SENTRY_AUTH_TOKEN, + }), + ], + build: { + sourcemap: true, + }, + }; });