Basic Architecture of Sport Web
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
# ADR-0001: Monorepo with pnpm workspaces and Turborepo
|
||||
|
||||
- **Status:** Accepted
|
||||
- **Date:** 2026-08-11
|
||||
|
||||
## Context
|
||||
|
||||
Three deployable applications (storefront, admin, API) share domain types, validation
|
||||
rules and an HTTP client. Split across three repositories, every contract change becomes a
|
||||
version bump, a publish and three coordinated pull requests — and in practice the types drift
|
||||
because nobody wants to pay that cost for a one-field change.
|
||||
|
||||
## Decision
|
||||
|
||||
A single repository with pnpm workspaces for dependency linking and Turborepo for task
|
||||
orchestration and caching. Shared code lives in `packages/*`; deployables live in `apps/*`.
|
||||
|
||||
`@sport/types`, `@sport/validation` and `@sport/api-client` compile to CommonJS + `.d.ts`
|
||||
because NestJS consumes them at runtime. `@sport/ui` ships raw TypeScript and is compiled by
|
||||
each Next.js app via `transpilePackages` — no build step, no watcher, faster HMR.
|
||||
|
||||
Versions that must stay identical across the workspace (TypeScript, React, Next, Zod, ESLint)
|
||||
are pinned once in the `catalog:` block of `pnpm-workspace.yaml`.
|
||||
|
||||
## Consequences
|
||||
|
||||
A backend field rename surfaces as a frontend type error in the same commit. One
|
||||
lockfile, one CI pipeline, one lint configuration. The cost is a heavier initial install and
|
||||
the need for discipline about dependency direction (ADR-0004), which the ESLint boundary rules
|
||||
enforce mechanically.
|
||||
|
||||
## Alternatives considered
|
||||
|
||||
Polyrepo with a private npm registry — rejected: the publish/consume loop is
|
||||
slower than the entire feature it serves. Nx — comparable, but Turborepo's smaller surface fits
|
||||
a team that wants a build cache, not a build framework.
|
||||
Reference in New Issue
Block a user