Quy ước code
ESLint
Dự án sử dụng ESLint v9 flat config với các plugin chuyên biệt:
- sonarjs: Phát hiện code smells, cognitive complexity
- boundaries: Kiểm soát dependency giữa các module
Cấu hình gốc tại eslint.config.js, mỗi app có config riêng bổ sung:
# Chạy lint toàn bộ monorepo
pnpm lint
# Kiểm tra complexity
pnpm complexity
pnpm complexity:frontend
pnpm complexity:backend
Prettier
Format code tự động với Prettier. Cấu hình tại .prettierrc.js:
# Format toàn bộ codebase
pnpm format
# Kiểm tra format (CI)
pnpm format:check
Pre-commit Hooks
Husky + lint-staged chạy tự động trước mỗi commit:
package.json (lint-staged)
{
"lint-staged": {
"apps/frontend/**/*.{ts,tsx}": [
"pnpm --dir apps/frontend exec eslint --fix",
"prettier --write"
],
"apps/backend/**/*.ts": ["prettier --write"],
"*.{json,md}": ["prettier --write"]
}
}
thông tin
Khi commit, lint-staged tự động fix linting + format cho các file đã staged. Nếu có lỗi không fix được, commit sẽ bị chặn.
Kiểm tra chất lượng Code
Code Duplication
# Phát hiện code trùng lặp (jscpd)
pnpm dupcheck
# Output JSON cho CI
pnpm dupcheck:ci
Cấu hình jscpd tại .jscpd.json ở thư mục gốc.
Dead Code Detection
# Tìm code, exports, dependencies không sử dụng (Knip)
pnpm deadcode
# Output JSON cho CI
pnpm deadcode:ci
Cấu hình Knip tại knip.json.
Dependency Architecture
# Kiểm tra vi phạm dependency rules
pnpm deps:check
# Sinh dependency graph (SVG)
pnpm deps:check:graph
Cấu hình dependency-cruiser tại dependency-cruiser.js. Các quy tắc chính:
- Không import ngược từ
sharedvàomodules - Không import trực tiếp giữa các module (phải qua module exports)
- Không circular dependency
Git Workflow
main ← dev ← feature/xxx
hotfix/xxx
bugfix/xxx
| Nhánh | Mục đích |
|---|---|
main | Production, chỉ merge từ dev |
dev | Development, merge từ feature branches |
feature/ten-tinh-nang | Tính năng mới |
bugfix/mo-ta-loi | Sửa lỗi |
hotfix/ten-fix | Fix khẩn cấp trên production |
Quy trình:
- Tạo branch từ
dev:git checkout -b feature/add-reports - Phát triển + commit theo convention (xem bên dưới)
- Push branch, tạo Merge Request vào
dev - Review + merge sau khi CI pass
Naming Conventions
Files & Folders
| Loại | Convention | Ví dụ |
|---|---|---|
| Component React | kebab-case.tsx | customer-form.tsx |
| NestJS class | kebab-case.ts | customers.service.ts |
| Test file | *.spec.ts | customers.service.spec.ts |
| DTO | kebab-case.dto.ts | create-customer.dto.ts |
| Module | kebab-case | service-packages/ |
| Thư mục feature | kebab-case | shooting-sessions/ |
Variables & Functions
| Loại | Convention | Ví dụ |
|---|---|---|
| Biến, hàm | camelCase | findAllCustomers |
| Class, Interface | PascalCase | CustomersService |
| Constant | UPPER_SNAKE | MAX_FILE_SIZE |
| Enum value | PascalCase | PositionStatus.Active |
| Database column | snake_case | created_at |
| API endpoint | kebab-case | /api/service-packages |
React Components
// Tên component = PascalCase, tên file = kebab-case
// customer-list.tsx
export function CustomerList() { ... }
// Hooks bắt đầu bằng "use"
export function useCustomerFilters() { ... }
Import Ordering
Thứ tự import trong mỗi file:
// 1. External libraries
import { Injectable } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
// 2. Internal packages (alias paths)
import { PrismaService } from '@infrastructure/database/prisma.service';
import { AuditService } from '@shared/common/services/audit.service';
// 3. Relative imports (cùng module)
import { CreateCustomerDto } from '../dto/create-customer.dto';
import { CustomersRepository } from '../repositories/customers.repository';
Alias paths được cấu hình trong tsconfig.json:
| Alias | Đường dẫn |
|---|---|
@modules/* | src/modules/* |
@shared/* | src/shared/* |
@infrastructure/* | src/infrastructure/* |
@test/* | test/* |
Commit Message Convention
<type>(<scope>): <mô tả ngắn>
# Ví dụ:
feat(delivery): thêm quản lý phiên chụp
fix(auth): sửa lỗi refresh token hết hạn
refactor(organization): tách service pods
docs: cập nhật hướng dẫn cài đặt
chore: upgrade dependencies
| Type | Mô tả |
|---|---|
feat | Tính năng mới |
fix | Sửa lỗi |
refactor | Tái cấu trúc code |
docs | Cập nhật tài liệu |
test | Thêm/sửa test |
chore | Cập nhật build, deps, CI |
style | Format code, không đổi logic |