--- name: project-setup-architecture description: Set up project infrastructure including TypeScript, database, state management, navigation, and testing. Use when initializing new features or configuring development environment. allowed-tools: Bash, Read, Write, Edit, Glob --- # Project Setup & Architecture Guide for setting up React Native/Expo project infrastructure. ## When to Use - Initializing TypeScript configuration - Setting up database layer - Configuring state management - Installing and configuring testing - Creating directory structure - Adding linting and formatting ## Setup Workflows ### TypeScript Setup ```bash # Install TypeScript npm install --save-dev typescript @types/react @types/react-native # Create tsconfig.json npx tsc --init ``` ```json { "extends": "expo/tsconfig.base", "compilerOptions": { "strict": true, "skipLibCheck": true, "jsx": "react-native" } } ``` ### Directory Structure ```bash # Create feature-sliced architecture mkdir -p src/{app,features,shared,db,theme} mkdir -p src/shared/{components,hooks,utils,types} ``` ### Database Setup (SQLite + Drizzle) ```bash # Install dependencies npx expo install expo-sqlite npm install drizzle-orm npm install --save-dev drizzle-kit # Create structure mkdir -p src/db/{schema,migrations} ``` ```typescript // src/db/client.ts import * as SQLite from 'expo-sqlite'; import { drizzle } from 'drizzle-orm/expo-sqlite'; const db = SQLite.openDatabaseSync('app.db'); export const drizzle = drizzle(db); ``` ### State Management (Zustand) ```bash npm install zustand ``` ```typescript // src/shared/stores/useAppStore.ts import { create } from 'zustand'; interface AppState { count: number; increment: () => void; } export const useAppStore = create((set) => ({ count: 0, increment: () => set((state) => ({ count: state.count + 1 })), })); ``` ### Testing Setup ```bash npm install --save-dev jest @testing-library/react-native ``` ```json // package.json { "scripts": { "test": "jest" } } ``` ### Linting & Formatting ```bash npm install --save-dev eslint prettier npx eslint --init ``` ## Configuration Files ### app.json (Expo Configuration) ```json { "expo": { "name": "MyApp", "slug": "my-app", "version": "1.0.0", "platforms": ["ios", "android"], "ios": { "bundleIdentifier": "com.company.myapp" }, "android": { "package": "com.company.myapp" } } } ``` ### package.json Scripts ```json { "scripts": { "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", "test": "jest", "lint": "eslint src/", "type-check": "tsc --noEmit" } } ``` ## Best Practices 1. **Incremental Setup**: Install and configure one system at a time 2. **Verify Installation**: Test each setup before moving to next 3. **Check Dependencies**: Ensure compatibility with Expo SDK 4. **Use Expo Install**: For Expo packages, use `npx expo install` 5. **Version Control**: Commit after each successful setup step ## Common Tasks ### Add New Dependency ```bash # Check if it's an Expo SDK package npx expo install package-name # Otherwise use npm npm install package-name ``` ### Create New Feature Module ```bash mkdir -p src/features/my-feature/{components,hooks,services,types} touch src/features/my-feature/index.ts ``` ### Generate Database Migration ```bash npx drizzle-kit generate:sqlite npx drizzle-kit push:sqlite ``` ## Verification Checklist After setup, verify: - [ ] TypeScript compiles without errors (`npx tsc --noEmit`) - [ ] App runs on both iOS and Android - [ ] Tests run successfully (`npm test`) - [ ] Linting passes (`npm run lint`) - [ ] Database connects and queries work - [ ] State management functions correctly ## Resources - [Expo Configuration](https://docs.expo.dev/workflow/configuration/) - [TypeScript with Expo](https://docs.expo.dev/guides/typescript/)