Repository navigation
v2.0.0
A new generation of the template:
- Node 26 and TypeScript 7, the native compiler.
- Every package builds with the TypeScript compiler; tsup is gone.
- pnpm 12 pins the Node version, which replaces Volta.
- The README has diagrams of how the pieces fit together.
Changed
- TypeScript 7.0.2. It ships no JavaScript compiler API, and tsup calls that API, so tsup is removed.
tscbuilds every package. It writes one ES module and one declaration file per source file, with maps. Build scripts deletedistfirst.- Rollup builds the script-tag file. Rollup 4.65.0 with terser bundles
tsc's output for the browser example. The minified file dropped from 731 B to 511 B. - Node 26. It becomes LTS on 2026-10-28. The template uses the
@tsconfig/node26preset,@types/node26.6.5 andengines.node >=26. Node packages no longer see browser globals:DOMis set only in the browser tests' config. - pnpm 12.15.0 replaces Volta, which is unmaintained.
devEngines.runtimepins Node 26.12.1. pnpm downloads that Node and records it in the lockfile, and CI reads the same pin.- npm and npx refuse to run in the repository unless Node matches the pin exactly. Use
pnpm dlxorpnpm execinstead.
- Stricter installs.
minimumReleaseAgeStrict: truemakes a too-new version fail the install.- pnpm 12 rejects misspelled settings.
- Install scripts run only for packages listed in
allowBuilds.
- Renovate holds
@types/nodeto 26.x. - README diagrams cover the package graph and build order, build outputs, where each version is pinned, the dependency update flow, and the release jobs with their permissions.
Changes for existing projects
A project created from v1.2.1 would change the following to match:
- Install pnpm 12:
npm install -g pnpm@12.15.0. pnpm 10 can't switch itself to pnpm 12. package.json(root).- Set
packageManagertopnpm@12.15.0andengines.nodeto>=26. - Remove the
voltablock. - Add
"devEngines": { "runtime": { "name": "node", "version": "26.12.1", "onFail": "download" } }. - Don't add
devEngines.packageManager: npm pack rejects it.
- Set
- TypeScript 7.
- Pin
typescriptto7.0.2. Replace@tsconfig/node-ltswith@tsconfig/node26@26.0.1, and pin@types/nodeto26.6.5. - In the root
tsconfig.json, extend@tsconfig/node26/tsconfig.json, and removecompositeand theliboverride. - Remove project
referencesfrom package tsconfigs. - Put
"lib": ["ES2025", "DOM"]in any tsconfig that needs browser globals.
- Pin
- Builds.
- Remove
tsupand everytsup.config.ts. - Set each package's
buildtorm -rf dist && tsc -p tsconfig.json, and itsdevtotsc -p tsconfig.json --watch. - Command packages append
&& chmod +x dist/cli.jstobuild. - Script-tag builds append
&& rollup -c, with arollup.config.jsthat bundlesdist/index.jsasiifethrough@rollup/plugin-terser. - Imports between source files need file extensions (
./thing.js), whichNodeNextalready enforces.
- Remove
pnpm-workspace.yaml. AddminimumReleaseAgeStrict: true, and anallowBuildsmap with an entry for each dependency that has an install script (esbuild: falsehere). Then reinstall.- Renovate. Change the
@types/noderule'sallowedVersionsto26.x.
Declarations change shape: one .d.ts per source file, where tsup produced one bundled file per entry. Run pnpm check:packages to confirm the packages still resolve for consumers.