{
  "compilerOptions": {
    // -> Node 26 runs TypeScript directly by stripping types at load time, so there is
    //    no build step. `tsc` is only ever used as a type checker (see `npm run typecheck`).
    "noEmit": true,

    // -> Module resolution matching Node's own ESM resolver
    "module": "nodenext",
    "moduleResolution": "nodenext",
    "target": "esnext",
    "lib": ["esnext"],
    "types": ["node"],
    "resolveJsonModule": true,

    // -> Required for type stripping:
    //    Node needs the real on-disk specifier, so relative imports must say `.ts`.
    "allowImportingTsExtensions": true,
    //    Node can only erase types, never transform them. Bans enums, namespaces,
    //    parameter properties and anything else that emits runtime code.
    "erasableSyntaxOnly": true,
    //    Forces `import type` for type-only imports, so nothing survives erasure.
    "verbatimModuleSyntax": true,
    "isolatedModules": true,

    // -> The backend is fully TypeScript; the only remaining .js is generated/vendored content
    //    (locales/metadata.js), which is excluded below.
    "allowJs": false,

    // -> Correctness
    "strict": true,
    "noImplicitOverride": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true
  },
  "include": ["**/*.ts"],
  "exclude": ["node_modules", "db/migrations", "locales"]
}
