{
  "$schema": "https://json.schemastore.org/tsconfig",
  "display": "Base Node.js Bare",

  "compilerOptions": {
    "strict": true,

    "skipLibCheck": false, // See https://github.com/voxpelli/tsconfig/issues/1
    "esModuleInterop": true, // Default in TS 6.0+ and can no longer be set to false. Keep for TS 5.9 compat, remove when dropping 5.9
    "allowSyntheticDefaultImports": true, // Default in TS 6.0+ and can no longer be set to false. Keep for TS 5.9 compat, remove when dropping 5.9

    /* Node.js Module Setup */
    "module": "nodenext", // Supports require() of ESM, see: https://www.typescriptlang.org/docs/handbook/modules/reference.html#node16-node18-nodenext
    "moduleResolution": "nodenext", // Default when module is nodenext

    "lib": ["esnext"], // Avoids DOM libraries etc being included
    "target": "esnext", // Default when module is nodenext

    "types": ["node"], // Avoids automatic inclusion of all visible ”@types” packages to be included

    /* Clean up generated declarations */
    "removeComments": true,
    "stripInternal": true,

    /* New checks being tried out */
    "exactOptionalPropertyTypes": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noUncheckedIndexedAccess": true,
    "noUncheckedSideEffectImports": true, // Default in TS 6.0+. Keep for TS 5.9 compat, remove when dropping 5.9

    /* Additional checks */
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": false, // Deactivated as I believe implicit "return undefined" at end of function is okay + explicit clashes with ESLint "no-useless-return"
    "noUnusedLocals": true,
    "noUnusedParameters": true

    /* To make strict checking somewhat less strict during a transition stage, add one or more of: */
    /*
    "noImplicitThis": false,
    "noImplicitAny": false,
    "strictNullChecks": false,
    */
  }
}
