Files
tools/configs/tsconfig
Renovate Bot bce817bc05
CI / @robonen/crdt (pull_request) Failing after 4m43s
CI / @robonen/docs (pull_request) Failing after 20s
CI / @robonen/encoding (pull_request) Failing after 6s
CI / @robonen/eslint (pull_request) Failing after 36m41s
CI / @robonen/fetch (pull_request) Failing after 37m56s
CI / @robonen/platform (pull_request) Failing after 3m25s
CI / @robonen/primitives (pull_request) Failing after 3m19s
CI / @robonen/primitives-playground (pull_request) Failing after 28m54s
CI / @robonen/renovate (pull_request) Failing after 1m17s
CI / @robonen/stdlib (pull_request) Failing after 2m56s
CI / @robonen/stories (pull_request) Failing after 2m14s
CI / @robonen/tsconfig (pull_request) Failing after 2m57s
CI / @robonen/tsdown (pull_request) Failing after 33m13s
CI / @robonen/vue (pull_request) Failing after 2m54s
CI / @robonen/writekit (pull_request) Failing after 4m20s
CI / @robonen/writekit-playground (pull_request) Failing after 34m43s
CI / CI (pull_request) Failing after 5s
chore(deps): update pnpm to v11
2026-06-16 00:04:26 +00:00
..
2026-06-16 00:04:26 +00:00

@robonen/tsconfig

Shared TypeScript configurations.

Install

pnpm install -D @robonen/tsconfig

Presets

Preset Extends Use for
tsconfig.base.json Node / isomorphic libraries (lib: ESNext, no DOM)
tsconfig.dom.json base Browser libraries (adds DOM, DOM.Iterable)
tsconfig.vue.json dom Vue SFC libraries / apps (adds jsx, vueCompilerOptions)
tsconfig.node.json base Build/test tooling files (*.config.ts) — adds types: ["node"], no DOM
tsconfig.json base Default alias for base (bare @robonen/tsconfig import)

Usage

Pick the preset that matches the package and extend it:

// Node / isomorphic library
{ "extends": "@robonen/tsconfig/tsconfig.base.json" }
// Browser library
{ "extends": "@robonen/tsconfig/tsconfig.dom.json" }
// Vue package, with path aliases
{
  "extends": "@robonen/tsconfig/tsconfig.vue.json",
  "compilerOptions": {
    "paths": { "@/*": ["./src/*"] }
  }
}

Path aliases resolve relative to the tsconfig.json location — baseUrl is intentionally omitted (deprecated, removed in TypeScript 7.0).

Project references (DOM + Node split)

Most packages contain two environments: browser/library src (DOM) and Node tooling files (vite.config.ts, vitest.config.ts, tsdown.config.ts). They are split into separate projects wired with references, so src never sees Node globals and config files never see DOM:

// tsconfig.json — solution root, tools (tsdown/vitest/editor) target src below
{
  "files": [],
  "references": [
    { "path": "./tsconfig.src.json" },
    { "path": "./tsconfig.node.json" }
  ]
}
// tsconfig.src.json — the library code
{
  "extends": "@robonen/tsconfig/tsconfig.dom.json",
  "compilerOptions": {
    "composite": true,
    "types": [],
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.src.tsbuildinfo"
  },
  "include": ["src/**/*.ts"]
}
// tsconfig.node.json — build/test tooling files
{
  "extends": "@robonen/tsconfig/tsconfig.node.json",
  "compilerOptions": {
    "composite": true,
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo"
  },
  "include": ["*.config.ts"]
}

Type-check the whole package (both projects) with tsc -b / vue-tsc -b. Point tsdown at the src project (tsconfig: './tsconfig.src.json') since the root has no compilerOptions.

What's included (base)

  • Target / Module: ESNext with module: Preserve + Bundler resolution
  • Strict mode: strict, noUncheckedIndexedAccess, noImplicitOverride, noImplicitReturns, noFallthroughCasesInSwitch, noUncheckedSideEffectImports
  • Module safety: verbatimModuleSyntax, isolatedModules, moduleDetection: force
  • Type-check only: noEmit (declarations/output are produced by tsdown)
  • Interop: esModuleInterop, resolveJsonModule