Lab 03: Monorepo Architecture

Time: 60 minutes | Level: Architect | Docker: node:20-alpine

Overview

TypeScript monorepo at scale: npm workspaces + tsc project references (composite/incremental/declarationMap), shared ESLint+tsconfig inheritance, changesets for versioning, Turborepo build caching, and path alias synchronization across packages.


Step 1: Monorepo Structure

monorepo/
├── package.json                     # Root: workspaces config
├── tsconfig.base.json               # Shared compiler options
├── turbo.json                       # Build pipeline
├── packages/
│   ├── utils/                       # @company/utils
│   │   ├── package.json
│   │   ├── tsconfig.json            # composite: true, extends base
│   │   └── src/index.ts
│   ├── api-client/                  # @company/api-client
│   │   ├── package.json
│   │   ├── tsconfig.json
│   │   └── src/index.ts
│   └── ui/                          # @company/ui
│       ├── package.json
│       ├── tsconfig.json
│       └── src/index.ts
└── apps/
    ├── web/                         # Next.js app
    │   ├── package.json
    │   └── tsconfig.json            # references: utils, api-client, ui
    └── api/                         # Express app
        ├── package.json
        └── tsconfig.json            # references: utils, api-client

Step 2: Root Configuration


Step 3: Package tsconfig — Composite + Incremental


Step 4: App tsconfig with Project References


Step 5: Build with tsc --build

💡 With composite + incremental, rebuilding only changed packages makes CI 10-50x faster in large monorepos. The .tsbuildinfo file caches the dependency graph.


Step 6: Shared ESLint Config


Step 7: Changesets for Versioning


Step 8: Turborepo Build Pipeline

📸 Verified Output (npm workspaces token resolution):


Summary

Feature
Config
Benefit

Workspaces

package.json#workspaces

Package linking

Project references

tsconfig#references

Ordered builds

Composite mode

composite: true

Enables references

Incremental builds

.tsbuildinfo

10-50x faster CI

Declaration maps

declarationMap: true

Source navigation

Shared tsconfig

extends chain

Single source of truth

Changesets

.changeset/*.md

Automated versioning

Turborepo

turbo.json pipeline

Remote cache + parallelism

Last updated