TypeScript Skill (pnpm + Turbo by default)
Baseline setup to reuse across projects. We standardize on pnpm workspaces and Turborepo for task orchestration.
Workspace & Package Manager
- Use pnpm (9.x or later) and declare it in
package.json:{ "packageManager": "pnpm@9.x", "private": true } - Add
pnpm-workspace.yamlwith your package globs (e.g.,packages/*). - Root scripts should fan out via pnpm:
pnpm -r lint,pnpm -r test,pnpm -r build.
Turbo as the Task Graph
- Add a minimal
turbo.json:{ "pipeline": { "lint": { "outputs": [] }, "test": { "dependsOn": ["^build"], "outputs": [] }, "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] } } } - Run with
pnpm turbo lint test build(or shorter aliases). - Keep per-package scripts named
lint,test,build,typecheckso Turbo and pnpm can compose them.
TS Baseline
- Node 18+ (prefer 20), ESM (
"type": "module"),target: ES2022+,moduleResolution: node16|bundler,strict: true,resolveJsonModule: true,skipLibCheck: true,sourceMap: true. - Root
tsconfig.base.json; each package extends it and setsrootDir: src,outDir: dist. Usecomposite: true+ project references for multi-package builds andtsc -b.
Standard Scripts
typecheck:tsc --noEmitlint: ESLint with@typescript-eslint/*build:tsc -bfor libs/services; usetsupwhen you need bundled ESM+CJS + d.tstest: Vitest or Jest; keeptypecheckseparate so test runners don’t hide TS errors- Root aliases:
pnpm -r typecheck,pnpm -r lint,pnpm -r build,pnpm -r test; Turbo can wrap these when you want caching.
DX & Code Hygiene
- Use
tsxfor local scripts (pnpm add -D tsx), avoidts-nodeunless necessary. - Validate inputs/env at boundaries (e.g.,
zod) to turnunknowninto typed data. - Prefer
unknownoverany; explicit return types on exports; keepstrictgreen by fixing code, not loosening config. - Imports stay in
src/; never import from build outputs. Prefer ESM; use CJS only if the target requires it. - Error handling: throw
Errorsubclasses with context; avoid silent catches. UsePromise.allSettledfor fan-out when partial failure is acceptable.
Lint / Format
- ESLint with
@typescript-eslint/parserand recommended configs; setparserOptions.projectwhen rules need type info. - Prettier for formatting; keep lint separate. Optional pre-commit via
lint-staged+simple-git-hooks, or enforce in CI.
Maintenance Extras
- Knip/depcheck for unused exports/deps sweeps.
- Changesets if you publish/version packages.
- Central
env.tsthat validates and typesprocess.env.