{
  "$schema": "https://json.schemastore.org/eslintrc",
  "ignorePatterns": [
    "dist",
    "public",
    "node_modules",
    "packages/schema/schema"
  ],
  "globals": {
    "NodeJS": true,
    "$fetch": true
  },
  "plugins": ["jsdoc", "import", "unicorn", "no-only-tests"],
  "extends": [
    "plugin:jsdoc/recommended",
    "@nuxt/eslint-config",
    "plugin:import/typescript"
  ],
  "rules": {
    "sort-imports": [
      "error",
      {
        "ignoreDeclarationSort": true
      }
    ],
    "no-only-tests/no-only-tests": "error",
    "unicorn/prefer-node-protocol": "error",
    "no-console": "warn",
    "vue/one-component-per-file": "off",
    "vue/require-default-prop": "off",

    // Vue stylistic rules from `@antfu/eslint-config`
    "vue/array-bracket-spacing": ["error", "never"],
    "vue/arrow-spacing": ["error", { "after": true, "before": true }],
    "vue/block-spacing": ["error", "always"],
    "vue/block-tag-newline": [
      "error",
      {
        "multiline": "always",
        "singleline": "always"
      }
    ],
    "vue/brace-style": ["error", "stroustrup", { "allowSingleLine": true }],
    "vue/comma-dangle": ["error", "always-multiline"],
    "vue/comma-spacing": ["error", { "after": true, "before": false }],
    "vue/comma-style": ["error", "last"],
    "vue/html-comment-content-spacing": [
      "error",
      "always",
      {
        "exceptions": ["-"]
      }
    ],
    "vue/key-spacing": ["error", { "afterColon": true, "beforeColon": false }],
    "vue/keyword-spacing": ["error", { "after": true, "before": true }],
    "vue/object-curly-newline": "off",
    "vue/object-curly-spacing": ["error", "always"],
    "vue/object-property-newline": [
      "error",
      { "allowMultiplePropertiesPerLine": true }
    ],
    "vue/operator-linebreak": ["error", "before"],
    "vue/padding-line-between-blocks": ["error", "always"],
    "vue/quote-props": ["error", "consistent-as-needed"],
    "vue/space-in-parens": ["error", "never"],
    "vue/template-curly-spacing": "error",

    "jsdoc/require-jsdoc": "off",
    "jsdoc/require-param": "off",
    "jsdoc/require-returns": "off",
    "jsdoc/require-param-type": "off",
    "import/order": [
      "error",
      {
        "pathGroups": [
          {
            "pattern": "#vue-router",
            "group": "external"
          }
        ]
      }
    ],
    "import/no-restricted-paths": [
      "error",
      {
        "zones": [
          {
            "from": "packages/nuxt/src/!(core)/**/*",
            "target": "packages/nuxt/src/core",
            "message": "core should not directly import from modules."
          },
          {
            "from": "packages/nuxt/src/!(app)/**/*",
            "target": "packages/nuxt/src/app",
            "message": "app should not directly import from modules."
          },
          {
            "from": "packages/nuxt/src/app/**/index.ts",
            "target": "packages/nuxt/src",
            "message": "should not import from barrel/index files"
          },
          {
            "from": "packages/nitro",
            "target": "packages/!(nitro)/**/*",
            "message": "nitro should not directly import other packages."
          }
        ]
      }
    ],
    "@typescript-eslint/consistent-type-imports": [
      "error",
      {
        "disallowTypeAnnotations": false
      }
    ],
    "@typescript-eslint/ban-ts-comment": [
      "error",
      {
        "ts-expect-error": "allow-with-description",
        "ts-ignore": true
      }
    ],
    "@typescript-eslint/prefer-ts-expect-error": "error",
    "@typescript-eslint/no-unused-vars": [
      "error",
      {
        "argsIgnorePattern": "^_",
        "varsIgnorePattern": "^_",
        "ignoreRestSiblings": true
      }
    ],
    "jsdoc/check-tag-names": [
      "error",
      {
        "definedTags": ["__NO_SIDE_EFFECTS__"]
      }
    ]
  },
  "overrides": [
    {
      "files": ["packages/schema/**"],
      "rules": {
        "jsdoc/valid-types": "off",
        "jsdoc/check-tag-names": [
          "error",
          {
            "definedTags": ["experimental"]
          }
        ]
      }
    },
    {
      "files": ["packages/nuxt/src/app/**", "test/**", "**/runtime/**"],
      "rules": {
        "no-console": "off"
      }
    }
  ],
  "settings": {
    "jsdoc": {
      "ignoreInternal": true,
      "tagNamePreference": {
        "warning": "warning",
        "note": "note"
      }
    }
  }
}