From 1cffc6de8145c8e9d2695a1fe0110d735aef88c6 Mon Sep 17 00:00:00 2001 From: Chr1st1anG <73988455+Chr1st1anG@users.noreply.github.com> Date: Tue, 10 Feb 2026 20:53:54 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(figgos):=20scaffold=20backend?= =?UTF-8?q?=20+=20mobile=20app?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add new Figgos project under apps/figgos/ with: - NestJS backend (port 3025) with Drizzle ORM, health check, metrics - Expo React Native mobile app with Mana Core Auth, tab navigation - Shared types package (@figgos/shared) - Root integration: env generation, dev:figgos:full script, MinIO bucket Co-Authored-By: Claude Opus 4.6 --- .env.development | 7 + apps/figgos/CLAUDE.md | 68 ++ apps/figgos/apps/backend/drizzle.config.ts | 6 + apps/figgos/apps/backend/nest-cli.json | 10 + apps/figgos/apps/backend/package.json | 52 ++ apps/figgos/apps/backend/src/app.module.ts | 21 + apps/figgos/apps/backend/src/db/connection.ts | 38 + .../apps/backend/src/db/database.module.ts | 29 + .../apps/backend/src/db/schema/index.ts | 3 + apps/figgos/apps/backend/src/main.ts | 8 + apps/figgos/apps/backend/tsconfig.json | 27 + apps/figgos/apps/mobile/.gitignore | 14 + apps/figgos/apps/mobile/app-env.d.ts | 1 + apps/figgos/apps/mobile/app.json | 51 ++ .../figgos/apps/mobile/app/(auth)/_layout.tsx | 9 + apps/figgos/apps/mobile/app/(auth)/login.tsx | 79 ++ .../figgos/apps/mobile/app/(tabs)/_layout.tsx | 49 ++ apps/figgos/apps/mobile/app/(tabs)/create.tsx | 15 + apps/figgos/apps/mobile/app/(tabs)/index.tsx | 17 + apps/figgos/apps/mobile/app/(tabs)/shelf.tsx | 17 + apps/figgos/apps/mobile/app/+not-found.tsx | 18 + apps/figgos/apps/mobile/app/_layout.tsx | 47 ++ apps/figgos/apps/mobile/babel.config.js | 12 + .../apps/mobile/contexts/AuthContext.tsx | 216 ++++++ apps/figgos/apps/mobile/eas.json | 18 + apps/figgos/apps/mobile/global.css | 3 + apps/figgos/apps/mobile/metro.config.js | 9 + apps/figgos/apps/mobile/nativewind-env.d.ts | 1 + apps/figgos/apps/mobile/package.json | 60 ++ apps/figgos/apps/mobile/services/api.ts | 26 + apps/figgos/apps/mobile/tailwind.config.js | 32 + apps/figgos/apps/mobile/tsconfig.json | 12 + apps/figgos/package.json | 8 + apps/figgos/packages/shared/package.json | 16 + apps/figgos/packages/shared/src/index.ts | 3 + apps/figgos/packages/shared/tsconfig.json | 15 + docker-compose.dev.yml | 2 + package.json | 1 + pnpm-lock.yaml | 718 +++++++++++++----- scripts/generate-env.mjs | 28 + 40 files changed, 1572 insertions(+), 194 deletions(-) create mode 100644 apps/figgos/CLAUDE.md create mode 100644 apps/figgos/apps/backend/drizzle.config.ts create mode 100644 apps/figgos/apps/backend/nest-cli.json create mode 100644 apps/figgos/apps/backend/package.json create mode 100644 apps/figgos/apps/backend/src/app.module.ts create mode 100644 apps/figgos/apps/backend/src/db/connection.ts create mode 100644 apps/figgos/apps/backend/src/db/database.module.ts create mode 100644 apps/figgos/apps/backend/src/db/schema/index.ts create mode 100644 apps/figgos/apps/backend/src/main.ts create mode 100644 apps/figgos/apps/backend/tsconfig.json create mode 100644 apps/figgos/apps/mobile/.gitignore create mode 100644 apps/figgos/apps/mobile/app-env.d.ts create mode 100644 apps/figgos/apps/mobile/app.json create mode 100644 apps/figgos/apps/mobile/app/(auth)/_layout.tsx create mode 100644 apps/figgos/apps/mobile/app/(auth)/login.tsx create mode 100644 apps/figgos/apps/mobile/app/(tabs)/_layout.tsx create mode 100644 apps/figgos/apps/mobile/app/(tabs)/create.tsx create mode 100644 apps/figgos/apps/mobile/app/(tabs)/index.tsx create mode 100644 apps/figgos/apps/mobile/app/(tabs)/shelf.tsx create mode 100644 apps/figgos/apps/mobile/app/+not-found.tsx create mode 100644 apps/figgos/apps/mobile/app/_layout.tsx create mode 100644 apps/figgos/apps/mobile/babel.config.js create mode 100644 apps/figgos/apps/mobile/contexts/AuthContext.tsx create mode 100644 apps/figgos/apps/mobile/eas.json create mode 100644 apps/figgos/apps/mobile/global.css create mode 100644 apps/figgos/apps/mobile/metro.config.js create mode 100644 apps/figgos/apps/mobile/nativewind-env.d.ts create mode 100644 apps/figgos/apps/mobile/package.json create mode 100644 apps/figgos/apps/mobile/services/api.ts create mode 100644 apps/figgos/apps/mobile/tailwind.config.js create mode 100644 apps/figgos/apps/mobile/tsconfig.json create mode 100644 apps/figgos/package.json create mode 100644 apps/figgos/packages/shared/package.json create mode 100644 apps/figgos/packages/shared/src/index.ts create mode 100644 apps/figgos/packages/shared/tsconfig.json diff --git a/.env.development b/.env.development index 7fa9aa104..f90fea63f 100644 --- a/.env.development +++ b/.env.development @@ -324,6 +324,13 @@ PLANTA_GEMINI_API_KEY=AIzaSyC_-hPWpVttTlqJdU4jbXR5H0OAnRi2LgI SKILLTREE_BACKEND_PORT=3024 SKILLTREE_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/skilltree +# ============================================ +# FIGGOS PROJECT +# ============================================ + +FIGGOS_BACKEND_PORT=3025 +FIGGOS_DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/figgos + # ============================================ # WORLDREAM GAME # ============================================ diff --git a/apps/figgos/CLAUDE.md b/apps/figgos/CLAUDE.md new file mode 100644 index 000000000..b25198128 --- /dev/null +++ b/apps/figgos/CLAUDE.md @@ -0,0 +1,68 @@ +# Figgos + +A collectible figure game where users create and collect AI-generated fantasy figures. + +## Project Structure + +``` +apps/figgos/ +├── apps/ +│ ├── backend/ # @figgos/backend - NestJS API (port 3025) +│ └── mobile/ # @figgos/mobile - Expo React Native app +├── packages/ +│ └── shared/ # @figgos/shared - Shared types & constants +└── package.json +``` + +## Commands + +### From monorepo root + +```bash +pnpm dev:figgos:mobile # Start mobile app +pnpm dev:figgos:backend # Start backend +pnpm dev:figgos:app # Start web + backend together +pnpm dev:figgos:full # Start with auth + auto DB setup + +pnpm figgos:db:push # Push schema to database +pnpm figgos:db:studio # Open Drizzle Studio +``` + +## Technology Stack + +- **Mobile**: React Native 0.76 + Expo SDK 52, NativeWind, Expo Router +- **Backend**: NestJS 10, Drizzle ORM, PostgreSQL +- **Auth**: Mana Core Auth (JWT via @manacore/shared-nestjs-auth) +- **AI**: Google Gemini API (planned) +- **Storage**: MinIO (local) / Hetzner S3 (production) + +## Ports + +| App | Port | +|-----|------| +| Backend | 3025 | +| Web (planned) | 5181 | + +## Environment Variables + +### Backend (.env) + +```env +PORT=3025 +DATABASE_URL=postgresql://manacore:devpassword@localhost:5432/figgos +MANA_CORE_AUTH_URL=http://localhost:3001 +``` + +### Mobile (.env) + +```env +EXPO_PUBLIC_BACKEND_URL=http://localhost:3025 +EXPO_PUBLIC_MANA_CORE_AUTH_URL=http://localhost:3001 +``` + +## Game Concept + +- Users create fantasy figures by providing a name/subject +- AI generates character info (description, lore, items) + image +- Figures have rarities: common, rare, epic, legendary +- Users can browse public figures, like them, and collect their own diff --git a/apps/figgos/apps/backend/drizzle.config.ts b/apps/figgos/apps/backend/drizzle.config.ts new file mode 100644 index 000000000..22c6f71ac --- /dev/null +++ b/apps/figgos/apps/backend/drizzle.config.ts @@ -0,0 +1,6 @@ +import { createDrizzleConfig } from '@manacore/shared-drizzle-config'; + +export default createDrizzleConfig({ + dbName: 'figgos', + additionalEnvVars: ['FIGGOS_DATABASE_URL'], +}); diff --git a/apps/figgos/apps/backend/nest-cli.json b/apps/figgos/apps/backend/nest-cli.json new file mode 100644 index 000000000..b4a4fa09c --- /dev/null +++ b/apps/figgos/apps/backend/nest-cli.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": false, + "assets": [], + "watchAssets": false + } +} diff --git a/apps/figgos/apps/backend/package.json b/apps/figgos/apps/backend/package.json new file mode 100644 index 000000000..8dabcd4e5 --- /dev/null +++ b/apps/figgos/apps/backend/package.json @@ -0,0 +1,52 @@ +{ + "name": "@figgos/backend", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "nest build", + "start": "nest start", + "dev": "nest start --watch", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "type-check": "tsc --noEmit", + "migration:generate": "drizzle-kit generate", + "migration:run": "tsx src/db/migrate.ts", + "db:push": "drizzle-kit push", + "db:studio": "drizzle-kit studio" + }, + "dependencies": { + "@figgos/shared": "workspace:*", + "@manacore/shared-drizzle-config": "workspace:*", + "@manacore/shared-nestjs-auth": "workspace:*", + "@manacore/shared-nestjs-health": "workspace:*", + "@manacore/shared-nestjs-metrics": "workspace:*", + "@manacore/shared-nestjs-setup": "workspace:*", + "@nestjs/common": "^10.4.15", + "@nestjs/config": "^3.3.0", + "@nestjs/core": "^10.4.15", + "@nestjs/platform-express": "^10.4.15", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "dotenv": "^16.4.7", + "drizzle-kit": "^0.30.2", + "drizzle-orm": "^0.38.3", + "postgres": "^3.4.5", + "prom-client": "^15.1.0", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@nestjs/cli": "^10.4.9", + "@nestjs/schematics": "^10.2.3", + "@types/express": "^5.0.0", + "@types/node": "^22.10.2", + "source-map-support": "^0.5.21", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "tsx": "^4.19.2", + "typescript": "^5.7.2" + } +} diff --git a/apps/figgos/apps/backend/src/app.module.ts b/apps/figgos/apps/backend/src/app.module.ts new file mode 100644 index 000000000..e8a510275 --- /dev/null +++ b/apps/figgos/apps/backend/src/app.module.ts @@ -0,0 +1,21 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { MetricsModule } from '@manacore/shared-nestjs-metrics'; +import { HealthModule } from '@manacore/shared-nestjs-health'; +import { DatabaseModule } from './db/database.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + envFilePath: '.env', + }), + MetricsModule.register({ + prefix: 'figgos_', + excludePaths: ['/health'], + }), + DatabaseModule, + HealthModule.forRoot({ serviceName: 'figgos-backend' }), + ], +}) +export class AppModule {} diff --git a/apps/figgos/apps/backend/src/db/connection.ts b/apps/figgos/apps/backend/src/db/connection.ts new file mode 100644 index 000000000..fccc63f4a --- /dev/null +++ b/apps/figgos/apps/backend/src/db/connection.ts @@ -0,0 +1,38 @@ +import { drizzle } from 'drizzle-orm/postgres-js'; +import * as schema from './schema'; + +// Use require for postgres to avoid ESM/CommonJS interop issues +// eslint-disable-next-line @typescript-eslint/no-var-requires +const postgres = require('postgres'); + +let connection: ReturnType | null = null; +let db: ReturnType | null = null; + +export function getConnection(databaseUrl: string) { + if (!connection) { + connection = postgres(databaseUrl, { + max: 10, + idle_timeout: 20, + connect_timeout: 10, + }); + } + return connection; +} + +export function getDb(databaseUrl: string) { + if (!db) { + const conn = getConnection(databaseUrl); + db = drizzle(conn, { schema }); + } + return db; +} + +export async function closeConnection() { + if (connection) { + await connection.end(); + connection = null; + db = null; + } +} + +export type Database = ReturnType; diff --git a/apps/figgos/apps/backend/src/db/database.module.ts b/apps/figgos/apps/backend/src/db/database.module.ts new file mode 100644 index 000000000..5a0a033b3 --- /dev/null +++ b/apps/figgos/apps/backend/src/db/database.module.ts @@ -0,0 +1,29 @@ +import { Module, Global, OnModuleDestroy } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { getDb, closeConnection } from './connection'; +import type { Database } from './connection'; + +export const DATABASE_CONNECTION = 'DATABASE_CONNECTION'; + +@Global() +@Module({ + providers: [ + { + provide: DATABASE_CONNECTION, + useFactory: (configService: ConfigService): Database => { + const databaseUrl = configService.get('DATABASE_URL'); + if (!databaseUrl) { + throw new Error('DATABASE_URL environment variable is not set'); + } + return getDb(databaseUrl); + }, + inject: [ConfigService], + }, + ], + exports: [DATABASE_CONNECTION], +}) +export class DatabaseModule implements OnModuleDestroy { + async onModuleDestroy() { + await closeConnection(); + } +} diff --git a/apps/figgos/apps/backend/src/db/schema/index.ts b/apps/figgos/apps/backend/src/db/schema/index.ts new file mode 100644 index 000000000..d46417967 --- /dev/null +++ b/apps/figgos/apps/backend/src/db/schema/index.ts @@ -0,0 +1,3 @@ +// Database schema exports +// Will be populated as features are added +export {}; diff --git a/apps/figgos/apps/backend/src/main.ts b/apps/figgos/apps/backend/src/main.ts new file mode 100644 index 000000000..6ef4d049f --- /dev/null +++ b/apps/figgos/apps/backend/src/main.ts @@ -0,0 +1,8 @@ +import { bootstrapApp } from '@manacore/shared-nestjs-setup'; +import { AppModule } from './app.module'; + +bootstrapApp(AppModule, { + defaultPort: 3025, + serviceName: 'Figgos', + additionalCorsOrigins: ['http://localhost:5181'], +}); diff --git a/apps/figgos/apps/backend/tsconfig.json b/apps/figgos/apps/backend/tsconfig.json new file mode 100644 index 000000000..27971033a --- /dev/null +++ b/apps/figgos/apps/backend/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2021", + "module": "commonjs", + "moduleResolution": "node", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "outDir": "./dist", + "baseUrl": "./", + "rootDir": "./src", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "sourceMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/apps/figgos/apps/mobile/.gitignore b/apps/figgos/apps/mobile/.gitignore new file mode 100644 index 000000000..28d48f7ba --- /dev/null +++ b/apps/figgos/apps/mobile/.gitignore @@ -0,0 +1,14 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ +ios/ +android/ +.env diff --git a/apps/figgos/apps/mobile/app-env.d.ts b/apps/figgos/apps/mobile/app-env.d.ts new file mode 100644 index 000000000..e6394b247 --- /dev/null +++ b/apps/figgos/apps/mobile/app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/figgos/apps/mobile/app.json b/apps/figgos/apps/mobile/app.json new file mode 100644 index 000000000..4877bdf51 --- /dev/null +++ b/apps/figgos/apps/mobile/app.json @@ -0,0 +1,51 @@ +{ + "expo": { + "name": "Figgos", + "slug": "figgos", + "version": "1.0.0", + "scheme": "figgos", + "web": { + "bundler": "metro", + "output": "server", + "favicon": "./assets/favicon.png" + }, + "plugins": [ + "expo-router", + [ + "expo-dev-launcher", + { + "launchMode": "most-recent" + } + ] + ], + "experiments": { + "typedRoutes": true, + "tsconfigPaths": true + }, + "orientation": "portrait", + "icon": "./assets/icon.png", + "userInterfaceStyle": "light", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "assetBundlePatterns": ["**/*"], + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.tilljs.figgos" + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#ffffff" + }, + "package": "com.tilljs.figgos" + }, + "extra": { + "router": { + "origin": false + } + } + } +} diff --git a/apps/figgos/apps/mobile/app/(auth)/_layout.tsx b/apps/figgos/apps/mobile/app/(auth)/_layout.tsx new file mode 100644 index 000000000..819279f22 --- /dev/null +++ b/apps/figgos/apps/mobile/app/(auth)/_layout.tsx @@ -0,0 +1,9 @@ +import { Stack } from 'expo-router'; + +export default function AuthLayout() { + return ( + + + + ); +} diff --git a/apps/figgos/apps/mobile/app/(auth)/login.tsx b/apps/figgos/apps/mobile/app/(auth)/login.tsx new file mode 100644 index 000000000..d87537a2f --- /dev/null +++ b/apps/figgos/apps/mobile/app/(auth)/login.tsx @@ -0,0 +1,79 @@ +import { useState } from 'react'; +import { View, Text, TextInput, Pressable, KeyboardAvoidingView, Platform } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { useAuth } from '~/contexts/AuthContext'; + +export default function LoginScreen() { + const { signIn } = useAuth(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + + const handleLogin = async () => { + if (!email || !password) { + setError('Please enter email and password'); + return; + } + + setLoading(true); + setError(null); + + const result = await signIn(email, password); + + if (result.error) { + setError(result.error.message || 'Login failed'); + } + + setLoading(false); + }; + + return ( + + + + Figgos + Collect your fantasy figures + + + + + + + + {error && {error}} + + + `bg-primary rounded-lg py-3 mt-4 ${pressed ? 'opacity-80' : ''} ${loading ? 'opacity-50' : ''}` + } + > + + {loading ? 'Signing in...' : 'Sign In'} + + + + + + ); +} diff --git a/apps/figgos/apps/mobile/app/(tabs)/_layout.tsx b/apps/figgos/apps/mobile/app/(tabs)/_layout.tsx new file mode 100644 index 000000000..9631d2027 --- /dev/null +++ b/apps/figgos/apps/mobile/app/(tabs)/_layout.tsx @@ -0,0 +1,49 @@ +import { Tabs } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; + +export default function TabLayout() { + return ( + + ( + + ), + }} + /> + ( + + ), + }} + /> + ( + + ), + }} + /> + + ); +} diff --git a/apps/figgos/apps/mobile/app/(tabs)/create.tsx b/apps/figgos/apps/mobile/app/(tabs)/create.tsx new file mode 100644 index 000000000..da865a586 --- /dev/null +++ b/apps/figgos/apps/mobile/app/(tabs)/create.tsx @@ -0,0 +1,15 @@ +import { View, Text } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +export default function CreateScreen() { + return ( + + + Create + + Generate your own AI-powered fantasy figures. + + + + ); +} diff --git a/apps/figgos/apps/mobile/app/(tabs)/index.tsx b/apps/figgos/apps/mobile/app/(tabs)/index.tsx new file mode 100644 index 000000000..f2c4df074 --- /dev/null +++ b/apps/figgos/apps/mobile/app/(tabs)/index.tsx @@ -0,0 +1,17 @@ +import { View, Text } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +export default function CommunityScreen() { + return ( + + + + Community + + + Public figures from the community will appear here. + + + + ); +} diff --git a/apps/figgos/apps/mobile/app/(tabs)/shelf.tsx b/apps/figgos/apps/mobile/app/(tabs)/shelf.tsx new file mode 100644 index 000000000..c7ead4e17 --- /dev/null +++ b/apps/figgos/apps/mobile/app/(tabs)/shelf.tsx @@ -0,0 +1,17 @@ +import { View, Text } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; + +export default function ShelfScreen() { + return ( + + + + My Collection + + + Your collected figures will appear here. + + + + ); +} diff --git a/apps/figgos/apps/mobile/app/+not-found.tsx b/apps/figgos/apps/mobile/app/+not-found.tsx new file mode 100644 index 000000000..71d5a30d4 --- /dev/null +++ b/apps/figgos/apps/mobile/app/+not-found.tsx @@ -0,0 +1,18 @@ +import { View, Text } from 'react-native'; +import { Link, Stack } from 'expo-router'; + +export default function NotFoundScreen() { + return ( + <> + + + + Page not found + + + Go to home + + + + ); +} diff --git a/apps/figgos/apps/mobile/app/_layout.tsx b/apps/figgos/apps/mobile/app/_layout.tsx new file mode 100644 index 000000000..3628ea727 --- /dev/null +++ b/apps/figgos/apps/mobile/app/_layout.tsx @@ -0,0 +1,47 @@ +import '../global.css'; + +import { Stack, useRouter, useSegments } from 'expo-router'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; +import { AuthProvider, useAuth } from '~/contexts/AuthContext'; +import { useEffect } from 'react'; + +function AuthGuard({ children }: { children: React.ReactNode }) { + const { user, loading } = useAuth(); + const segments = useSegments(); + const router = useRouter(); + + useEffect(() => { + if (loading) return; + + const inAuthGroup = segments[0] === '(auth)'; + + if (!user && !inAuthGroup) { + router.replace('/(auth)/login'); + } else if (user && inAuthGroup) { + router.replace('/(tabs)'); + } + }, [user, loading, segments]); + + return <>{children}; +} + +function Layout() { + return ( + + + + + + + ); +} + +export default function RootLayout() { + return ( + + + + + + ); +} diff --git a/apps/figgos/apps/mobile/babel.config.js b/apps/figgos/apps/mobile/babel.config.js new file mode 100644 index 000000000..6c7595b58 --- /dev/null +++ b/apps/figgos/apps/mobile/babel.config.js @@ -0,0 +1,12 @@ +module.exports = function (api) { + api.cache(true); + const plugins = []; + + plugins.push('react-native-reanimated/plugin'); + + return { + presets: [['babel-preset-expo', { jsxImportSource: 'nativewind' }], 'nativewind/babel'], + + plugins, + }; +}; diff --git a/apps/figgos/apps/mobile/contexts/AuthContext.tsx b/apps/figgos/apps/mobile/contexts/AuthContext.tsx new file mode 100644 index 000000000..48a6b262a --- /dev/null +++ b/apps/figgos/apps/mobile/contexts/AuthContext.tsx @@ -0,0 +1,216 @@ +import React, { createContext, useContext, useEffect, useState } from 'react'; +import { ActivityIndicator, View, Text } from 'react-native'; +import * as SecureStore from 'expo-secure-store'; +import { + createAuthService, + createTokenManager, + setStorageAdapter, + setDeviceAdapter, + setNetworkAdapter, + type UserData, +} from '@manacore/shared-auth'; + +// Mana Core Auth URL from environment +const MANA_AUTH_URL = process.env.EXPO_PUBLIC_MANA_CORE_AUTH_URL || 'http://localhost:3001'; + +// Create SecureStore adapter for React Native +const createSecureStoreAdapter = () => ({ + async getItem(key: string): Promise { + try { + const value = await SecureStore.getItemAsync(key); + return value ? JSON.parse(value) : null; + } catch { + return null; + } + }, + async setItem(key: string, value: unknown): Promise { + await SecureStore.setItemAsync(key, JSON.stringify(value)); + }, + async removeItem(key: string): Promise { + await SecureStore.deleteItemAsync(key); + }, +}); + +// Create device adapter for React Native +const createReactNativeDeviceAdapter = () => { + let deviceId: string | null = null; + + return { + async getDeviceInfo() { + if (!deviceId) { + deviceId = await SecureStore.getItemAsync('@device/id'); + + if (!deviceId) { + deviceId = `rn-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + await SecureStore.setItemAsync('@device/id', deviceId); + } + } + + return { + deviceId, + deviceName: 'React Native Device', + deviceType: 'mobile', + platform: 'react-native', + }; + }, + async getStoredDeviceId() { + return deviceId || (await SecureStore.getItemAsync('@device/id')); + }, + }; +}; + +// Create network adapter +const createReactNativeNetworkAdapter = () => ({ + async isDeviceConnected() { + return true; + }, + async hasStableConnection() { + return true; + }, +}); + +// Initialize adapters +setStorageAdapter(createSecureStoreAdapter()); +setDeviceAdapter(createReactNativeDeviceAdapter()); +setNetworkAdapter(createReactNativeNetworkAdapter()); + +// Create auth service +const authService = createAuthService({ baseUrl: MANA_AUTH_URL }); +const tokenManager = createTokenManager(authService); + +// Export for use in API client +export { authService, tokenManager }; + +// Auth context type +type AuthContextType = { + user: UserData | null; + loading: boolean; + signIn: (email: string, password: string) => Promise<{ error: any | null }>; + signUp: ( + email: string, + password: string, + username?: string + ) => Promise<{ error: any | null; data: any | null }>; + signOut: () => Promise; +}; + +// Create auth context +const AuthContext = createContext(undefined); + +// Hook to access auth context +export const useAuth = () => { + const context = useContext(AuthContext); + if (context === undefined) { + return { + user: null, + loading: true, + signIn: async () => ({ error: null }), + signUp: async () => ({ error: null, data: null }), + signOut: async () => {}, + }; + } + return context; +}; + +// AuthProvider component +export function AuthProvider({ children }: { children: React.ReactNode }) { + const [user, setUser] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const initialize = async () => { + try { + setLoading(true); + const authenticated = await authService.isAuthenticated(); + + if (authenticated) { + const userData = await authService.getUserFromToken(); + setUser(userData); + } + } catch (error) { + console.error('Error initializing auth session:', error); + setUser(null); + } finally { + setLoading(false); + } + }; + + initialize(); + }, []); + + const signIn = async (email: string, password: string) => { + try { + const result = await authService.signIn(email, password); + + if (!result.success) { + return { error: { message: result.error } }; + } + + const userData = await authService.getUserFromToken(); + setUser(userData); + return { error: null }; + } catch (error: any) { + return { error }; + } + }; + + const signUp = async (email: string, password: string, _username?: string) => { + try { + const result = await authService.signUp(email, password); + + if (!result.success) { + return { data: null, error: { message: result.error } }; + } + + const signInResult = await signIn(email, password); + + if (signInResult.error) { + return { data: null, error: signInResult.error }; + } + + return { data: user, error: null }; + } catch (error) { + return { data: null, error }; + } + }; + + const signOut = async () => { + try { + const timeout = new Promise((_, reject) => + setTimeout(() => reject(new Error('Sign out timeout after 5s')), 5000) + ); + + try { + await Promise.race([authService.signOut(), timeout]); + } catch { + // Force local logout on failure + } + + setUser(null); + } catch { + setUser(null); + } + }; + + if (loading) { + return ( + + + Loading... + + ); + } + + return ( + + {children} + + ); +} diff --git a/apps/figgos/apps/mobile/eas.json b/apps/figgos/apps/mobile/eas.json new file mode 100644 index 000000000..7cad8d319 --- /dev/null +++ b/apps/figgos/apps/mobile/eas.json @@ -0,0 +1,18 @@ +{ + "cli": { + "version": ">= 5.0.0" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal" + }, + "preview": { + "distribution": "internal" + }, + "production": {} + }, + "submit": { + "production": {} + } +} diff --git a/apps/figgos/apps/mobile/global.css b/apps/figgos/apps/mobile/global.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/apps/figgos/apps/mobile/global.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/figgos/apps/mobile/metro.config.js b/apps/figgos/apps/mobile/metro.config.js new file mode 100644 index 000000000..1a40036ee --- /dev/null +++ b/apps/figgos/apps/mobile/metro.config.js @@ -0,0 +1,9 @@ +// Learn more https://docs.expo.io/guides/customizing-metro +const { getDefaultConfig } = require('expo/metro-config'); +const { withNativeWind } = require('nativewind/metro'); + +/** @type {import('expo/metro-config').MetroConfig} */ +// eslint-disable-next-line no-undef +const config = getDefaultConfig(__dirname); + +module.exports = withNativeWind(config, { input: './global.css' }); diff --git a/apps/figgos/apps/mobile/nativewind-env.d.ts b/apps/figgos/apps/mobile/nativewind-env.d.ts new file mode 100644 index 000000000..a13e3136b --- /dev/null +++ b/apps/figgos/apps/mobile/nativewind-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/figgos/apps/mobile/package.json b/apps/figgos/apps/mobile/package.json new file mode 100644 index 000000000..1e6de6d6a --- /dev/null +++ b/apps/figgos/apps/mobile/package.json @@ -0,0 +1,60 @@ +{ + "name": "@figgos/mobile", + "version": "1.0.0", + "main": "expo-router/entry", + "type": "commonjs", + "scripts": { + "dev": "expo start --dev-client", + "start": "expo start --dev-client", + "ios": "expo run:ios", + "android": "expo run:android", + "build:dev": "eas build --profile development", + "build:preview": "eas build --profile preview", + "build:prod": "eas build --profile production", + "prebuild": "expo prebuild", + "lint": "eslint .", + "format": "eslint . --fix" + }, + "dependencies": { + "@expo/vector-icons": "^14.0.0", + "@manacore/shared-auth": "workspace:*", + "@react-native-async-storage/async-storage": "1.23.1", + "@react-navigation/bottom-tabs": "^7.0.5", + "@react-navigation/native": "^7.0.3", + "expo": "^52.0.39", + "expo-constants": "~17.0.8", + "expo-dev-client": "~5.0.4", + "expo-dev-launcher": "^5.0.17", + "expo-linking": "~7.0.5", + "expo-router": "~4.0.6", + "expo-secure-store": "~14.0.1", + "expo-status-bar": "~2.0.1", + "expo-system-ui": "~4.0.8", + "expo-web-browser": "~14.0.2", + "nativewind": "latest", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-native": "0.76.7", + "react-native-gesture-handler": "~2.20.2", + "react-native-reanimated": "3.16.2", + "react-native-safe-area-context": "4.12.0", + "react-native-screens": "~4.4.0", + "react-native-web": "~0.19.10" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@types/react": "~18.3.12", + "dotenv": "^16.4.7", + "eslint": "^9.39.1", + "eslint-config-universe": "^12.0.1", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.11", + "tailwindcss": "^3.4.0", + "typescript": "~5.3.3" + }, + "eslintConfig": { + "extends": "universe/native", + "root": true + }, + "private": true +} diff --git a/apps/figgos/apps/mobile/services/api.ts b/apps/figgos/apps/mobile/services/api.ts new file mode 100644 index 000000000..0e3900456 --- /dev/null +++ b/apps/figgos/apps/mobile/services/api.ts @@ -0,0 +1,26 @@ +import { authService } from '~/contexts/AuthContext'; + +const BACKEND_URL = process.env.EXPO_PUBLIC_BACKEND_URL || 'http://localhost:3025'; + +export async function fetchApi(path: string, options?: RequestInit): Promise { + const token = await authService.getAccessToken?.(); + + const response = await fetch(`${BACKEND_URL}${path}`, { + ...options, + headers: { + 'Content-Type': 'application/json', + ...(token ? { Authorization: `Bearer ${token}` } : {}), + ...options?.headers, + }, + }); + + if (!response.ok) { + throw new Error(`API error: ${response.status}`); + } + + return response.json(); +} + +export const api = { + health: () => fetchApi('/health'), +}; diff --git a/apps/figgos/apps/mobile/tailwind.config.js b/apps/figgos/apps/mobile/tailwind.config.js new file mode 100644 index 000000000..13edfcbc1 --- /dev/null +++ b/apps/figgos/apps/mobile/tailwind.config.js @@ -0,0 +1,32 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,ts,tsx}', './components/**/*.{js,ts,tsx}'], + presets: [require('nativewind/preset')], + darkMode: 'class', + theme: { + extend: { + colors: { + primary: '#6C5CE7', + secondary: '#A29BFE', + background: '#F8F9FA', + card: '#FFFFFF', + textColor: '#2D3436', + border: '#DFE6E9', + accent: '#00B894', + muted: '#B2BEC3', + + dark: { + primary: '#A29BFE', + secondary: '#6C5CE7', + background: '#1A1A2E', + card: '#16213E', + textColor: '#FFFFFF', + border: '#2D3436', + accent: '#55EFC4', + muted: '#636E72', + }, + }, + }, + }, + plugins: [], +}; diff --git a/apps/figgos/apps/mobile/tsconfig.json b/apps/figgos/apps/mobile/tsconfig.json new file mode 100644 index 000000000..de988058c --- /dev/null +++ b/apps/figgos/apps/mobile/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "~/*": ["*"] + } + }, + "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", "nativewind-env.d.ts"] +} diff --git a/apps/figgos/package.json b/apps/figgos/package.json new file mode 100644 index 000000000..023136a49 --- /dev/null +++ b/apps/figgos/package.json @@ -0,0 +1,8 @@ +{ + "name": "figgos", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "turbo run dev" + } +} diff --git a/apps/figgos/packages/shared/package.json b/apps/figgos/packages/shared/package.json new file mode 100644 index 000000000..b29252a4d --- /dev/null +++ b/apps/figgos/packages/shared/package.json @@ -0,0 +1,16 @@ +{ + "name": "@figgos/shared", + "version": "1.0.0", + "private": true, + "main": "./src/index.ts", + "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "type-check": "tsc --noEmit" + }, + "devDependencies": { + "typescript": "^5.7.2" + } +} diff --git a/apps/figgos/packages/shared/src/index.ts b/apps/figgos/packages/shared/src/index.ts new file mode 100644 index 000000000..214a6c8d2 --- /dev/null +++ b/apps/figgos/packages/shared/src/index.ts @@ -0,0 +1,3 @@ +// @figgos/shared - Shared types and constants +// Will be populated as features are added +export {}; diff --git a/apps/figgos/packages/shared/tsconfig.json b/apps/figgos/packages/shared/tsconfig.json new file mode 100644 index 000000000..6b6b6b1de --- /dev/null +++ b/apps/figgos/packages/shared/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2021", + "module": "commonjs", + "declaration": true, + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index ab76cc4d9..5fb742c4a 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -87,7 +87,9 @@ services: mc mb --ignore-existing myminio/inventory-storage; mc mb --ignore-existing myminio/planta-storage; mc mb --ignore-existing myminio/projectdoc-storage; + mc mb --ignore-existing myminio/figgos-storage; mc anonymous set download myminio/picture-storage; + mc anonymous set download myminio/figgos-storage; mc anonymous set download myminio/planta-storage; mc anonymous set download myminio/inventory-storage; echo 'Buckets created successfully'; diff --git a/package.json b/package.json index 480b12308..f3bc8ddcc 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,7 @@ "dev:figgos:android": "pnpm --filter @figgos/mobile android", "figgos:db:push": "pnpm --filter @figgos/backend db:push", "figgos:db:studio": "pnpm --filter @figgos/backend db:studio", + "dev:figgos:full": "./scripts/setup-databases.sh figgos && ./scripts/setup-databases.sh auth && concurrently -n auth,backend -c blue,green \"pnpm dev:auth\" \"pnpm dev:figgos:backend\"", "worldream:dev": "turbo run dev --filter=worldream...", "dev:worldream:web": "pnpm --filter @worldream/web dev", "context:dev": "turbo run dev --filter=context...", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f8387abf..551258c45 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,7 +199,7 @@ importers: version: 29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(esbuild@0.19.12)(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3) ts-loader: specifier: ^9.5.1 - version: 9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.19.12)) + version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.19.12)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) @@ -223,14 +223,14 @@ importers: version: link:../../../../packages/shared-landing-ui astro: specifier: ^5.16.0 - version: 5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + version: 5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) typescript: specifier: ^5.9.2 version: 5.9.3 devDependencies: '@astrojs/tailwind': specifier: ^6.0.2 - version: 6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) + version: 6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) '@tailwindcss/typography': specifier: ^0.5.18 version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) @@ -239,13 +239,13 @@ importers: version: 20.19.25 eslint: specifier: ^9.0.0 - version: 9.39.1(jiti@1.21.7) + version: 9.39.1(jiti@2.6.1) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.2(eslint@9.39.1(jiti@1.21.7)) + version: 9.1.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-astro: specifier: ^1.0.0 - version: 1.5.0(eslint@9.39.1(jiti@1.21.7)) + version: 1.5.0(eslint@9.39.1(jiti@2.6.1)) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -1041,12 +1041,6 @@ importers: apps/contacts/apps/backend: dependencies: - '@manacore/credit-operations': - specifier: workspace:* - version: link:../../../../packages/credit-operations - '@manacore/nestjs-integration': - specifier: workspace:* - version: link:../../../../packages/mana-core-nestjs-integration '@manacore/shared-nestjs-auth': specifier: workspace:* version: link:../../../../packages/shared-nestjs-auth @@ -1474,6 +1468,208 @@ importers: specifier: ^3.4.17 version: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + apps/figgos: {} + + apps/figgos/apps/backend: + dependencies: + '@figgos/shared': + specifier: workspace:* + version: link:../../packages/shared + '@manacore/shared-drizzle-config': + specifier: workspace:* + version: link:../../../../packages/shared-drizzle-config + '@manacore/shared-nestjs-auth': + specifier: workspace:* + version: link:../../../../packages/shared-nestjs-auth + '@manacore/shared-nestjs-health': + specifier: workspace:* + version: link:../../../../packages/shared-nestjs-health + '@manacore/shared-nestjs-metrics': + specifier: workspace:* + version: link:../../../../packages/shared-nestjs-metrics + '@manacore/shared-nestjs-setup': + specifier: workspace:* + version: link:../../../../packages/shared-nestjs-setup + '@nestjs/common': + specifier: ^10.4.15 + version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/config': + specifier: ^3.3.0 + version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: ^10.4.15 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/platform-express': + specifier: ^10.4.15 + version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20) + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.1 + version: 0.14.3 + dotenv: + specifier: ^16.4.7 + version: 16.6.1 + drizzle-kit: + specifier: ^0.30.2 + version: 0.30.6 + drizzle-orm: + specifier: ^0.38.3 + version: 0.38.4(@opentelemetry/api@1.9.0)(@types/react@19.2.7)(expo-sqlite@15.2.14(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(kysely@0.28.8)(postgres@3.4.7)(react@19.1.0) + postgres: + specifier: ^3.4.5 + version: 3.4.7 + prom-client: + specifier: ^15.1.0 + version: 15.1.3 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + rxjs: + specifier: ^7.8.1 + version: 7.8.2 + devDependencies: + '@nestjs/cli': + specifier: ^10.4.9 + version: 10.4.9(esbuild@0.27.0) + '@nestjs/schematics': + specifier: ^10.2.3 + version: 10.2.3(chokidar@3.6.0)(typescript@5.9.3) + '@types/express': + specifier: ^5.0.0 + version: 5.0.5 + '@types/node': + specifier: ^22.10.2 + version: 22.19.1 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + ts-loader: + specifier: ^9.5.1 + version: 9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.27.0)) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + tsx: + specifier: ^4.19.2 + version: 4.20.6 + typescript: + specifier: ^5.7.2 + version: 5.9.3 + + apps/figgos/apps/mobile: + dependencies: + '@expo/vector-icons': + specifier: ^14.0.0 + version: 14.1.0(expo-font@14.0.10(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + '@manacore/shared-auth': + specifier: workspace:* + version: link:../../../../packages/shared-auth + '@react-native-async-storage/async-storage': + specifier: 1.23.1 + version: 1.23.1(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1)) + '@react-navigation/bottom-tabs': + specifier: ^7.0.5 + version: 7.8.6(@react-navigation/native@7.1.21(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-safe-area-context@4.12.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-screens@4.4.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + '@react-navigation/native': + specifier: ^7.0.3 + version: 7.1.21(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + expo: + specifier: ^52.0.39 + version: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(encoding@0.1.13)(react-native-webview@13.12.2(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + expo-constants: + specifier: ~17.0.8 + version: 17.0.8(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1)) + expo-dev-client: + specifier: ~5.0.4 + version: 5.0.20(expo@52.0.47) + expo-dev-launcher: + specifier: ^5.0.17 + version: 5.1.17(expo@52.0.47) + expo-linking: + specifier: ~7.0.5 + version: 7.0.5(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + expo-router: + specifier: ~4.0.6 + version: 4.0.21(65am5mbkmp63mwl4oejo7rwcjy) + expo-secure-store: + specifier: ~14.0.1 + version: 14.0.1(expo@52.0.47) + expo-status-bar: + specifier: ~2.0.1 + version: 2.0.1(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + expo-system-ui: + specifier: ~4.0.8 + version: 4.0.9(expo@52.0.47)(react-native-web@0.19.13(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1)) + expo-web-browser: + specifier: ~14.0.2 + version: 14.0.2(expo@52.0.47)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1)) + nativewind: + specifier: latest + version: 4.2.1(react-native-reanimated@3.16.2(@babel/core@7.28.5)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native-safe-area-context@4.12.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) + react: + specifier: 18.3.1 + version: 18.3.1 + react-dom: + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) + react-native: + specifier: 0.76.7 + version: 0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1) + react-native-gesture-handler: + specifier: ~2.20.2 + version: 2.20.2(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + react-native-reanimated: + specifier: 3.16.2 + version: 3.16.2(@babel/core@7.28.5)(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + react-native-safe-area-context: + specifier: 4.12.0 + version: 4.12.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + react-native-screens: + specifier: ~4.4.0 + version: 4.4.0(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + react-native-web: + specifier: ~0.19.10 + version: 0.19.13(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@babel/core': + specifier: ^7.20.0 + version: 7.28.5 + '@types/react': + specifier: ~18.3.12 + version: 18.3.27 + dotenv: + specifier: ^16.4.7 + version: 16.6.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@1.21.7) + eslint-config-universe: + specifier: ^12.0.1 + version: 12.1.0(@types/eslint@9.6.1)(eslint@9.39.1(jiti@1.21.7))(prettier@3.6.2)(typescript@5.3.3) + prettier: + specifier: ^3.2.5 + version: 3.6.2 + prettier-plugin-tailwindcss: + specifier: ^0.5.11 + version: 0.5.14(prettier-plugin-astro@0.14.1)(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.44.0))(prettier@3.6.2) + tailwindcss: + specifier: ^3.4.0 + version: 3.4.18(tsx@4.20.6)(yaml@2.8.1) + typescript: + specifier: ~5.3.3 + version: 5.3.3 + + apps/figgos/packages/shared: + devDependencies: + typescript: + specifier: ^5.7.2 + version: 5.9.3 + apps/manacore/apps/landing: dependencies: '@astrojs/react': @@ -9222,7 +9418,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.22.26': resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} @@ -17126,6 +17322,7 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@10.5.0: @@ -17135,6 +17332,7 @@ packages: glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@12.0.0: @@ -17153,7 +17351,7 @@ packages: glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} @@ -20879,6 +21077,7 @@ packages: react-server-dom-webpack@19.0.0: resolution: {integrity: sha512-hLug9KEXLc8vnU9lDNe2b2rKKDaqrp5gNiES4uyu2Up3FZfZJZmdwLFXlWzdA9gTB/6/cWduSB2K1Lfag2pSvw==} engines: {node: '>=0.10.0'} + deprecated: Critical Security Vulnerability in React Server Components peerDependencies: react: ^19.0.0 react-dom: ^19.0.0 @@ -23994,16 +24193,6 @@ snapshots: transitivePeerDependencies: - ts-node - '@astrojs/tailwind@6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3))': - dependencies: - astro: 5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) - autoprefixer: 10.4.22(postcss@8.5.6) - postcss: 8.5.6 - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3)) - tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - ts-node - '@astrojs/tailwind@6.0.2(astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))(ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3))': dependencies: astro: 5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) @@ -26709,7 +26898,7 @@ snapshots: '@expo/json-file': 10.0.7 '@expo/mcp-tunnel': 0.0.8 '@expo/metro': 54.0.0 - '@expo/metro-config': 54.0.6(expo@54.0.12) + '@expo/metro-config': 54.0.9(expo@54.0.12) '@expo/osascript': 2.3.7 '@expo/package-manager': 1.9.8 '@expo/plist': 0.4.7 @@ -26786,7 +26975,7 @@ snapshots: '@expo/json-file': 10.0.7 '@expo/mcp-tunnel': 0.0.8 '@expo/metro': 54.0.0 - '@expo/metro-config': 54.0.6(expo@54.0.13) + '@expo/metro-config': 54.0.9(expo@54.0.13) '@expo/osascript': 2.3.7 '@expo/package-manager': 1.9.8 '@expo/plist': 0.4.7 @@ -27073,7 +27262,7 @@ snapshots: wrap-ansi: 7.0.0 ws: 8.18.3 optionalDependencies: - expo-router: 6.0.15(7mqaurqidri6vkknnsci36yp4e) + expo-router: 6.0.15(5ll7ovd7i5kd7vxhny3dgbs3xy) react-native: 0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0) transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -27443,6 +27632,66 @@ snapshots: - supports-color - utf-8-validate + '@expo/metro-config@54.0.9(expo@54.0.12)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@expo/config': 12.0.10 + '@expo/env': 2.0.7 + '@expo/json-file': 10.0.7 + '@expo/metro': 54.1.0 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.0 + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + glob: 10.5.0 + hermes-parser: 0.29.1 + jsc-safe-url: 0.2.4 + lightningcss: 1.30.2 + minimatch: 9.0.5 + postcss: 8.4.49 + resolve-from: 5.0.0 + optionalDependencies: + expo: 54.0.12(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@expo/metro-config@54.0.9(expo@54.0.13)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@expo/config': 12.0.10 + '@expo/env': 2.0.7 + '@expo/json-file': 10.0.7 + '@expo/metro': 54.1.0 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.0 + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + glob: 10.5.0 + hermes-parser: 0.29.1 + jsc-safe-url: 0.2.4 + lightningcss: 1.30.2 + minimatch: 9.0.5 + postcss: 8.4.49 + resolve-from: 5.0.0 + optionalDependencies: + expo: 54.0.13(@babel/core@7.28.5)(@expo/metro-runtime@6.1.2)(expo-router@6.0.15)(react-native-webview@13.12.2(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@expo/metro-config@54.0.9(expo@54.0.25)': dependencies: '@babel/code-frame': 7.27.1 @@ -33305,6 +33554,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + eslint: 9.39.1(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -33463,6 +33732,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + eslint: 9.39.1(jiti@1.21.7) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 @@ -33635,6 +33917,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + debug: 4.4.3 + eslint: 9.39.1(jiti@1.21.7) + ts-api-utils: 1.4.3(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/type-utils@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3)': dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) @@ -33858,6 +34152,20 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + eslint: 9.39.1(jiti@1.21.7) + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) @@ -34817,108 +35125,6 @@ snapshots: transitivePeerDependencies: - supports-color - astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): - dependencies: - '@astrojs/compiler': 2.13.0 - '@astrojs/internal-helpers': 0.7.5 - '@astrojs/markdown-remark': 6.3.9 - '@astrojs/telemetry': 3.3.0 - '@capsizecss/unpack': 3.0.1 - '@oslojs/encoding': 1.1.0 - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) - acorn: 8.15.0 - aria-query: 5.3.2 - axobject-query: 4.1.0 - boxen: 8.0.1 - ci-info: 4.3.1 - clsx: 2.1.1 - common-ancestor-path: 1.0.1 - cookie: 1.1.0 - cssesc: 3.0.0 - debug: 4.4.3 - deterministic-object-hash: 2.0.2 - devalue: 5.5.0 - diff: 5.2.0 - dlv: 1.1.3 - dset: 3.1.4 - es-module-lexer: 1.7.0 - esbuild: 0.25.12 - estree-walker: 3.0.3 - flattie: 1.1.1 - fontace: 0.3.1 - github-slugger: 2.0.0 - html-escaper: 3.0.3 - http-cache-semantics: 4.2.0 - import-meta-resolve: 4.2.0 - js-yaml: 4.1.1 - magic-string: 0.30.21 - magicast: 0.5.1 - mrmime: 2.0.1 - neotraverse: 0.6.18 - p-limit: 6.2.0 - p-queue: 8.1.1 - package-manager-detector: 1.5.0 - piccolore: 0.1.3 - picomatch: 4.0.3 - prompts: 2.4.2 - rehype: 13.0.2 - semver: 7.7.3 - shiki: 3.15.0 - smol-toml: 1.5.2 - svgo: 4.0.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tsconfck: 3.1.6(typescript@5.9.3) - ultrahtml: 1.6.0 - unifont: 0.6.0 - unist-util-visit: 5.0.0 - unstorage: 1.17.3(@netlify/blobs@10.4.1)(ioredis@5.9.2) - vfile: 6.0.3 - vite: 6.4.1(@types/node@20.19.25)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) - xxhash-wasm: 1.1.0 - yargs-parser: 21.1.1 - yocto-spinner: 0.2.3 - zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) - optionalDependencies: - sharp: 0.34.5 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@types/node' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - db0 - - idb-keyval - - ioredis - - jiti - - less - - lightningcss - - rollup - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - uploadthing - - yaml - astro@5.16.0(@netlify/blobs@10.4.1)(@types/node@20.19.25)(ioredis@5.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 @@ -37327,11 +37533,6 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.6.5(eslint@9.39.1(jiti@1.21.7)): - dependencies: - eslint: 9.39.1(jiti@1.21.7) - semver: 7.7.3 - eslint-compat-utils@0.6.5(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -37344,7 +37545,7 @@ snapshots: eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-expo: 1.0.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) globals: 16.5.0 @@ -37361,7 +37562,7 @@ snapshots: eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-expo: 0.1.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) globals: 16.5.0 @@ -37379,14 +37580,14 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-config-prettier@8.10.2(eslint@9.39.1(jiti@1.21.7)): + dependencies: + eslint: 9.39.1(jiti@1.21.7) + eslint-config-prettier@8.10.2(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) - eslint-config-prettier@9.1.2(eslint@9.39.1(jiti@1.21.7)): - dependencies: - eslint: 9.39.1(jiti@1.21.7) - eslint-config-prettier@9.1.2(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -37411,6 +37612,26 @@ snapshots: - supports-color - typescript + eslint-config-universe@12.1.0(@types/eslint@9.6.1)(eslint@9.39.1(jiti@1.21.7))(prettier@3.6.2)(typescript@5.3.3): + dependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + eslint: 9.39.1(jiti@1.21.7) + eslint-config-prettier: 8.10.2(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3))(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-node: 11.1.0(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-prettier: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7))(prettier@3.6.2) + eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-react-hooks: 4.6.2(eslint@9.39.1(jiti@1.21.7)) + optionalDependencies: + prettier: 3.6.2 + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - typescript + eslint-config-universe@12.1.0(@types/eslint@9.6.1)(eslint@9.39.1(jiti@2.6.1))(prettier@3.6.2)(typescript@5.3.3): dependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3) @@ -37470,7 +37691,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -37485,7 +37706,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -37499,6 +37720,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1(jiti@1.21.7)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + eslint: 9.39.1(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 @@ -37541,20 +37772,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-astro@1.5.0(eslint@9.39.1(jiti@1.21.7)): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) - '@jridgewell/sourcemap-codec': 1.5.5 - '@typescript-eslint/types': 8.48.0 - astro-eslint-parser: 1.2.2 - eslint: 9.39.1(jiti@1.21.7) - eslint-compat-utils: 0.6.5(eslint@9.39.1(jiti@1.21.7)) - globals: 16.5.0 - postcss: 8.5.6 - postcss-selector-parser: 7.1.0 - transitivePeerDependencies: - - supports-color - eslint-plugin-astro@1.5.0(eslint@9.39.1(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) @@ -37575,6 +37792,12 @@ snapshots: eslint-utils: 2.1.0 regexpp: 3.2.0 + eslint-plugin-es@3.0.1(eslint@9.39.1(jiti@1.21.7)): + dependencies: + eslint: 9.39.1(jiti@1.21.7) + eslint-utils: 2.1.0 + regexpp: 3.2.0 + eslint-plugin-es@3.0.1(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -37628,6 +37851,35 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3))(eslint@9.39.1(jiti@1.21.7)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.1(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1(jiti@1.21.7)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.3.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.3.3))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 @@ -37686,7 +37938,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -37715,7 +37967,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -37754,6 +38006,16 @@ snapshots: resolve: 1.22.11 semver: 6.3.1 + eslint-plugin-node@11.1.0(eslint@9.39.1(jiti@1.21.7)): + dependencies: + eslint: 9.39.1(jiti@1.21.7) + eslint-plugin-es: 3.0.1(eslint@9.39.1(jiti@1.21.7)) + eslint-utils: 2.1.0 + ignore: 5.3.2 + minimatch: 3.1.2 + resolve: 1.22.11 + semver: 6.3.1 + eslint-plugin-node@11.1.0(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -37784,6 +38046,16 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 8.10.2(eslint@8.57.1) + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@9.39.1(jiti@1.21.7)))(eslint@9.39.1(jiti@1.21.7))(prettier@3.6.2): + dependencies: + eslint: 9.39.1(jiti@1.21.7) + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 8.10.2(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@8.10.2(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(prettier@3.6.2): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -37808,6 +38080,10 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-plugin-react-hooks@4.6.2(eslint@9.39.1(jiti@1.21.7)): + dependencies: + eslint: 9.39.1(jiti@1.21.7) + eslint-plugin-react-hooks@4.6.2(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -37838,6 +38114,28 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@1.21.7)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.39.1(jiti@1.21.7) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: array-includes: 3.1.9 @@ -38982,7 +39280,7 @@ snapshots: - react-native - supports-color - expo-router@6.0.15(7mqaurqidri6vkknnsci36yp4e): + expo-router@6.0.15(5ll7ovd7i5kd7vxhny3dgbs3xy): dependencies: '@expo/metro-runtime': 6.1.2(expo@54.0.25)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) '@expo/schema-utils': 0.1.7 @@ -39021,7 +39319,7 @@ snapshots: react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) react-native-reanimated: 4.1.5(@babel/core@7.28.5)(react-native-worklets@0.6.1(@babel/core@7.28.5)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0) react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-server-dom-webpack: 19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.97.1(esbuild@0.19.12)) + react-server-dom-webpack: 19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.19.12)) transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@types/react' @@ -39268,7 +39566,7 @@ snapshots: expo-secure-store@14.0.1(expo@52.0.47): dependencies: - expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(encoding@0.1.13)(react-native-webview@13.12.2(react-native@0.76.3(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.3(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) + expo: 52.0.47(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@expo/metro-runtime@6.1.2)(encoding@0.1.13)(react-native-webview@13.12.2(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.7(@babel/core@7.28.5)(@babel/preset-env@7.28.5(@babel/core@7.28.5))(@types/react@18.3.27)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) expo-secure-store@15.0.7(expo@54.0.12): dependencies: @@ -46817,6 +47115,16 @@ snapshots: webpack-sources: 3.3.3 optional: true + react-server-dom-webpack@19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.19.12)): + dependencies: + acorn-loose: 8.5.2 + neo-async: 2.6.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + webpack: 5.100.2(esbuild@0.19.12) + webpack-sources: 3.3.3 + optional: true + react-server-dom-webpack@19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.100.2(esbuild@0.27.0)): dependencies: acorn-loose: 8.5.2 @@ -46827,16 +47135,6 @@ snapshots: webpack-sources: 3.3.3 optional: true - react-server-dom-webpack@19.0.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(webpack@5.97.1(esbuild@0.19.12)): - dependencies: - acorn-loose: 8.5.2 - neo-async: 2.6.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - webpack: 5.97.1(esbuild@0.19.12) - webpack-sources: 3.3.3 - optional: true - react-style-singleton@2.2.3(@types/react@18.3.27)(react@18.3.1): dependencies: get-nonce: 1.0.1 @@ -48337,6 +48635,17 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + terser-webpack-plugin@5.3.14(esbuild@0.19.12)(webpack@5.100.2(esbuild@0.19.12)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.100.2(esbuild@0.19.12) + optionalDependencies: + esbuild: 0.19.12 + terser-webpack-plugin@5.3.14(esbuild@0.19.12)(webpack@5.97.1(esbuild@0.19.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -48619,6 +48928,16 @@ snapshots: esbuild: 0.27.0 jest-util: 30.2.0 + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.19.12)): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.3 + micromatch: 4.0.8 + semver: 7.7.3 + source-map: 0.7.6 + typescript: 5.9.3 + webpack: 5.100.2(esbuild@0.19.12) + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2(esbuild@0.27.0)): dependencies: chalk: 4.1.2 @@ -48639,7 +48958,7 @@ snapshots: typescript: 5.9.3 webpack: 5.100.2 - ts-loader@9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.19.12)): + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.97.1(esbuild@0.27.0)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 @@ -48647,7 +48966,7 @@ snapshots: semver: 7.7.3 source-map: 0.7.6 typescript: 5.9.3 - webpack: 5.97.1(esbuild@0.19.12) + webpack: 5.97.1(esbuild@0.27.0) ts-node@10.9.2(@types/node@20.19.25)(typescript@5.9.3): dependencies: @@ -49350,23 +49669,6 @@ snapshots: lightningcss: 1.30.2 terser: 5.44.1 - vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.53.3 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 20.19.25 - fsevents: 2.3.3 - jiti: 1.21.7 - lightningcss: 1.30.2 - terser: 5.44.1 - tsx: 4.20.6 - yaml: 2.8.1 - vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.12 @@ -49470,10 +49772,6 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitefu@1.1.1(vite@6.4.1(@types/node@20.19.25)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): - optionalDependencies: - vite: 6.4.1(@types/node@20.19.25)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitefu@1.1.1(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -49874,6 +50172,38 @@ snapshots: - esbuild - uglify-js + webpack@5.100.2(esbuild@0.19.12): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(esbuild@0.19.12)(webpack@5.100.2(esbuild@0.19.12)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + webpack@5.100.2(esbuild@0.27.0): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/scripts/generate-env.mjs b/scripts/generate-env.mjs index 480f3dc9b..3abb5e398 100644 --- a/scripts/generate-env.mjs +++ b/scripts/generate-env.mjs @@ -601,6 +601,34 @@ const APP_CONFIGS = [ }, }, + // Figgos Backend (NestJS) + { + path: 'apps/figgos/apps/backend/.env', + vars: { + NODE_ENV: () => 'development', + PORT: (env) => env.FIGGOS_BACKEND_PORT || '3025', + DATABASE_URL: (env) => env.FIGGOS_DATABASE_URL, + MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, + DEV_BYPASS_AUTH: () => 'true', + DEV_USER_ID: () => '00000000-0000-0000-0000-000000000000', + S3_ENDPOINT: (env) => env.S3_ENDPOINT || 'http://localhost:9000', + S3_REGION: (env) => env.S3_REGION || 'us-east-1', + S3_ACCESS_KEY: (env) => env.S3_ACCESS_KEY || 'minioadmin', + S3_SECRET_KEY: (env) => env.S3_SECRET_KEY || 'minioadmin', + S3_BUCKET: () => 'figgos-storage', + CORS_ORIGINS: () => 'http://localhost:5181,http://localhost:8081', + }, + }, + + // Figgos Mobile (Expo) + { + path: 'apps/figgos/apps/mobile/.env', + vars: { + EXPO_PUBLIC_BACKEND_URL: (env) => `http://localhost:${env.FIGGOS_BACKEND_PORT || '3025'}`, + EXPO_PUBLIC_MANA_CORE_AUTH_URL: (env) => env.MANA_CORE_AUTH_URL, + }, + }, + // Worldream Web (SvelteKit) { path: 'games/worldream/apps/web/.env',