# TorbatYar Frontend — Import Report **Date:** 2026-07-26 **Scope:** Import patterns, alias usage, violations, and conventions --- ## 1. Summary Statistics | Metric | Value | |--------|------:| | Total source files (`.ts`/`.tsx`) | ~481 | | Total import statements | ~811 | | `@/` alias imports | 756 (93%) | | Relative imports (`./`, `../`) | 55 (7%) | | Files using `@/` alias | 445 / 481 (92%) | | Files using relative imports | 30 / 481 (6%) | | Files using both patterns | 25 | | Cross-domain imports | 0 | | Circular import chains | 0 | **Verdict:** Import conventions are strong and consistently applied. --- ## 2. Path Alias Configuration ### tsconfig.json ```json { "compilerOptions": { "paths": { "@/*": ["./*"] } } } ``` Single alias `@/` maps to `frontend/` root. No scoped sub-aliases exist. ### Implications | Aspect | Effect | |--------|--------| | Readability | ✅ Clean absolute-style paths | | Refactoring | ⚠️ No enforced module scoping via alias | | Tree-shaking | Neutral — bundler resolves same as relative | | IDE navigation | ✅ Works well | | Boundary enforcement | ❌ Cannot restrict by alias alone — needs ESLint | --- ## 3. Import Pattern Analysis ### Pattern A — Absolute `@/` (dominant, 93%) Used for all cross-folder imports: ```typescript // App route → component export { CustomerWallet as default } from "@/components/beauty/pages/customer"; // Component → design system import { Button, DataTable, PageHeader } from "@/components/ds"; // Component → API client import { accountingApi } from "@/lib/accounting-api"; // Component → hook import { useTenantId } from "@/hooks/useTenantId"; // Layout → guard import { AuthGuard } from "@/components/AuthGuard"; ``` ### Pattern B — Relative `./` (local composition, 7%) Used within co-located modules: ```typescript // Page bundle → shared helpers import { BeautyPageLoader, BeautyPageError } from "./shared"; // DS internal import { Button } from "./Button"; // Design system barrel export { BeautyStatusChip } from "./BeautyStatusChip"; export { CardShell } from "./BeautyCards"; // Portal layout → shell (same module) import { BeautyPortalShell } from "@/components/beauty/BeautyPortalShell"; // Note: even same-module sometimes uses @/ — inconsistent but harmless ``` ### Pattern C — Re-export routes (beauty/healthcare) ~175 routes use single-line re-exports: ```typescript export { CustomerWallet as default } from "@/components/beauty/pages/customer"; ``` This is the **canonical thin-route pattern** for the codebase. --- ## 4. Import Frequency by Target ### Most imported modules | Target | Approx. imports | Category | |--------|----------------:|----------| | `@/components/ds` | 90+ | Design system | | `@/hooks/useTenantId` | 67 | Shared hook | | `@/lib/utils` | 47 | Utilities | | `@/lib/accounting-api` | 30 | Domain API | | `@/lib/beauty-business-api` | 28 | Domain API | | `@/lib/auth` | 15 | Platform auth | | `@/lib/healthcare-api` | 14 | Domain API | | `@/components/AuthGuard` | 10+ | Platform guard | | `@/hooks/useMe` | 7 | Shared hook | | `@tanstack/react-query` | 70+ | External | ### Most imported DS exports | Export | Typical consumers | |--------|-------------------| | `Button` | All modules | | `PageHeader` | All modules | | `DataTable` | All modules | | `LoadingState`, `ErrorState` | Portal layouts, pages | | `Dialog`, `ConfirmDialog` | CRUD pages | | `FormField`, `MoneyInput` | Accounting, beauty owner | | `DatePicker` | Accounting | --- ## 5. Domain Import Isolation ### Accounting imports ``` ✅ @/components/ds ✅ @/components/accounting/* ✅ @/lib/accounting-api ✅ @/lib/accounting-nav ✅ @/hooks/useTenantId, useMe ✅ @/lib/auth, @/lib/utils ❌ @/components/beauty/* — NOT FOUND ❌ @/components/healthcare/* — NOT FOUND ❌ @/lib/beauty-business-api — NOT FOUND ❌ @/lib/healthcare-api — NOT FOUND ``` ### Beauty imports ``` ✅ @/components/ds ✅ @/components/beauty/* ✅ @/lib/beauty-business-api ✅ @/lib/beauty-portals ✅ @/hooks/useTenantId, useMe, useBeautyLookups ❌ @/components/accounting/* — NOT FOUND ❌ @/components/healthcare/* — NOT FOUND ``` ### Healthcare imports ``` ✅ @/components/ds ✅ @/components/healthcare/* ✅ @/lib/healthcare-api ✅ @/lib/healthcare-portals ✅ @/hooks/useTenantId, useMe, useHealthcareLookups, useHealthcarePatientContext ❌ @/components/accounting/* — NOT FOUND ❌ @/components/beauty/* — NOT FOUND ``` ### Platform imports ``` ✅ @/components/ui — Marketing surfaces ✅ @/components/ds — Some admin/settings ✅ @/lib/api — Core backend ✅ @/lib/auth, @/lib/identity ❌ Domain module components — NOT FOUND ``` **Compliance: 100%** — no cross-domain import violations detected. --- ## 6. Shared Layer Import Compliance ### `components/ds/` imports The design system imports only: - `@/lib/utils` (cn helper) - Internal relative `./` imports - External packages (cva, lucide-react, react) **Does NOT import:** any domain module ✅ ### `hooks/` imports | Hook | Allowed imports | Violations | |------|-----------------|------------| | `useMe` | `@/lib/api` | None | | `useTenantId` | `@/hooks/useMe` | None | | `useBeautyLookups` | `@/lib/beauty-business-api` | None (domain hook) | | `useHealthcareLookups` | `@/lib/healthcare-api` | None (domain hook) | | `useAuth` | `@/lib/auth` | None | Shared hooks (useMe, useTenantId, useAuth) do not import domain APIs. ✅ --- ## 7. Improper Import Patterns ### 7.1 Legacy UI in new module code | Issue | Severity | Details | |-------|----------|---------| | Module code importing `components/ui/` | 🟡 Low | Not found in beauty/healthcare/accounting — compliant | | Platform code importing `components/ui/` | ✅ Expected | Login, dashboard, homepage | ### 7.2 Deep imports bypassing barrels Some files import directly from DS sub-files instead of barrel: ```typescript // Bypasses barrel — found occasionally import { Button } from "@/components/ds/Button"; // Preferred import { Button } from "@/components/ds"; ``` **Impact:** Low — does not break boundaries, reduces barrel effectiveness. ### 7.3 Same-module `@/` vs relative inconsistency Beauty and healthcare components sometimes use `@/components/beauty/...` for same-module imports where `./` would suffice. **Impact:** None functional; stylistic inconsistency only. ### 7.4 Server/client boundary Most app routes are `"use client"` — no widespread server component data fetching pattern. API clients check `typeof window` for BFF vs direct URL. **Not a violation** but limits RSC benefits. --- ## 8. External Package Imports | Package | Import count | Modules using | |---------|-------------|---------------| | `react` | All files | Universal | | `next/navigation` | ~50+ | Client routes (useRouter, redirect) | | `next/link` | ~30+ | Navigation | | `next/image` | ~10 | Public sites | | `@tanstack/react-query` | ~70+ | All modules | | `react-hook-form` | ~29 | Accounting, beauty owner | | `@hookform/resolvers/zod` | ~29 | With react-hook-form | | `zod` | ~35+ | Form schemas | | `lucide-react` | ~100+ | Icons everywhere | | `sonner` | ~40+ | Toast via import or AppProviders | | `class-variance-authority` | 2 | ds/Button, ds/Badge | | `dayjs` | ~5 | Date formatting | | `jalaali-js` | 1 | ds/DatePicker | | `framer-motion` | ~3 | Limited animation | | `@tanstack/react-table` | 0 | **Unused** | | `recharts` | 0 | **Unused** | --- ## 9. Import Graph Layers ``` ┌─────────────────────────────────────────────────────────┐ │ app/**/page.tsx │ │ (routes — import components, occasionally inline) │ └────────────────────────┬────────────────────────────────┘ │ ┌────────────────────────▼────────────────────────────────┐ │ components/{module}/pages/*.tsx │ │ components/{module}/*Shell.tsx │ │ components/accounting/*.tsx │ └────────────────────────┬────────────────────────────────┘ │ ┌────────────────┼────────────────┐ │ │ │ ┌───────▼──────┐ ┌───────▼──────┐ ┌───────▼──────┐ │ components/ds│ │ hooks/ │ │ lib/*-api.ts │ └───────┬──────┘ └───────┬──────┘ └───────┬──────┘ │ │ │ └────────────────┼────────────────┘ │ ┌────────▼────────┐ │ lib/auth.ts │ │ lib/utils.ts │ │ lib/api.ts │ └─────────────────┘ ``` No back-edges detected. Graph is a DAG. --- ## 10. False-Positive Cross-Module Names These filenames suggest cross-module coupling but are contained within their domain: | Route/file | Looks like | Actually imports | |------------|------------|------------------| | `beauty/owner/accounting-integration/page.tsx` | Accounting | `@/components/beauty/pages/owner` | | `beauty/owner/crm-integration/page.tsx` | CRM | `@/components/beauty/pages/owner` | | `healthcare/clinic/accounting-integration/page.tsx` | Accounting | `@/components/healthcare/pages/clinic` | Integration **pages** refer to external systems; they do not import other frontend modules. --- ## 11. Recommended Import Conventions ### For new code ```typescript // 1. Design system — always from barrel import { Button, DataTable } from "@/components/ds"; // 2. Domain code — absolute @/ within module import { BeautyPortalShell } from "@/components/beauty/BeautyPortalShell"; // 3. Co-located helpers — relative import { PageLoader } from "./shared"; // 4. Platform utilities import { cn, formatMoney } from "@/lib/utils"; import { useTenantId } from "@/hooks/useTenantId"; // 5. Domain API — only in own module import { beautyBusinessApi } from "@/lib/beauty-business-api"; // 6. NEVER cross-module // import { AccountingShell } from "@/components/accounting/..."; // in beauty ``` ### Route files ```typescript // Preferred — thin re-export export { MyPage as default } from "@/components/{module}/pages/{portal}"; // Acceptable — dynamic params wrapper export { default } from "@/components/{module}/pages/public"; ``` --- ## 12. Enforcement Plan | Mechanism | Purpose | Phase | |-----------|---------|-------| | ESLint `no-restricted-imports` | Block cross-domain paths | Phase 1 | | ESLint `no-restricted-imports` | Block `components/ui/` in domain code | Phase 1 | | Custom script: import graph | CI validation of DAG | Phase 1 | | Path aliases `@accounting/*` | Make boundaries explicit | Phase 2 (optional) | | `eslint-plugin-import` ordering | Consistent import sort | Phase 2 (optional) | --- ## Related Documents - [module-boundaries.md](./module-boundaries.md) - [dependency-report.md](./dependency-report.md) - [frontend-architecture-audit.md](./frontend-architecture-audit.md)