name: architecture description: Project structure and module organization. Use when creating new modules, adding new features, understanding where files should be placed, or exploring the codebase structure. user-invocable: false
Project Architecture
Project Structure
/src
├── modules/ # Feature-based modules (domain-driven design)
│ ├── systems/ # System management features
│ ├── orders/ # Order management features
│ ├── catalogue/ # Catalogue features
│ ├── orderItem/ # Order item features
│ ├── systemItem/ # System item features
│ └── shared/ # Shared cross-domain features
│ ├── form/wizardV3/ # Multi-step form wizard
│ ├── system/ # System-related shared features
│ └── catalogue/ # Catalogue-related shared features
├── components/ # Reusable UI components
│ ├── ui/ # shadcn/ui components
│ ├── form/ # Form components
│ ├── overlays/ # Modal and slideover components
│ └── table/ # Table components
├── hooks/ # Custom React hooks
│ ├── fetch/ # Data fetching hooks
│ ├── form/ # Form-related hooks
│ ├── graphql/ # GraphQL query/mutation hooks
│ └── filter/ # Filter state hooks
├── store/ # Global Zustand stores
├── lib/ # Library utilities and helpers
│ ├── utils.ts # General utilities (cn(), etc.)
│ └── predicates/ # Predicate functions
├── utils/ # General utility functions
├── types/ # Global type definitions
│ ├── constants/ # Global constants
│ └── gql/ # GraphQL generated types
└── server/ # Server-side code (Next.js API routes)
├── apollo/ # Apollo GraphQL server
└── files/ # File handling (MinIO S3)
Module Organization Pattern
Each feature module follows this structure:
/modules/{moduleName}/
├── components/ # React components
│ ├── {feature}/ # Feature subdirectories
│ ├── filters/ # Filter components
│ └── table/ # Table components
├── hooks/ # Custom hooks (queries, mutations)
├── types/ # Module-specific types
├── utils/ # Module-specific utilities
├── store/ # Module-specific Zustand stores (if needed)
├── {Name}.cont.tsx # Container component (logic + data)
└── {Name}.comp.tsx # Pure component (presentation)
Where to Place New Code
| Type | Location | Example |
|---|---|---|
| New feature module | /src/modules/{moduleName}/ |
/src/modules/inventory/ |
| Shared component | /src/components/ |
/src/components/form/DatePicker.tsx |
| shadcn/ui component | /src/components/ui/ |
/src/components/ui/calendar.tsx |
| Global hook | /src/hooks/{category}/ |
/src/hooks/fetch/useDebounce.ts |
| Module-specific hook | /src/modules/{module}/hooks/ |
/src/modules/orders/hooks/useOrderMutation.ts |
| Global store | /src/store/ |
/src/store/useUserStore.ts |
| Module-specific store | /src/modules/{module}/store/ |
/src/modules/orders/store/useOrderFilterStore.ts |
| Global types | /src/types/ |
/src/types/common.ts |
| Module-specific types | /src/modules/{module}/types/ |
/src/modules/orders/types/order.ts |
| Predicate functions | /src/lib/predicates/ |
/src/lib/predicates/domain.ts |
| Utility functions | /src/utils/ |
/src/utils/formatters.ts |
| GraphQL generated types | /src/types/gql/ |
Auto-generated by codegen |
| Constants | /src/types/constants/ |
/src/types/constants/tableIds.ts |
Creating a New Module
When creating a new feature module:
- Create directory:
/src/modules/{moduleName}/ - Add subdirectories as needed:
components/,hooks/,types/ - Create container:
{Name}.cont.tsx- handles data fetching and logic - Create component:
{Name}.comp.tsx- pure presentation - Add page in
/src/pages/that imports the container
File Naming Conventions
| Type | Pattern | Example |
|---|---|---|
| Container | {Name}.cont.tsx |
OrderList.cont.tsx |
| Pure component | {Name}.comp.tsx |
OrderList.comp.tsx |
| Hook | use{Name}.ts |
useOrderMutation.ts |
| Store | use{Name}Store.ts |
useOrderFilterStore.ts |
| Types | {name}.ts or {name}.types.ts |
order.ts |
| Constants | {name}.ts (UPPER_CASE exports) |
tableIds.ts |