{
  "$schema": "https://biomejs.dev/schemas/2.5.3/schema.json",
  "files": {
    "includes": [
      "**",
      "!**/vendor",
      "!!**/smoke",
      "!!**/fixtures",
      "!!**/fixture",
      "!!**/_temp-fixtures",
      "!!**/dist",
      "packages/language-tools/vscode/syntaxes/*.json",
      "!!**/.vscode-test",
      "!!benchmark/static-projects"
    ]
  },
  "vcs": {
    "enabled": true,
    "clientKind": "git",
    "useIgnoreFile": true
  },
  "formatter": {
    "indentStyle": "tab",
    "indentWidth": 2,
    "lineWidth": 100,
    "includes": ["**", "!**/.changeset", "!**/pnpm-lock.yaml", "!**/*.astro"],
    "expand": "auto"
  },
  "assist": {
    "actions": {
      "source": {
        "organizeImports": "off"
      }
    }
  },
  "linter": {
    "enabled": true,

    "domains": {
      "test": "recommended"
    },
    "rules": {
      "preset": "none",
      "style": {
        "useNodejsImportProtocol": "error",
        // Enforce separate type imports for type-only imports to avoid bundling unneeded code
        "useImportType": "error",
        "useExportType": "error",
        "useNumberNamespace": "warn",
        "noInferrableTypes": "error"
      },
      "suspicious": {
        // This one is specific to catch `console.log`. The rest of logs are permitted
        "noConsole": {
          "level": "warn",
          "options": {
            "allow": ["error", "warn", "info", "debug"]
          }
        },
        "noVar": "error",
        "noDoubleEquals": "error",
        "noDebugger": "error",
        "noDuplicateCase": "error",
        "noExplicitAny": "off",
        // To enable later
        "noImplicitAnyLet": "off",
        "noSparseArray": "error"
      },
      "correctness": {
        "noUnusedVariables": {
          "level": "error",
          "options": {
            "ignoreRestSiblings": true
          }
        },
        "noUnusedFunctionParameters": "error",
        "noUnusedImports": "error",
        "noUnreachable": "error",
        "noConstantCondition": "warn",
        "noConstructorReturn": "error",
        "noEmptyPattern": "error"
      },
      "complexity": {
        // There are many violations which require manual check
        "noForEach": "off",
        "noUselessFragments": "warn",
        "useFlatMap": "warn",
        // To enable later, as there are many warnings
        "useOptionalChain": "off"
      },
      "performance": {
        "noAccumulatingSpread": "warn"
      }
    }
  },
  "javascript": {
    "formatter": {
      "trailingCommas": "all",
      "quoteStyle": "single",
      "semicolons": "always"
    }
  },
  "json": {
    "parser": {
      "allowComments": true,
      "allowTrailingCommas": true
    },
    "formatter": {
      "indentStyle": "space",
      "trailingCommas": "none"
    }
  },
  "overrides": [
    {
      // Workaround to format files like npm does
      "includes": ["**/package.json"],
      "json": {
        "formatter": {
          "expand": "always"
        }
      }
    },
    {
      "includes": ["**/*.astro", "**/*.vue", "**/*.svelte"],
      "formatter": {
        "enabled": false
      },
      "linter": {
        "rules": {
          "correctness": {
            "noUnusedVariables": "off",
            "noUnusedImports": "off"
          }
        }
      }
    },
    {
      // We don't want to have node modules in code that should be runtime agnostic
      "includes": [
        "**/packages/astro/src/**/runtime/**/*.ts",
        "**/packages/astro/src/**/*runtime*.ts"
      ],
      "linter": {
        "rules": {
          "correctness": {
            "noNodejsModules": "error"
          }
        }
      }
    },
    {
      "includes": ["**/*.astro", "**/client.d.ts", "**/jsx-runtime.d.ts"],
      "linter": {
        "rules": {
          "correctness": {
            "noUnusedVariables": "off",
            "noUnusedImports": "off"
          }
        }
      }
    },
    {
      "includes": ["**/packages/integrations/**/*.ts"],
      "linter": {
        "rules": {
          "suspicious": {
            "noConsole": {
              "level": "error",
              "options": {
                "allow": ["warn", "error", "info", "debug"]
              }
            }
          }
        }
      }
    },
    {
      "includes": [
        "**/benchmark/**/*.js",
        "**/packages/astro/src/cli/**/*.ts",
        "**/packages/astro/bin/**/*.mjs"
      ],
      "linter": {
        "rules": {
          "suspicious": {
            "noConsole": "off"
          }
        }
      }
    },
    {
      "includes": ["**/astro/test/**"],
      "linter": {
        "rules": {
          "style": {
            "noRestrictedImports": {
              "level": "error",
              "options": {
                "patterns": [
                  {
                    "group": ["**/src/**"],
                    "message": "The test should not import the source code. Import the code from the dist/ folder instead."
                  }
                ]
              }
            }
          }
        }
      }
    }
  ]
}
