Skip to main content
TailStack uses different TypeScript configurations optimized for server-side (Node.js) and client-side (React/Vite) environments.

Server Configuration

The backend server uses a single tsconfig.json optimized for Node.js with ES2022 modules.

Server tsconfig.json

Location: source/Server/tsconfig.json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ES2022",
    "moduleResolution": "bundler",
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "outDir": "dist",
    "strict": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": false,
    "allowImportingTsExtensions": true,
    "ignoreDeprecations": "6.0",
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules",
    "dist"
  ]
}

Server Compiler Options

target
string
default:"ES2022"
Compilation target - ES2022 provides modern JavaScript features while maintaining broad Node.js compatibility
module
string
default:"ES2022"
Module system - ES2022 enables native ESM support in Node.js
moduleResolution
string
default:"bundler"
Module resolution strategy - “bundler” mode optimized for modern bundlers and runtimes like tsx
esModuleInterop
boolean
default:true
Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports
resolveJsonModule
boolean
default:true
Allow importing JSON files as modules
outDir
string
default:"dist"
Output directory for compiled JavaScript files
strict
boolean
default:true
Enable all strict type-checking options (noImplicitAny, strictNullChecks, etc.)
skipLibCheck
boolean
default:true
Skip type checking of declaration files - improves compilation performance
noEmit
boolean
default:false
Allow emitting compiled files - set to false so tsc can build the project
allowImportingTsExtensions
boolean
default:true
Allow importing TypeScript files with .ts extensions
baseUrl
string
default:"."
Base directory for resolving non-relative module names
paths
object
Path mapping for module resolution. The @/* alias maps to ./src/* for cleaner imports

Frontend Configuration

The React frontend uses a composite TypeScript project with three configuration files for different contexts.

Frontend tsconfig.json (Root)

Location: source/frontend/tsconfig.json
{
  "files": [],
  "references": [
    {
      "path": "./tsconfig.app.json"
    },
    {
      "path": "./tsconfig.node.json"
    }
  ],
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
This is a project references configuration that delegates to specialized configs:
  • tsconfig.app.json - Application source code
  • tsconfig.node.json - Build tooling (Vite config)
references
array
TypeScript project references enable composite projects with separate compilation contexts

Frontend tsconfig.app.json

Location: source/frontend/tsconfig.app.json Configuration for React application code:
{
  "compilerOptions": {
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
    "target": "ES2022",
    "useDefineForClassFields": true,
    "lib": ["ES2022", "DOM", "DOM.Iterable"],
    "module": "ESNext",
    "types": ["vite/client"],
    "skipLibCheck": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    },

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "verbatimModuleSyntax": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "react-jsx",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "erasableSyntaxOnly": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true
  },
  "include": ["src"]
}

Application Compiler Options

tsBuildInfoFile
string
Location for incremental compilation cache file
target
string
default:"ES2022"
Target ES2022 for modern browser features
useDefineForClassFields
boolean
default:true
Use ECMAScript-standard semantics for class fields (required for React 19)
lib
array
default:["ES2022","DOM","DOM.Iterable"]
Type definitions to include - ES2022 for language features, DOM for browser APIs
module
string
default:"ESNext"
Use latest ES module features
types
array
default:["vite/client"]
Include Vite’s client type definitions for import.meta.env, etc.
moduleResolution
string
default:"bundler"
Bundler mode - optimized for Vite’s module resolution
verbatimModuleSyntax
boolean
default:true
Emit exactly what you write for imports/exports (prevents type-only import issues)
moduleDetection
string
default:"force"
Force all files to be treated as modules (even without imports/exports)
noEmit
boolean
default:true
Don’t emit files - Vite handles bundling
jsx
string
default:"react-jsx"
Use React 17+ automatic JSX runtime (no need to import React)
noUnusedLocals
boolean
default:true
Report errors on unused local variables
noUnusedParameters
boolean
default:true
Report errors on unused function parameters
erasableSyntaxOnly
boolean
default:true
Ensure only type-erasable syntax is used (important for bundler transpilation)
noFallthroughCasesInSwitch
boolean
default:true
Report errors for fallthrough cases in switch statements
noUncheckedSideEffectImports
boolean
default:true
Warn when importing modules that might have side effects

Frontend tsconfig.node.json

Location: source/frontend/tsconfig.node.json Configuration for build tooling (Vite config files):
{
  "compilerOptions": {
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
    "target": "ES2023",
    "lib": ["ES2023"],
    "module": "ESNext",
    "types": ["node"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "verbatimModuleSyntax": true,
    "moduleDetection": "force",
    "noEmit": true,

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "erasableSyntaxOnly": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true
  },
  "include": ["vite.config.ts"]
}
target
string
default:"ES2023"
Newer ES2023 target since build tools run in Node.js environment
lib
array
default:["ES2023"]
Only ES2023 library (no DOM APIs needed for build tools)
types
array
default:["node"]
Include Node.js type definitions for build tooling
include
array
default:["vite.config.ts"]
Only type-check Vite configuration files

Path Aliases

All configurations include the @/* path alias for cleaner imports:
// Instead of:
import { config } from '../../../config';

// Use:
import { config } from '@/config';
The @/* alias is configured in both TypeScript and Vite to ensure consistent resolution at compile-time and runtime.

Project References Benefits

The composite project structure provides:
  1. Separation of concerns - App code and build tools have different type requirements
  2. Faster compilation - Only rebuild changed projects
  3. Better editor performance - Separate contexts reduce type-checking overhead
  4. Parallel builds - TypeScript can build referenced projects concurrently

Common TypeScript Commands

# Type-check without emitting
tsc --noEmit

# Build server (emits to dist/)
tsc

# Build frontend (type-check only, Vite handles bundling)
tsc -b

# Watch mode
tsc --watch

Build docs developers (and LLMs) love