{
  "$schema": "https://json.schemastore.org/tsconfig",
  "compilerOptions": {
    /* LANGUAGE COMPILATION OPTIONS */
    "target": "es6",
    "lib": ["DOM", "ES6", "ESNext"],
    "module": "commonjs",
    "moduleResolution": "Node16",
    "resolveJsonModule": true,

    /* EMIT RULES */
    "outDir": "./dist",
    "noEmit": true, // TSUP takes care of emitting js for us, in a MUCH faster way
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "removeComments": true,

    /* TYPE CHECKING RULES */
    "strict": true,
    // "noImplicitAny": true, // Included in "Strict"
    // "noImplicitThis": true, // Included in "Strict"
    // "strictBindCallApply": true, // Included in "Strict"
    // "strictFunctionTypes": true, // Included in "Strict"
    // "strictNullChecks": true, // Included in "Strict"
    // "strictPropertyInitialization": true, // Included in "Strict"
    "noFallthroughCasesInSwitch": true,
    "noImplicitOverride": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "useUnknownInCatchVariables": true,
    "noUncheckedIndexedAccess": true, // TLDR - Checking an indexed value (array[0]) now forces type <T | undefined> as there is no confirmation that index exists
    // THE BELOW ARE EXTRA STRICT OPTIONS THAT SHOULD ONLY BY CONSIDERED IN VERY SAFE PROJECTS
    // "exactOptionalPropertyTypes": true, // TLDR - Setting to undefined is not the same as a property not being defined at all
    // "noPropertyAccessFromIndexSignature": true, // TLDR - Use dot notation for objects if youre sure it exists, use ['index'] notaion if unsure

    /* OTHER OPTIONS */
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true,
    "useDefineForClassFields": true
  },
  "include": ["src"],
  "exclude": ["node_modules", "template"]
}
