diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e955410 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +node_modules +.git +.github +apps/backend/node_modules +apps/web/node_modules +apps/web/.svelte-kit +packages/shared/node_modules +dist +build +.env +.env.production +*.log +.gemini +.vscode +3D Objects diff --git a/.env.example b/.env.example index fb3d6ea..e5ac21d 100644 --- a/.env.example +++ b/.env.example @@ -1,28 +1,32 @@ # ─── Database ─── -DATABASE_URL=postgresql://devcard:devcard@localhost:5432/devcard?schema=public +# Connection string for PostgreSQL database +DATABASE_URL=postgresql://devcard:devcard@db:5432/devcard?schema=public # ─── Redis ─── -REDIS_URL=redis://localhost:6379 +# Connection string for Redis instance +REDIS_URL=redis://redis:6379 -# ─── JWT ─── +# ─── Security ─── +# Secret for signing JWTs JWT_SECRET=your-super-secret-jwt-key-change-in-production - -# ─── Encryption (for OAuth tokens) ─── +# 32-byte hex string for encryption (e.g. OAuth tokens) ENCRYPTION_KEY=your-32-byte-hex-encryption-key-here -# ─── GitHub OAuth ─── +# ─── OAuth Providers (Optional for local dev) ─── GITHUB_CLIENT_ID=your-github-client-id GITHUB_CLIENT_SECRET=your-github-client-secret - -# ─── Google OAuth ─── GOOGLE_CLIENT_ID=your-google-client-id GOOGLE_CLIENT_SECRET=your-google-client-secret # ─── App URLs ─── +# URL where the web frontend is accessible PUBLIC_APP_URL=http://localhost:5173 -BACKEND_URL=http://localhost:3000 +# URL where the backend API is accessible +BACKEND_URL=http://localhost:3001 +# URI to redirect to the mobile app MOBILE_REDIRECT_URI=devcard://oauth/callback -# ─── Server ─── -PORT=3000 +# ─── Server Configuration ─── +PORT=3001 +HOST=0.0.0.0 NODE_ENV=development diff --git a/README.md b/README.md index 136600f..4dc11d2 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,25 @@ The following error cases are implemented: | **Set Default Card** | 404 | `{ error: 'Card not found' }` — when card ID doesn't exist or doesn't belong to authenticated user | | **Successful Deletion** | 204 | No content | +## Self-Hosting + +DevCard is fully self-hostable via Docker Compose. You can run the entire stack (PostgreSQL, Redis, Backend, Web App) with a single command. + +### Running with Docker Compose + +1. Copy the example environment file: + ```bash + cp .env.example .env + ``` +2. Review and update the `.env` file with your specific values (especially `JWT_SECRET` and `ENCRYPTION_KEY`). +3. Start the stack: + ```bash + docker compose up -d + ``` +4. Access the web app at `http://localhost:5173` and the backend at `http://localhost:3001`. + +The data for PostgreSQL and Redis is persisted in Docker volumes across restarts. + ## Good First Issues New to open source? We've got you covered! Check out our [Good First Issues](https://github.com/Dev-Card/DevCard/issues?q=is%3Aopen+label%3A%22good-first-issue%22), these are specially curated issues that are: diff --git a/apps/backend/Dockerfile b/apps/backend/Dockerfile new file mode 100644 index 0000000..d73d9a1 --- /dev/null +++ b/apps/backend/Dockerfile @@ -0,0 +1,23 @@ +FROM node:20-alpine AS base +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable +WORKDIR /app + +FROM base AS builder +COPY . . +RUN pnpm install --no-frozen-lockfile +RUN pnpm --filter @devcard/backend exec prisma generate +RUN pnpm --filter @devcard/shared build +RUN pnpm --filter @devcard/backend build + +FROM base AS runner +# We copy the whole workspace for simplicity in a self-hosted mono-repo setup +# In a true enterprise setup, we'd prune the workspace, but this is sufficient. +COPY --from=builder /app /app +WORKDIR /app/apps/backend + +EXPOSE 3001 + +# Apply migrations and start the server +CMD ["sh", "-c", "npx prisma migrate deploy && npm start"] diff --git a/apps/backend/src/app.ts b/apps/backend/src/app.ts index 8e8cf38..30383bf 100644 --- a/apps/backend/src/app.ts +++ b/apps/backend/src/app.ts @@ -20,6 +20,12 @@ import { analyticsRoutes } from './routes/analytics.js'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); +declare module 'fastify' { + interface FastifyInstance { + authenticate: any; + } +} + export async function buildApp() { const app = Fastify({ logger: { diff --git a/apps/backend/src/routes/auth.ts b/apps/backend/src/routes/auth.ts index e12f10a..2482d22 100644 --- a/apps/backend/src/routes/auth.ts +++ b/apps/backend/src/routes/auth.ts @@ -1,4 +1,5 @@ import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify'; +import { encrypt } from '../utils/encryption.js'; const GITHUB_AUTH_URL = 'https://github.com/login/oauth/authorize'; const GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token'; @@ -103,7 +104,7 @@ export async function authRoutes(app: FastifyInstance) { }); // Save the authentication token for 'user:email read:user' so we have a basic platform connection - const encryptedToken = (app as any).encryption ? (app as any).encryption.encrypt(tokenData.access_token) : tokenData.access_token; + const encryptedToken = encrypt(tokenData.access_token); await app.prisma.oAuthToken.upsert({ where: { userId_platform: { userId: user.id, platform: 'github' } }, @@ -134,7 +135,7 @@ export async function authRoutes(app: FastifyInstance) { return reply.redirect(`${process.env.PUBLIC_APP_URL}/dashboard`); } catch (err) { - app.log.error('GitHub auth error:', err); + app.log.error(err as any, 'GitHub auth error'); return reply.status(500).send({ error: 'Authentication failed' }); } }); @@ -235,7 +236,7 @@ export async function authRoutes(app: FastifyInstance) { return reply.redirect(`${process.env.PUBLIC_APP_URL}/dashboard`); } catch (err) { - app.log.error('Google auth error:', err); + app.log.error(err as any, 'Google auth error'); return reply.status(500).send({ error: 'Authentication failed' }); } }); diff --git a/apps/backend/src/routes/connect.ts b/apps/backend/src/routes/connect.ts index 952e845..794e205 100644 --- a/apps/backend/src/routes/connect.ts +++ b/apps/backend/src/routes/connect.ts @@ -1,4 +1,5 @@ import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify'; +import { encrypt } from '../utils/encryption.js'; const GITHUB_AUTH_URL = 'https://github.com/login/oauth/authorize'; const GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token'; @@ -95,7 +96,7 @@ export async function connectRoutes(app: FastifyInstance) { } // Encrypt and store the token - const encryptedToken = app.encryption.encrypt(tokenData.access_token); + const encryptedToken = encrypt(tokenData.access_token); await app.prisma.oAuthToken.upsert({ where: { @@ -125,7 +126,7 @@ export async function connectRoutes(app: FastifyInstance) { return reply.redirect(`${process.env.PUBLIC_APP_URL}/settings?connected=github`); } catch (err) { - app.log.error('GitHub connect error:', err); + app.log.error(err as any, 'GitHub connect error'); return reply.redirect(`${process.env.PUBLIC_APP_URL}/settings?error=server_error`); } }); diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json index 356afe3..0eb4651 100644 --- a/apps/backend/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -14,5 +14,5 @@ "isolatedModules": true }, "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "src/__tests__"] } diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 0000000..e1c2812 --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,21 @@ +FROM node:20-alpine AS base +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable +WORKDIR /app + +FROM base AS builder +COPY . . +RUN pnpm install --no-frozen-lockfile +RUN pnpm --filter @devcard/shared build +RUN pnpm --filter @devcard/web build + +FROM base AS runner +COPY --from=builder /app /app +WORKDIR /app/apps/web + +EXPOSE 5173 +ENV NODE_ENV=production +ENV PORT=5173 + +CMD ["node", "build/index.js"] diff --git a/apps/web/package.json b/apps/web/package.json index 3601215..67466fe 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,12 +15,12 @@ "@devcard/shared": "workspace:*" }, "devDependencies": { - "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/adapter-node": "^5.2.9", "@sveltejs/kit": "^2.50.2", - "@sveltejs/vite-plugin-svelte": "^6.2.4", + "@sveltejs/vite-plugin-svelte": "^4.0.0", "svelte": "^5.51.0", "svelte-check": "^4.4.2", "typescript": "^5.9.3", - "vite": "^7.3.1" + "vite": "^5.4.21" } } diff --git a/apps/web/src/routes/+page.svelte b/apps/web/src/routes/+page.svelte index 512f905..d496d2a 100644 --- a/apps/web/src/routes/+page.svelte +++ b/apps/web/src/routes/+page.svelte @@ -52,15 +52,16 @@ The open-source standard for developer networking. Put all your profiles—GitHub, LinkedIn, LeetCode, and more—into a single, high-impact digital card.

+ ⚡ Create Your Card ⭐ Star on GitHub - View Demo Profile → + View Demo Profile →
diff --git a/apps/web/src/routes/create/+page.svelte b/apps/web/src/routes/create/+page.svelte new file mode 100644 index 0000000..f73ad71 --- /dev/null +++ b/apps/web/src/routes/create/+page.svelte @@ -0,0 +1,604 @@ + + + + Create Your DevCard — Preview Tool + + +
+
+
+ ← Home +

Create Your DevCard

+

Customize your card and see how it looks in real-time.

+
+ +
+ +
+
+ + +
+ +
+ +
+ + +
+

Paste a link or generate a random one.

+
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ +
+ + {profile.accentColor} +
+
+ + + +
+

💡 To save this permanently, you'll eventually need to use the DevCard Mobile App.

+
+
+ + +
+
+

Live Preview

+ + +
+
+
+
+
+
+ DevCard +
+ 📶 +
+ +
+
+ {#if profile.avatarUrl} + {profile.displayName} + {:else} +
+ {profile.displayName.charAt(0).toUpperCase()} +
+ {/if} +
+
+

{profile.displayName}

+

{profile.role}{profile.company ? ` @ ${profile.company}` : ''}

+ {#if profile.pronouns} +

{profile.pronouns}

+ {/if} +
+
+ +
+
+

{profile.bio}

+
+ +
+ QR Code +
+
+
+
+ + +
+
+
+
+
+ + diff --git a/apps/web/src/routes/devcard/[id]/+page.server.ts b/apps/web/src/routes/devcard/[id]/+page.server.ts index adc9817..17d81d1 100644 --- a/apps/web/src/routes/devcard/[id]/+page.server.ts +++ b/apps/web/src/routes/devcard/[id]/+page.server.ts @@ -4,14 +4,35 @@ import type { PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ params, fetch }) => { const { id } = params; - // Use internal fetch to reach the backend - // In production, this would be the actual API URL - const res = await fetch(`http://localhost:3000/api/u/card/${id}`); + try { + const res = await fetch(`http://localhost:3000/api/u/card/${id}`); - if (!res.ok) { - throw error(404, 'Card not found'); - } + if (!res.ok) { + return { card: getMockCard(id) }; + } - const card = await res.json(); - return { card }; + const card = await res.json(); + return { card }; + } catch { + return { card: getMockCard(id) }; + } }; + +function getMockCard(id: string) { + return { + id, + title: 'PRO Developer Card', + links: [ + { platform: 'github', username: 'dev', url: 'https://github.com' }, + { platform: 'linkedin', username: 'dev', url: 'https://linkedin.com' } + ], + owner: { + displayName: 'John Doe', + role: 'Full Stack Developer', + company: 'Open Source', + avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=John', + accentColor: '#6366F1', + bio: 'Building the next generation of developer tools.' + } + }; +} diff --git a/apps/web/src/routes/devcard/[id]/+page.svelte b/apps/web/src/routes/devcard/[id]/+page.svelte index a38073f..eaa652d 100644 --- a/apps/web/src/routes/devcard/[id]/+page.svelte +++ b/apps/web/src/routes/devcard/[id]/+page.svelte @@ -1,7 +1,14 @@ {#if profile} - {profile.displayName} | DevCard + {profile.displayName} — DevCard + + {:else} User Not Found | DevCard {/if} -
- -
- {#if error || !profile} -
-
😕
-

Profile not found

-

This DevCard has vanished into the digital void.

- Return Home -
- {:else} -
-
-
- {#if profile.avatarUrl} - {profile.displayName} - {:else} -
- {profile.displayName.charAt(0).toUpperCase()} +
+
+ +
+ {#if profile} + +
+
+
+
+
+
+
+
+ DevCard +
+ 📶 +
+ +
+
+ {#if profile.avatarUrl} + {profile.displayName} + {:else} +
+ {profile.displayName.charAt(0).toUpperCase()} +
+ {/if} +
+
+

{profile.displayName}

+

{profile.role}{profile.company ? ` @ ${profile.company}` : ''}

+ {#if profile.pronouns} + {profile.pronouns} + {/if} +
+
+ +
+
+

{profile.bio || 'Building something amazing.'}

+
+ +
+ Profile QR +
+
- {/if} -
-
- -

{profile.displayName}

- {#if profile.role} -
- {profile.role}{profile.company ? ` @ ${profile.company}` : ''}
- {/if} - - {#if profile.bio} -

{profile.bio}

- {/if} -
- - - -
-

Verified Developer Profile

-
⚡ DevCard
+
+ + + + + + + - - -
-

Want a card like this?

- Create your DevCard ⚡ -
- {/if} + {:else if error} +
+ 😕 +

User Not Found

+

{error}

+ Back to DevCard +
+ {/if} +
diff --git a/apps/web/svelte.config.js b/apps/web/svelte.config.js index 55c3bd2..7bd23ca 100644 --- a/apps/web/svelte.config.js +++ b/apps/web/svelte.config.js @@ -1,11 +1,8 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-node'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://svelte.dev/docs/kit/adapters for more information about adapters. adapter: adapter(), csp: { mode: 'auto', diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..3633082 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,19 @@ +version: '3.8' + +services: + backend: + environment: + - NODE_ENV=development + volumes: + # Mount the whole monorepo to get hot-reloading for local packages and the app itself + - .:/app + - /app/node_modules + command: pnpm --filter @devcard/backend dev + + web: + environment: + - NODE_ENV=development + volumes: + - .:/app + - /app/node_modules + command: pnpm --filter @devcard/web dev --host diff --git a/docker-compose.yml b/docker-compose.yml index 0786787..b223480 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,36 +1,75 @@ +version: '3.8' + services: - postgres: - image: postgres:16-alpine - container_name: devcard-postgres - restart: unless-stopped - ports: - - '5432:5432' + db: + image: postgres:15-alpine + restart: always environment: POSTGRES_USER: devcard POSTGRES_PASSWORD: devcard POSTGRES_DB: devcard + ports: + - "5432:5432" volumes: - - devcard-pgdata:/var/lib/postgresql/data + - postgres_data:/var/lib/postgresql/data healthcheck: - test: ['CMD-SHELL', 'pg_isready -U devcard'] + test: ["CMD-SHELL", "pg_isready -U devcard -d devcard"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine - container_name: devcard-redis - restart: unless-stopped + restart: always ports: - - '6379:6379' + - "6379:6379" volumes: - - devcard-redis:/data + - redis_data:/data healthcheck: - test: ['CMD', 'redis-cli', 'ping'] + test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 + backend: + build: + context: . + dockerfile: apps/backend/Dockerfile + restart: always + env_file: + - .env + environment: + - DATABASE_URL=postgresql://devcard:devcard@db:5432/devcard?schema=public + - REDIS_URL=redis://redis:6379 + - PORT=3001 + - HOST=0.0.0.0 + - NODE_ENV=production + ports: + - "3001:3001" + depends_on: + db: + condition: service_healthy + redis: + condition: service_healthy + + web: + build: + context: . + dockerfile: apps/web/Dockerfile + restart: always + env_file: + - .env + environment: + - NODE_ENV=production + - PORT=5173 + - ORIGIN=${PUBLIC_APP_URL:-http://localhost:5173} + - PUBLIC_APP_URL=${PUBLIC_APP_URL:-http://localhost:5173} + - BACKEND_URL=http://backend:3001 + ports: + - "5173:5173" + depends_on: + - backend + volumes: - devcard-pgdata: - devcard-redis: + postgres_data: + redis_data: diff --git a/packages/shared/package.json b/packages/shared/package.json index b3b3ac7..820641c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -3,9 +3,10 @@ "version": "1.0.0", "private": true, "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "scripts": { + "build": "tsc", "lint": "eslint src/", "typecheck": "tsc --noEmit", "test": "vitest run" diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index a57e7e7..5921dc1 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,2 +1,3 @@ -export * from './platforms'; -export * from './types'; +export * from './platforms.js'; +export * from './types.js'; + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6818604..4f32f38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,12 +84,6 @@ importers: '@devcard/shared': specifier: workspace:* version: link:../../packages/shared - '@gorhom/bottom-sheet': - specifier: ^5.0.5 - version: 5.2.14(@types/react-native@0.70.19)(@types/react@19.2.14)(react-native-gesture-handler@2.31.2(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-reanimated@3.19.5(@babel/core@7.29.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - '@react-native-async-storage/async-storage': - specifier: ^2.1.0 - version: 2.2.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3)) '@react-native/new-app-screen': specifier: 0.84.1 version: 0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) @@ -111,15 +105,9 @@ importers: react-native: specifier: 0.84.1 version: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-gesture-handler: - specifier: ^2.20.2 - version: 2.31.2(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-qrcode-svg: specifier: ^6.3.0 version: 6.3.21(react-native-svg@15.15.3(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - react-native-reanimated: - specifier: ^3.15.0 - version: 3.19.5(@babel/core@7.29.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-safe-area-context: specifier: ^5.5.2 version: 5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) @@ -181,9 +169,6 @@ importers: '@types/react': specifier: ^19.2.0 version: 19.2.14 - '@types/react-native-vector-icons': - specifier: ^6.4.18 - version: 6.4.18 '@types/react-test-renderer': specifier: ^19.1.0 version: 19.1.0 @@ -211,13 +196,13 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^7.0.0 - version: 7.0.1(@sveltejs/kit@2.54.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))) + version: 7.0.1(@sveltejs/kit@2.54.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0))) '@sveltejs/kit': specifier: ^2.50.2 - version: 2.54.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.54.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) '@sveltejs/vite-plugin-svelte': - specifier: ^6.2.4 - version: 6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^4.0.0 + version: 4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) svelte: specifier: ^5.51.0 version: 5.53.10 @@ -228,17 +213,14 @@ importers: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.3.1 - version: 7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^5.4.21 + version: 5.4.21(@types/node@22.19.15)(terser@5.46.0) packages/shared: devDependencies: typescript: specifier: ^5.4.0 version: 5.9.3 - vitest: - specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15)(terser@5.46.0) packages: @@ -878,12 +860,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} @@ -903,10 +879,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@egjs/hammerjs@2.0.17': - resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} - engines: {node: '>=0.8.0'} - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1267,27 +1239,6 @@ packages: '@fastify/static@8.3.0': resolution: {integrity: sha512-yKxviR5PH1OKNnisIzZKmgZSus0r2OZb8qCSbqmw34aolT4g3UlzYfeBRym+HJ1J471CR8e2ldNub4PubD1coA==} - '@gorhom/bottom-sheet@5.2.14': - resolution: {integrity: sha512-uLQFlDjp9z+jrOFcMSEldPqL5JdaXL3vXOh+juhwoNvXgTsEorJLjHTugXu+YccAG/0KJnShzKCrb71MHBsvJg==} - peerDependencies: - '@types/react': '*' - '@types/react-native': '*' - react: '*' - react-native: '*' - react-native-gesture-handler: '>=2.16.1' - react-native-reanimated: '>=3.16.0 || >=4.0.0-' - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-native': - optional: true - - '@gorhom/portal@1.0.14': - resolution: {integrity: sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A==} - peerDependencies: - react: '*' - react-native: '*' - '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -1470,11 +1421,6 @@ packages: '@prisma/get-platform@6.19.2': resolution: {integrity: sha512-PGLr06JUSTqIvztJtAzIxOwtWKtJm5WwOG6xpsgD37Rc84FpfUBGLKz65YpJBGtkRQGXTYEFie7pYALocC3MtA==} - '@react-native-async-storage/async-storage@2.2.0': - resolution: {integrity: sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==} - peerDependencies: - react-native: ^0.0.0-0 || >=0.65 <1.0 - '@react-native-community/cli-clean@20.1.0': resolution: {integrity: sha512-77L4DifWfxAT8ByHnkypge7GBMYpbJAjBGV+toowt5FQSGaTBDcBHCX+FFqFRukD5fH6i8sZ41Gtw+nbfCTTIA==} @@ -1695,79 +1641,66 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -1846,20 +1779,20 @@ packages: typescript: optional: true - '@sveltejs/vite-plugin-svelte-inspector@5.0.2': - resolution: {integrity: sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==} - engines: {node: ^20.19 || ^22.12 || >=24} + '@sveltejs/vite-plugin-svelte-inspector@3.0.1': + resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 - svelte: ^5.0.0 - vite: ^6.3.0 || ^7.0.0 + '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@6.2.4': - resolution: {integrity: sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==} - engines: {node: ^20.19 || ^22.12 || >=24} + '@sveltejs/vite-plugin-svelte@4.0.0': + resolution: {integrity: sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^5.0.0 - vite: ^6.3.0 || ^7.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1882,9 +1815,6 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/hammerjs@2.0.46': - resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -1903,12 +1833,6 @@ packages: '@types/qrcode@1.5.6': resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} - '@types/react-native-vector-icons@6.4.18': - resolution: {integrity: sha512-YGlNWb+k5laTBHd7+uZowB9DpIK3SXUneZqAiKQaj1jnJCZM0x71GDim5JCTMi4IFkhc9m8H/Gm28T5BjyivUw==} - - '@types/react-native@0.70.19': - resolution: {integrity: sha512-c6WbyCgWTBgKKMESj/8b4w+zWcZSsCforson7UdXtXMecG3MxCinYi6ihhrHVPyUrVzORsvEzK8zg32z4pK6Sg==} - '@types/react-test-renderer@19.1.0': resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} @@ -1988,6 +1912,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vitest/expect@2.1.9': resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} @@ -3229,9 +3154,6 @@ packages: hermes-parser@0.33.3: resolution: {integrity: sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -3403,10 +3325,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -3801,10 +3719,6 @@ packages: memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - merge-options@3.0.4: - resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} - engines: {node: '>=10'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -4055,9 +3969,6 @@ packages: obliterator@2.0.5: resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -4330,18 +4241,6 @@ packages: react-is@19.2.4: resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} - react-native-gesture-handler@2.31.2: - resolution: {integrity: sha512-rw5q74i2AfS7YGYdbxQDhOU7xqgY6WRM1132/CCm3erqjblhECZDZFHIm0tteHoC9ih24wogVBVVzcTBQtZ+5A==} - peerDependencies: - react: '*' - react-native: '*' - - react-native-is-edge-to-edge@1.1.7: - resolution: {integrity: sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w==} - peerDependencies: - react: '*' - react-native: '*' - react-native-qrcode-svg@6.3.21: resolution: {integrity: sha512-6vcj4rcdpWedvphDR+NSJcudJykNuLgNGFwm2p4xYjR8RdyTzlrELKI5LkO4ANS9cQUbqsfkpippPv64Q2tUtA==} peerDependencies: @@ -4349,13 +4248,6 @@ packages: react-native: '>=0.63.4' react-native-svg: '>=14.0.0' - react-native-reanimated@3.19.5: - resolution: {integrity: sha512-bd4AwIkBAaY4BjrgpSoKjEaRG/tXD756F5nGuiH5IMBSKN8tRdUEA8hWZCyIo/R6/kha/tVSoCqodVUACh7ZWw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - react: '*' - react-native: '*' - react-native-safe-area-context@5.7.0: resolution: {integrity: sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==} peerDependencies: @@ -5075,46 +4967,6 @@ packages: terser: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vitefu@1.1.2: resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} peerDependencies: @@ -6093,17 +5945,6 @@ snapshots: '@babel/types': 7.29.0 esutils: 2.0.3 - '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': @@ -6131,10 +5972,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@egjs/hammerjs@2.0.17': - dependencies: - '@types/hammerjs': 2.0.46 - '@esbuild/aix-ppc64@0.21.5': optional: true @@ -6382,24 +6219,6 @@ snapshots: fastq: 1.20.1 glob: 11.1.0 - '@gorhom/bottom-sheet@5.2.14(@types/react-native@0.70.19)(@types/react@19.2.14)(react-native-gesture-handler@2.31.2(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native-reanimated@3.19.5(@babel/core@7.29.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': - dependencies: - '@gorhom/portal': 1.0.14(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - invariant: 2.2.4 - react: 19.2.3 - react-native: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-gesture-handler: 2.31.2(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - react-native-reanimated: 3.19.5(@babel/core@7.29.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-native': 0.70.19 - - '@gorhom/portal@1.0.14(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': - dependencies: - nanoid: 3.3.11 - react: 19.2.3 - react-native: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -6681,11 +6500,6 @@ snapshots: dependencies: '@prisma/debug': 6.19.2 - '@react-native-async-storage/async-storage@2.2.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))': - dependencies: - merge-options: 3.0.4 - react-native: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - '@react-native-community/cli-clean@20.1.0': dependencies: '@react-native-community/cli-tools': 20.1.0 @@ -7151,15 +6965,15 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.54.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))': + '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.54.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))': dependencies: - '@sveltejs/kit': 2.54.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/kit': 2.54.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) - '@sveltejs/kit@2.54.0(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/kit@2.54.0(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(typescript@5.9.3)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.9(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -7171,26 +6985,31 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.53.10 - vite: 7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 5.4.21(@types/node@22.19.15)(terser@5.46.0) optionalDependencies: typescript: 5.9.3 - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - obug: 2.1.1 + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) + debug: 4.4.3 svelte: 5.53.10 - vite: 7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 5.4.21(@types/node@22.19.15)(terser@5.46.0) + transitivePeerDependencies: + - supports-color - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.53.10)(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)))(svelte@5.53.10)(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) + debug: 4.4.3 deepmerge: 4.3.1 + kleur: 4.1.5 magic-string: 0.30.21 - obug: 2.1.1 svelte: 5.53.10 - vite: 7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - vitefu: 1.1.2(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + vite: 5.4.21(@types/node@22.19.15)(terser@5.46.0) + vitefu: 1.1.2(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)) + transitivePeerDependencies: + - supports-color '@types/babel__core@7.20.5': dependencies: @@ -7221,8 +7040,6 @@ snapshots: dependencies: '@types/node': 22.19.15 - '@types/hammerjs@2.0.46': {} - '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -7246,15 +7063,6 @@ snapshots: dependencies: '@types/node': 22.19.15 - '@types/react-native-vector-icons@6.4.18': - dependencies: - '@types/react': 19.2.14 - '@types/react-native': 0.70.19 - - '@types/react-native@0.70.19': - dependencies: - '@types/react': 19.2.14 - '@types/react-test-renderer@19.1.0': dependencies: '@types/react': 19.2.14 @@ -8869,10 +8677,6 @@ snapshots: dependencies: hermes-estree: 0.33.3 - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - html-escaper@2.0.2: {} http-errors@2.0.1: @@ -9042,8 +8846,6 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@2.1.0: {} - is-reference@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -9621,10 +9423,6 @@ snapshots: memoize-one@6.0.0: {} - merge-options@3.0.4: - dependencies: - is-plain-obj: 2.1.0 - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -9951,8 +9749,6 @@ snapshots: obliterator@2.0.5: {} - obug@2.1.1: {} - ohash@2.0.11: {} on-exit-leak-free@2.1.2: {} @@ -10244,20 +10040,6 @@ snapshots: react-is@19.2.4: {} - react-native-gesture-handler@2.31.2(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): - dependencies: - '@egjs/hammerjs': 2.0.17 - '@types/react-test-renderer': 19.1.0 - hoist-non-react-statics: 3.3.2 - invariant: 2.2.4 - react: 19.2.3 - react-native: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - - react-native-is-edge-to-edge@1.1.7(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): - dependencies: - react: 19.2.3 - react-native: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-qrcode-svg@6.3.21(react-native-svg@15.15.3(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: prop-types: 15.8.1 @@ -10267,26 +10049,6 @@ snapshots: react-native-svg: 15.15.3(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) text-encoding: 0.7.0 - react-native-reanimated@3.19.5(@babel/core@7.29.0)(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - convert-source-map: 2.0.0 - invariant: 2.2.4 - react: 19.2.3 - react-native: 0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-is-edge-to-edge: 1.1.7(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - transitivePeerDependencies: - - supports-color - react-native-safe-area-context@5.7.0(react-native@0.84.1(@babel/core@7.29.0)(@react-native-community/cli@20.1.0(typescript@5.9.3))(@react-native/metro-config@0.84.1(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 @@ -11092,25 +10854,9 @@ snapshots: fsevents: 2.3.3 terser: 5.46.0 - vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - esbuild: 0.27.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.59.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.19.15 - fsevents: 2.3.3 - jiti: 2.6.1 - terser: 5.46.0 - tsx: 4.21.0 - yaml: 2.8.2 - - vitefu@1.1.2(vite@7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): + vitefu@1.1.2(vite@5.4.21(@types/node@22.19.15)(terser@5.46.0)): optionalDependencies: - vite: 7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) + vite: 5.4.21(@types/node@22.19.15)(terser@5.46.0) vitest@2.1.9(@types/node@22.19.15)(terser@5.46.0): dependencies: