Monorepo Structure
ระบบ WMS ทั้งหมดอยู่ใน monorepo เดียว จัดการด้วย pnpm workspaces — แชร์ TypeScript config, dependency, และ shared types ระหว่าง apps
Folder Tree
WMS/
├─ apps/
│ ├─ api/ # NestJS backend (REST API)
│ │ ├─ src/
│ │ │ ├─ app.module.ts # ลงทะเบียน 20 feature modules
│ │ │ ├─ main.ts # bootstrap: global prefix, ValidationPipe, CORS, Swagger
│ │ │ ├─ common/ # shared dto/services/utils
│ │ │ ├─ infrastructure/ # prisma module + service
│ │ │ └─ modules/ # 19 folders — feature modules
│ │ ├─ prisma/
│ │ │ ├─ schema.prisma # 35+ models
│ │ │ └─ seed.ts # default tenant + admin
│ │ ├─ test/ # e2e tests
│ │ ├─ Dockerfile
│ │ └─ package.json
│ │
│ ├─ web/ # Main WMS (React 19 + Vite 6)
│ │ ├─ src/
│ │ │ ├─ main.tsx # provider tree (QueryClient → Router → Auth → Help → Toaster)
│ │ │ ├─ App.tsx # routes (Layout + ProtectedRoute)
│ │ │ ├─ pages/ # หน้า: dashboard, master-data, inbound, outbound, …
│ │ │ ├─ components/ # Layout, ProtectedRoute, modals, tables
│ │ │ ├─ contexts/ # AuthContext, HelpContext
│ │ │ ├─ hooks/ # useApi (useList/useDetail/useCreate/useUpdate/useRemove/useAction)
│ │ │ ├─ lib/ # api.ts (axios), toast.ts, permissions.ts
│ │ │ ├─ locales/ # th.ts, en.ts
│ │ │ └─ i18n.ts
│ │ └─ package.json
│ │
│ ├─ admin/ # Admin Portal (React 19 + Vite 6)
│ │ ├─ src/ # โครงสร้างคล้าย web — มี per-module ProtectedRoute
│ │ └─ package.json
│ │
│ └─ docs/ # VitePress docs site
│ ├─ .vitepress/config.ts # sidebar + theme + locales
│ ├─ guide/ # user + admin guides
│ ├─ workflows/ # end-to-end flows
│ ├─ reference/ # glossary, allocation, integration-api
│ ├─ spec/ # ← Technical Specification (หน้านี้)
│ └─ troubleshooting/
│
├─ packages/
│ └─ shared-types/ # TypeScript types ใช้ร่วม FE ↔ BE
│
├─ scripts/ # repo-wide automation
├─ docker-compose.yml # local-dev stack (postgres + redis + api)
├─ render.yaml # Render.com infrastructure-as-code
├─ pnpm-workspace.yaml # ลงทะเบียน workspaces
├─ tsconfig.base.json # shared TS config
├─ WMS_SPEC.md # ต้นฉบับ functional spec
└─ package.json # root scripts (dev:api / build:web / db:push / …)หน้าที่ของแต่ละโฟลเดอร์
| โฟลเดอร์ | บทบาท | Owner |
|---|---|---|
apps/api | Backend REST API ทั้งหมด (business logic, validation, DB access) | Backend dev |
apps/web | UI สำหรับ operator/supervisor/manager — งานคลังประจำวัน | Frontend dev |
apps/admin | UI สำหรับ admin/superadmin — user management, settings, monitoring | Frontend dev |
apps/docs | คู่มือผู้ใช้ + technical spec (static site) | All |
packages/shared-types | TypeScript interfaces ใช้ทั้ง FE/BE (avoid drift) | Backend dev |
scripts/ | repo-wide tooling เช่น migration helpers, seed utilities | DevOps |
docker-compose.yml | Self-contained local stack (เผื่อไม่ใช้ Supabase) | Local dev |
pnpm Workspaces
ไฟล์ pnpm-workspace.yaml:
yaml
packages:
- "apps/*"
- "packages/*"
allowBuilds:
"@nestjs/core": true
"@prisma/client": true
"@prisma/engines": true
bcrypt: true
esbuild: true
prisma: trueallowBuilds คือ pnpm 11+ feature ที่ต้อง allowlist native post-install scripts (security)
คำสั่งทั่วไป
ทุกคำสั่งรันจาก repo root
Workspace-filtered (รัน app ใดอย่างเดียว)
bash
pnpm --filter @wms/api dev # backend dev (ts-node-dev watch)
pnpm --filter @wms/web dev # main app (Vite, port 5173)
pnpm --filter @wms/admin dev # admin portal (Vite, port 5174)
pnpm --filter @wms/docs dev # docs site (port 5175)
pnpm --filter @wms/api build # NestJS production build → dist/
pnpm --filter @wms/web build # tsc + vite build → dist/Root-level shortcuts (จาก package.json ของ root)
bash
pnpm dev # parallel: api + web
pnpm build # parallel: api + web build
pnpm dev:api / dev:web / dev:admin / dev:docs
pnpm build:docs
pnpm db:generate # prisma generate (regen client)
pnpm db:migrate # prisma migrate dev (creates migration)
pnpm db:push # prisma db push (apply schema, no migration)
pnpm lint # recursive lint
pnpm test # recursive testAdd dependency to specific app
bash
pnpm --filter @wms/web add lodash
pnpm --filter @wms/api add -D @types/lodashติดตั้งทั้งหมด
bash
pnpm install # resolve + install ทุก workspacedependency hoisting
pnpm จะ symlink dep ของแต่ละ workspace ไป node_modules/.pnpm/ (content-addressable) — ไม่ flatten แบบ npm/yarn → ปลอดภัยกว่า, ใช้พื้นที่น้อยกว่า