{
  "$schema": "https://json.schemastore.org/tsconfig",
  "compilerOptions": {
    "target": "es2021",
    "module": "esnext",
    "moduleResolution": "bundler",
    // We don't want to include types dependencies in our compiled output, so tell TypeScript
    // to enforce using `import type` instead of `import` for Types.
    "verbatimModuleSyntax": true,
    "allowJs": true,
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "allowArbitraryExtensions": true,
    "allowSyntheticDefaultImports": false,
    "allowImportingTsExtensions": true,
    "esModuleInterop": true,
    // --- Lint-style rules

    // TypeScript also supplies some lint-style checks; nearly all of them are
    // better handled by ESLint with the `@typescript-eslint`. This one is more
    // like a safety check, though, so we leave it on.
    "noPropertyAccessFromIndexSignature": true,
    // --- Compilation/integration settings
    // Setting `noEmitOnError` here allows tools trying to respect the tsconfig
    // to still emit code without breaking on errors.
    // Errors are still reported in the CLI when running `tsc`,
    // but the errors won't prevent code from being emitted.
    // This helps hasten development by allowing devs to prototype before coming
    // to a decision on what they want their types to be.
    "noEmitOnError": false,
    // We use Babel for emitting runtime code, because it's very important that
    // we always and only use the same transpiler for non-stable features.
    // If you were to change this to `true`, it could lead to accidentally
    // generating code with `tsc` instead of Babel, and could thereby
    // result in broken code at runtime.
    "emitDeclarationOnly": true,
    "declaration": true,
    "declarationMap": true,
    "declarationDir": "dist",
    "inlineSourceMap": true,
    "inlineSources": true,
    "skipLibCheck": true,
    "paths": {
      "src/*": ["./src/*"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}
