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',