diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 976c05859..90a18c009 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,6 +78,15 @@ jobs: - name: Install dependencies run: npm ci + - name: Set up environment variables + run: | + echo "🔧 Setting up environment variables for build..." + echo "NEXT_PUBLIC_API_URL=http://localhost:3000/api" >> .env.local + echo "NEXT_PUBLIC_APP_URL=http://localhost:3000" >> .env.local + echo "NEXTAUTH_SECRET=ci-test-secret-key" >> .env.local + echo "NEXTAUTH_URL=http://localhost:3000" >> .env.local + echo "DATABASE_URL=postgresql://test:test@localhost:5432/test_db" >> .env.local + - name: Build application run: npm run build @@ -191,6 +200,15 @@ jobs: - name: Install dependencies run: npm ci + - name: Set up environment variables + run: | + echo "🔧 Setting up environment variables for build..." + echo "NEXT_PUBLIC_API_URL=http://localhost:3000/api" >> .env.local + echo "NEXT_PUBLIC_APP_URL=http://localhost:3000" >> .env.local + echo "NEXTAUTH_SECRET=ci-test-secret-key" >> .env.local + echo "NEXTAUTH_URL=http://localhost:3000" >> .env.local + echo "DATABASE_URL=postgresql://test:test@localhost:5432/test_db" >> .env.local + - name: Build with bundle analysis run: | npm run build @@ -223,6 +241,15 @@ jobs: - name: Install dependencies run: npm ci + - name: Set up environment variables + run: | + echo "🔧 Setting up environment variables for build..." + echo "NEXT_PUBLIC_API_URL=http://localhost:3000/api" >> .env.local + echo "NEXT_PUBLIC_APP_URL=http://localhost:3000" >> .env.local + echo "NEXTAUTH_SECRET=ci-test-secret-key" >> .env.local + echo "NEXTAUTH_URL=http://localhost:3000" >> .env.local + echo "DATABASE_URL=postgresql://test:test@localhost:5432/test_db" >> .env.local + - name: Build application run: npm run build @@ -264,6 +291,15 @@ jobs: - name: Install dependencies run: npm ci + - name: Set up environment variables + run: | + echo "🔧 Setting up environment variables for build..." + echo "NEXT_PUBLIC_API_URL=http://localhost:3000/api" >> .env.local + echo "NEXT_PUBLIC_APP_URL=http://localhost:3000" >> .env.local + echo "NEXTAUTH_SECRET=ci-test-secret-key" >> .env.local + echo "NEXTAUTH_URL=http://localhost:3000" >> .env.local + echo "DATABASE_URL=postgresql://test:test@localhost:5432/test_db" >> .env.local + - name: Build application run: npm run build @@ -295,6 +331,15 @@ jobs: - name: Install dependencies run: npm ci + - name: Set up environment variables + run: | + echo "🔧 Setting up environment variables for build..." + echo "NEXT_PUBLIC_API_URL=http://localhost:3000/api" >> .env.local + echo "NEXT_PUBLIC_APP_URL=http://localhost:3000" >> .env.local + echo "NEXTAUTH_SECRET=ci-test-secret-key" >> .env.local + echo "NEXTAUTH_URL=http://localhost:3000" >> .env.local + echo "DATABASE_URL=postgresql://test:test@localhost:5432/test_db" >> .env.local + - name: Build application run: npm run build diff --git a/app/auth/forgot-password/page.tsx b/app/auth/forgot-password/page.tsx new file mode 100644 index 000000000..d6bb6799b --- /dev/null +++ b/app/auth/forgot-password/page.tsx @@ -0,0 +1,29 @@ +'use client'; + +import React, { useState } from 'react'; +import AuthLoadingState from '@/components/auth/AuthLoadingState'; +import ForgotPasswordWrapper from '@/components/auth/ForgotPasswordWrapper'; + +const ForgotPassword = () => { + const [loadingState, setLoadingState] = useState(false); + + return ( + <> + {loadingState && } +
+
+
+
+
+ +
+ +
+
+
+
+ + ); +}; + +export default ForgotPassword; diff --git a/app/auth/page.tsx b/app/auth/page.tsx index dbda8dc89..38fec6c3d 100644 --- a/app/auth/page.tsx +++ b/app/auth/page.tsx @@ -3,9 +3,14 @@ import { useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { AuthModeNav } from '@/components/auth/AuthModeNav'; +import LoginWrapper from '@/components/auth/LoginWrapper'; +import SignupWrapper from '@/components/auth/SignupWrapper'; +import AuthLoadingState from '@/components/auth/AuthLoadingState'; export default function AuthPage() { + const [loadingState, setLoadingState] = useState(false); const searchParams = useSearchParams(); + const mode = searchParams.get('mode') || 'signin'; const [currentMode, setCurrentMode] = useState<'signin' | 'signup'>( mode as 'signin' | 'signup' @@ -16,17 +21,32 @@ export default function AuthPage() { }; return ( -
-
-
- - -
+ <> + {loadingState && } +
+
+
+
+ +
+ +
+ + +
+ {currentMode === 'signin' ? ( + + ) : ( + + )} +
+
+
-
+ ); } diff --git a/app/globals.css b/app/globals.css index 017d4a7aa..0ca1e076c 100644 --- a/app/globals.css +++ b/app/globals.css @@ -447,3 +447,12 @@ input[type='number'] { background-image: url('/landing/about/Abstract_03md.png'); } } + +input:-webkit-autofill, +input:-webkit-autofill:hover, +input:-webkit-autofill:focus, +input:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px your_desired_color inset !important; + -webkit-text-fill-color: white !important; /* Optional: Customize text color */ + transition: background-color 5000s ease-in-out 0s; /* Optional: Smooth transition */ +} diff --git a/components/auth/AnimatedAuthLayout.tsx b/components/auth/AnimatedAuthLayout.tsx index c3aecedef..6f0562cc8 100644 --- a/components/auth/AnimatedAuthLayout.tsx +++ b/components/auth/AnimatedAuthLayout.tsx @@ -17,390 +17,390 @@ const AnimatedAuthLayout = ({ children }: AnimatedAuthLayoutProps) => { className='relative -bottom-[200px] h-full w-full' preserveAspectRatio='xMidYMid slice' > - + @@ -412,8 +412,8 @@ const AnimatedAuthLayout = ({ children }: AnimatedAuthLayoutProps) => { y2='481.616' gradientUnits='userSpaceOnUse' > - - + + { y2='472.479' gradientUnits='userSpaceOnUse' > - - + + { y2='467.115' gradientUnits='userSpaceOnUse' > - - + + { y2='478.863' gradientUnits='userSpaceOnUse' > - - + + { y2='490.638' gradientUnits='userSpaceOnUse' > - - + + { y2='502.415' gradientUnits='userSpaceOnUse' > - - + + { y2='514.211' gradientUnits='userSpaceOnUse' > - - + + { y2='526.017' gradientUnits='userSpaceOnUse' > - - + + { y2='537.872' gradientUnits='userSpaceOnUse' > - - + + { y2='549.729' gradientUnits='userSpaceOnUse' > - - + + { y2='561.623' gradientUnits='userSpaceOnUse' > - - + + { y2='573.524' gradientUnits='userSpaceOnUse' > - - + + { y2='585.487' gradientUnits='userSpaceOnUse' > - - + + { y2='597.44' gradientUnits='userSpaceOnUse' > - - + + { y2='609.441' gradientUnits='userSpaceOnUse' > - - + + { y2='621.491' gradientUnits='userSpaceOnUse' > - - + + { y2='633.559' gradientUnits='userSpaceOnUse' > - - + + { y2='645.688' gradientUnits='userSpaceOnUse' > - - + + { y2='657.861' gradientUnits='userSpaceOnUse' > - - + + { y2='670.1' gradientUnits='userSpaceOnUse' > - - + + { y2='682.386' gradientUnits='userSpaceOnUse' > - - + + { y2='694.756' gradientUnits='userSpaceOnUse' > - - + + { y2='708.051' gradientUnits='userSpaceOnUse' > - - + + { y2='722.683' gradientUnits='userSpaceOnUse' > - - + + { y2='737.322' gradientUnits='userSpaceOnUse' > - - + + { y2='751.959' gradientUnits='userSpaceOnUse' > - - + + { y2='766.598' gradientUnits='userSpaceOnUse' > - - + + { y2='781.242' gradientUnits='userSpaceOnUse' > - - + + { y2='795.869' gradientUnits='userSpaceOnUse' > - - + + { y2='810.495' gradientUnits='userSpaceOnUse' > - - + + { y2='825.145' gradientUnits='userSpaceOnUse' > - - + + { y2='839.772' gradientUnits='userSpaceOnUse' > - - + + { y2='873.758' gradientUnits='userSpaceOnUse' > - - + + { y2='866.366' gradientUnits='userSpaceOnUse' > - - + + { y2='858.981' gradientUnits='userSpaceOnUse' > - - + + { y2='851.59' gradientUnits='userSpaceOnUse' > - - + + { y2='844.204' gradientUnits='userSpaceOnUse' > - - + + { y2='836.814' gradientUnits='userSpaceOnUse' > - - + + { y2='829.423' gradientUnits='userSpaceOnUse' > - - + + { y2='822.038' gradientUnits='userSpaceOnUse' > - - + + { y2='814.646' gradientUnits='userSpaceOnUse' > - - + + { y2='807.254' gradientUnits='userSpaceOnUse' > - - + + { y2='799.87' gradientUnits='userSpaceOnUse' > - - + + { y2='792.478' gradientUnits='userSpaceOnUse' > - - + + { y2='785.094' gradientUnits='userSpaceOnUse' > - - + + { y2='777.703' gradientUnits='userSpaceOnUse' > - - + + { y2='770.311' gradientUnits='userSpaceOnUse' > - - + + { y2='762.926' gradientUnits='userSpaceOnUse' > - - + + { y2='755.535' gradientUnits='userSpaceOnUse' > - - + + { y2='748.151' gradientUnits='userSpaceOnUse' > - - + + { y2='740.76' gradientUnits='userSpaceOnUse' > - - + + { y2='733.428' gradientUnits='userSpaceOnUse' > - - + + { y2='726.513' gradientUnits='userSpaceOnUse' > - - + + { y2='719.612' gradientUnits='userSpaceOnUse' > - - + + { y2='712.737' gradientUnits='userSpaceOnUse' > - - + + { y2='705.876' gradientUnits='userSpaceOnUse' > - - + + { y2='699.034' gradientUnits='userSpaceOnUse' > - - + + { y2='692.215' gradientUnits='userSpaceOnUse' > - - + + { y2='685.404' gradientUnits='userSpaceOnUse' > - - + + { y2='678.613' gradientUnits='userSpaceOnUse' > - - + + { y2='674.765' gradientUnits='userSpaceOnUse' > - - + + { y2='675.504' gradientUnits='userSpaceOnUse' > - - + + { y2='676.812' gradientUnits='userSpaceOnUse' > - - + + { y2='678.516' gradientUnits='userSpaceOnUse' > - - + + diff --git a/components/auth/AuthLoadingState.tsx b/components/auth/AuthLoadingState.tsx index bc00ad895..4d17b845a 100644 --- a/components/auth/AuthLoadingState.tsx +++ b/components/auth/AuthLoadingState.tsx @@ -15,7 +15,7 @@ const AuthLoadingState = ({
diff --git a/components/auth/ForgotPasswordWrapper.tsx b/components/auth/ForgotPasswordWrapper.tsx new file mode 100644 index 000000000..d10dbdfe7 --- /dev/null +++ b/components/auth/ForgotPasswordWrapper.tsx @@ -0,0 +1,187 @@ +'use client'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useState, useCallback } from 'react'; +import { useForm } from 'react-hook-form'; +import { toast } from 'sonner'; +import z from 'zod'; +import { Mail, ArrowLeft } from 'lucide-react'; +import Link from 'next/link'; +import { BoundlessButton } from '../buttons'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '../ui/form'; +import { Input } from '../ui/input'; +import { forgotPassword } from '@/lib/api/auth'; + +const forgotPasswordSchema = z.object({ + email: z.string().email({ + message: 'Please enter a valid email address', + }), +}); + +type ForgotPasswordFormData = z.infer; + +interface ForgotPasswordWrapperProps { + setLoadingState: (isLoading: boolean) => void; +} + +const ForgotPasswordWrapper = ({ + setLoadingState, +}: ForgotPasswordWrapperProps) => { + const [isLoading, setIsLoading] = useState(false); + const [isSuccess, setIsSuccess] = useState(false); + + const form = useForm({ + resolver: zodResolver(forgotPasswordSchema), + defaultValues: { + email: '', + }, + }); + + const handleSubmit = useCallback( + async (data: ForgotPasswordFormData) => { + setIsLoading(true); + setLoadingState(true); + + try { + // const response = await fetch('/api/auth/forgot-password', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json', + // }, + // body: JSON.stringify({ email: data.email }), + // }); + const response = await forgotPassword({ email: data.email }); + + const result = response; + console.log(result); + + if (response) { + setIsSuccess(true); + toast.success('Password reset instructions sent to your email'); + form.reset(); + } else { + form.setError('root', { + type: 'manual', + message: result.message || 'Failed to send reset email', + }); + toast.error(result.message || 'Failed to send reset email'); + } + } catch { + form.setError('root', { + type: 'manual', + message: 'An unexpected error occurred. Please try again.', + }); + toast.error('An unexpected error occurred'); + } finally { + setIsLoading(false); + setLoadingState(false); + } + }, + [form, setLoadingState] + ); + + if (isSuccess) { + return ( +
+
+
+ +
+

+ Check Your Email +

+

+ We've sent password reset instructions to your email address. +

+
+ +
+ + + Back to sign in + +
+
+ ); + } + + return ( +
+
+

+ Reset Password +

+

+ Enter the email address you used when you joined, and we'll send you + instructions to reset your password. +

+
+ +
+ + ( + + + Email + + +
+ + +
+
+ +
+ )} + /> + + {form.formState.errors.root && ( +
+ {form.formState.errors.root.message} +
+ )} + + + Send Reset Link + + + + +
+ + + Back to sign in + +
+
+ ); +}; + +export default ForgotPasswordWrapper; diff --git a/components/auth/LoginForm.tsx b/components/auth/LoginForm.tsx index 2a0b3dd92..ac99b1c64 100644 --- a/components/auth/LoginForm.tsx +++ b/components/auth/LoginForm.tsx @@ -44,33 +44,34 @@ const LoginForm = ({ return ( <>
-

- Sign in -

Sign in to manage campaigns, apply for grants, and track your funding - progress — all in one dashboard. + progress.

-
+
+ } + className='bg-background hover:!text-background border !border-[#484848] text-base !text-white' > - google Continue with Google
-

Or

+

+ Or +

@@ -160,19 +161,13 @@ const LoginForm = ({ className='w-full' disabled={isLoading || !form.formState.isValid} fullWidth + size='xl' loading={isLoading} > Sign in - -

- Don't have an account?{' '} - - Sign up - -

); diff --git a/components/auth/LoginWrapper.tsx b/components/auth/LoginWrapper.tsx new file mode 100644 index 000000000..4cb2220a2 --- /dev/null +++ b/components/auth/LoginWrapper.tsx @@ -0,0 +1,147 @@ +'use client'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { useState, useCallback } from 'react'; +import { useForm } from 'react-hook-form'; +import Cookies from 'js-cookie'; +import { getSession, signIn } from 'next-auth/react'; +import { toast } from 'sonner'; +import z from 'zod'; +import LoginForm from './LoginForm'; + +const formSchema = z.object({ + email: z.string().email({ + message: 'Invalid email address', + }), + password: z.string().min(8, { + message: 'Password must be at least 8 characters', + }), +}); + +type FormData = z.infer; + +interface LoginWrapperProps { + setLoadingState: (isLoading: boolean) => void; +} + +const LoginWrapper = ({ setLoadingState }: LoginWrapperProps) => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [showPassword, setShowPassword] = useState(false); + const [isLoading, setIsLoading] = useState(false); + + const callbackUrl = searchParams.get('callbackUrl') || '/'; + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: { + email: '', + password: '', + }, + }); + + const handleAuthError = useCallback( + (error: string, values: FormData) => { + switch (error) { + case 'UNVERIFIED_EMAIL': + toast.error( + 'Please verify your email before signing in. Check your inbox for a verification link.' + ); + setTimeout(() => { + router.push( + `/auth/verify-email?email=${encodeURIComponent(values.email)}` + ); + }, 3000); + break; + case 'CredentialsSignin': + form.setError('root', { + type: 'manual', + message: 'Invalid email or password', + }); + break; + default: + form.setError('root', { + type: 'manual', + message: 'Authentication failed. Please try again.', + }); + } + }, + [form, router] + ); + + const handleSessionSetup = useCallback( + async (session: { + user?: { accessToken?: string; refreshToken?: string }; + }) => { + if (session?.user?.accessToken) { + Cookies.set('accessToken', session.user.accessToken); + } + if (session?.user?.refreshToken) { + Cookies.set('refreshToken', session.user.refreshToken); + } + router.push(callbackUrl); + }, + [router, callbackUrl] + ); + + const onSubmit = useCallback( + async (values: FormData) => { + setIsLoading(true); + setLoadingState(true); + + try { + const result = await signIn('credentials', { + email: values.email, + password: values.password, + redirect: false, + }); + + if (result?.error) { + handleAuthError(result.error, values); + return; + } + + if (result?.ok) { + const session = await getSession(); + + if (session) { + await handleSessionSetup(session); + } else { + form.setError('root', { + type: 'manual', + message: + 'Login successful but session not found. Please try again.', + }); + } + } else { + form.setError('root', { + type: 'manual', + message: 'An unexpected error occurred. Please try again.', + }); + } + } catch { + form.setError('root', { + type: 'manual', + message: 'An unexpected error occurred. Please try again.', + }); + } finally { + setIsLoading(false); + setLoadingState(false); + } + }, + [form, handleAuthError, handleSessionSetup, setLoadingState] + ); + + return ( + + ); +}; + +export default LoginWrapper; diff --git a/components/auth/SignupWrapper.tsx b/components/auth/SignupWrapper.tsx new file mode 100644 index 000000000..ab09269f1 --- /dev/null +++ b/components/auth/SignupWrapper.tsx @@ -0,0 +1,17 @@ +'use client'; + +import { useState } from 'react'; +import SignupForm from './SignupForm'; + +const SignupWrapper = ({ + setLoadingState, +}: { + setLoadingState: (isLoading: boolean) => void; +}) => { + const [isLoading, setIsLoading] = useState(false); + setLoadingState(isLoading); + + return ; +}; + +export default SignupWrapper; diff --git a/components/landing-page/BeamBackground.tsx b/components/landing-page/BeamBackground.tsx index 02fa3561e..cb09ee8cc 100644 --- a/components/landing-page/BeamBackground.tsx +++ b/components/landing-page/BeamBackground.tsx @@ -211,7 +211,7 @@ export default function BeamBackground() { xmlns='http://www.w3.org/2000/svg' id='left-beam' > - + - - + + - - + + - - + + - - + + @@ -10761,7 +10761,7 @@ export default function BeamBackground() { xmlns='http://www.w3.org/2000/svg' className='h-screen' > - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/components/landing-page/navbar.tsx b/components/landing-page/navbar.tsx index 6bf3046a7..ef714689f 100644 --- a/components/landing-page/navbar.tsx +++ b/components/landing-page/navbar.tsx @@ -208,7 +208,16 @@ export function Navbar() { ); } -function AuthenticatedNav({ user }: { user: any }) { +function AuthenticatedNav({ + user, +}: { + user: { + name?: string | null; + email?: string | null; + image?: string | null; + profile?: { firstName?: string | null; avatar?: string | null }; + } | null; +}) { const { logout } = useZustandAuth(false); return ( @@ -294,7 +303,12 @@ function MobileMenu({ }: { isAuthenticated: boolean; isLoading: boolean; - user: any; + user: { + name?: string | null; + email?: string | null; + image?: string | null; + profile?: { firstName?: string | null; avatar?: string | null }; + } | null; }) { const mobileMenuRef = useRef(null); const mobileButtonRef = useRef(null); diff --git a/next.config.ts b/next.config.ts index f19f1e70a..d82781797 100644 --- a/next.config.ts +++ b/next.config.ts @@ -4,6 +4,7 @@ const nextConfig: NextConfig = { /* config options here */ outputFileTracingRoot: __dirname, images: { + domains: ['i.pravatar.cc'], remotePatterns: [ { protocol: 'https', diff --git a/package-lock.json b/package-lock.json index 005056260..71e08e5f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -247,6 +247,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -624,28 +625,6 @@ "@img/sharp-libvips-darwin-arm64": "1.2.3" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", - "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.3" - } - }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", @@ -662,364 +641,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", - "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", - "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", - "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", - "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", - "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", - "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", - "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", - "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", - "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", - "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", - "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", - "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.3" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", - "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.3" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", - "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", - "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.3" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", - "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.5.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", - "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", - "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", - "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -1593,118 +1214,6 @@ "node": ">= 10" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.3.tgz", - "integrity": "sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.3.tgz", - "integrity": "sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.3.tgz", - "integrity": "sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.3.tgz", - "integrity": "sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.3.tgz", - "integrity": "sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.3.tgz", - "integrity": "sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.3.tgz", - "integrity": "sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@ngneat/elf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@ngneat/elf/-/elf-2.5.1.tgz", @@ -5640,17 +5149,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", - "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/type-utils": "8.44.0", - "@typescript-eslint/utils": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5664,7 +5173,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.0", + "@typescript-eslint/parser": "^8.44.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -5680,16 +5189,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", - "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -5705,14 +5214,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", - "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.0", - "@typescript-eslint/types": "^8.44.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -5727,14 +5236,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", - "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5745,9 +5254,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", - "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", "engines": { @@ -5762,15 +5271,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", - "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5787,9 +5296,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { @@ -5801,16 +5310,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", - "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.0", - "@typescript-eslint/tsconfig-utils": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5856,16 +5365,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", - "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0" + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5880,13 +5389,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", - "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6731,9 +6240,9 @@ } }, "node_modules/ansi-escapes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.0.tgz", - "integrity": "sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10730,9 +10239,9 @@ } }, "node_modules/jiti": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", - "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz", + "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index 118820b1f..206b763df 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,7 @@ "format": "prettier --write .", "format:check": "prettier --check .", "lint:fix": "eslint --fix .", - "prepare": "husky install", - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "jest --coverage" + "prepare": "husky install" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ diff --git a/vercel.json b/vercel.json index 6f0b511a0..3fc1b8faf 100644 --- a/vercel.json +++ b/vercel.json @@ -1,7 +1,7 @@ { "$schema": "https://openapi.vercel.sh/vercel.json", "buildCommand": "npm run build", - "installCommand": "npm ci && npm install --no-save --platform=linuxmusl --arch=x64 lightningcss @tailwindcss/oxide", + "installCommand": "npm install --no-save --platform=linuxmusl --arch=x64 lightningcss @tailwindcss/oxide && npm ci", "framework": "nextjs", "env": { "npm_config_target_platform": "linuxmusl",