{
  "compilerOptions": {
    "verbatimModuleSyntax": true,
    // Classification follows https://www.typescriptlang.org/tsconfig
    // Type Checking
    "strict": true,
    "exactOptionalPropertyTypes": false,
    "noFallthroughCasesInSwitch": true,
    "noImplicitAny": true,
    "noImplicitOverride": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noPropertyAccessFromIndexSignature": false,
    "noUncheckedIndexedAccess": false,
    "useUnknownInCatchVariables": true,
    // Modules
    "module": "ESNext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "types": ["affine__env"],
    // Emit
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    // skip type emit for @internal types
    // "stripInternal": true,
    // JavaScript Support
    "allowJs": false,
    "checkJs": false,
    // Interop Constraints
    "forceConsistentCasingInFileNames": true,
    "allowSyntheticDefaultImports": true,
    "isolatedModules": true,
    // Language and Environment
    "jsx": "preserve",
    "jsxImportSource": "@emotion/react",
    "lib": ["ESNext", "DOM"],
    "target": "ES2022",
    "useDefineForClassFields": false,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": false,
    // Projects
    "composite": true,
    "incremental": true,
    // Completeness
    "skipLibCheck": true, // skip all type checks for .d.ts files
    "paths": {
      "@affine/core/*": ["./packages/frontend/core/src/*"],
      "@affine/core": ["./packages/frontend/core/src/index.ts"],
      "@affine/cli/*": ["./tools/cli/src/*"],
      "@affine/server/*": ["./packages/backend/server/src/*"],
      "@affine/component": ["./packages/frontend/component/src/index"],
      "@affine/component/*": [
        "./packages/frontend/component/src/components/*/index",
        "./packages/frontend/component/src/components/*"
      ],
      "@affine/i18n": ["./packages/frontend/i18n/src"],
      "@affine/i18n/hooks": ["./packages/frontend/i18n/src/i18n-generated"],
      "@affine/debug": ["./packages/common/debug"],
      "@affine/env": ["./packages/common/env/src"],
      "@affine/env/*": ["./packages/common/env/src/*"],
      "@affine/graphql": ["./packages/frontend/graphql/src"],
      "@affine/electron/scripts/*": ["./packages/frontend/electron/scripts/*"],
      "@affine-test/kit/*": ["./tests/kit/*"],
      "@affine-test/fixtures/*": ["./tests/fixtures/*"],
      "@toeverything/infra": ["./packages/common/infra/src"],
      "@affine/native": ["./packages/frontend/native/index.d.ts"],
      "@affine/native/*": ["./packages/frontend/native/*"],
      "@affine/server-native": ["./packages/backend/native/index.d.ts"],
      // Development only
      "@affine/electron/*": ["./packages/frontend/electron/src/*"]
    }
  },
  "include": [],
  "references": [
    // Backend
    {
      "path": "./packages/backend/server"
    },
    {
      "path": "./packages/backend/server/tests"
    },
    // Frontend
    {
      "path": "./packages/frontend/component"
    },
    {
      "path": "./packages/frontend/core"
    },
    {
      "path": "./packages/frontend/web"
    },
    {
      "path": "./packages/frontend/electron/tsconfig.test.json"
    },
    {
      "path": "./packages/frontend/electron/renderer/tsconfig.json"
    },
    {
      "path": "./packages/frontend/graphql"
    },
    {
      "path": "./packages/frontend/i18n"
    },
    // Common
    {
      "path": "./packages/common/debug"
    },
    {
      "path": "./packages/common/env"
    },
    {
      "path": "./packages/common/infra"
    },
    // Tools
    {
      "path": "./tools/cli"
    },
    // Tests
    {
      "path": "./tests/kit"
    },
    {
      "path": "./tests/affine-local"
    },
    {
      "path": "./tests/affine-migration"
    },
    {
      "path": "./tests/affine-legacy/0.7.0-canary.18"
    },
    {
      "path": "./tests/affine-legacy/0.8.0-canary.7"
    },
    {
      "path": "./tests/affine-cloud"
    },
    {
      "path": "./tests/affine-desktop"
    },
    {
      "path": "./tests/affine-legacy/0.8.4"
    },
    {
      "path": "./tests/affine-legacy/0.6.1-beta.1"
    },
    // Others
    {
      "path": "./tsconfig.node.json"
    }
  ],
  "files": [],
  "exclude": ["node_modules", "target", "lib", "test-results"],
  "ts-node": {
    "esm": true,
    "compilerOptions": {
      "module": "ESNext",
      "moduleResolution": "Node"
    }
  }
}
