diff --git a/.changeset/neat-swans-argue.md b/.changeset/neat-swans-argue.md
new file mode 100644
index 000000000..62099d99a
--- /dev/null
+++ b/.changeset/neat-swans-argue.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-vue": minor
+---
+
+Add TypeScript IntelliSense support via [eslint-typegen](https://github.com/antfu/eslint-typegen)
diff --git a/.gitignore b/.gitignore
index 0458765cd..d6fadf92c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,4 @@ yarn-error.log
/docs/.vitepress/.temp
/docs/.vitepress/cache
typings/eslint/lib/rules
+eslint-typegen.d.ts
diff --git a/eslint.config.js b/eslint.config.mjs
similarity index 87%
rename from eslint.config.js
rename to eslint.config.mjs
index 4ed1e816e..9cd54f623 100644
--- a/eslint.config.js
+++ b/eslint.config.mjs
@@ -1,13 +1,19 @@
-'use strict'
+import globals from 'globals'
+import eslintPluginEslintPlugin from 'eslint-plugin-eslint-plugin/configs/all'
+import eslintPluginJsonc from 'eslint-plugin-jsonc'
+import eslintPluginNodeDependencies from 'eslint-plugin-node-dependencies'
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
+import eslintPluginUnicorn from 'eslint-plugin-unicorn'
+import vueEslintParser from 'vue-eslint-parser'
+import noInvalidMeta from './eslint-internal-rules/no-invalid-meta.js'
+import noInvalidMetaDocsCategories from './eslint-internal-rules/no-invalid-meta-docs-categories.js'
+import requireEslintCommunity from './eslint-internal-rules/require-eslint-community.js'
-const globals = require('globals')
-const eslintPluginEslintPlugin = require('eslint-plugin-eslint-plugin/configs/all')
-const eslintPluginJsonc = require('eslint-plugin-jsonc')
-const eslintPluginNodeDependencies = require('eslint-plugin-node-dependencies')
-const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended')
-const eslintPluginUnicorn = require('eslint-plugin-unicorn')
+// @ts-check
+///
+import typegen from 'eslint-typegen'
-module.exports = [
+export default typegen([
{
ignores: [
'.nyc_output',
@@ -33,9 +39,9 @@ module.exports = [
plugins: {
internal: {
rules: {
- 'no-invalid-meta': require('./eslint-internal-rules/no-invalid-meta'),
- 'no-invalid-meta-docs-categories': require('./eslint-internal-rules/no-invalid-meta-docs-categories'),
- 'require-eslint-community': require('./eslint-internal-rules/require-eslint-community')
+ 'no-invalid-meta': noInvalidMeta,
+ 'no-invalid-meta-docs-categories': noInvalidMetaDocsCategories,
+ 'require-eslint-community': requireEslintCommunity
}
}
}
@@ -213,7 +219,7 @@ module.exports = [
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
- parser: require('vue-eslint-parser')
+ parser: vueEslintParser
}
},
{
@@ -241,4 +247,4 @@ module.exports = [
'prettier/prettier': 'off'
}
}
-]
+])
diff --git a/lib/index.d.ts b/lib/index.d.ts
index 8cbff659f..b6d658852 100644
--- a/lib/index.d.ts
+++ b/lib/index.d.ts
@@ -1,3 +1,4 @@
+///
import type { Linter } from 'eslint'
declare const vue: {
diff --git a/package.json b/package.json
index dac23e65e..31bba2216 100644
--- a/package.json
+++ b/package.json
@@ -21,12 +21,13 @@
"version": "npm run generate:version && git add .",
"update": "node ./tools/update.js",
"update-resources": "node ./tools/update-resources.js",
+ "typegen": "node ./tools/generate-typegen.mjs",
"docs:watch": "vitepress dev docs",
"predocs:build": "npm run update",
"docs:build": "vitepress build docs",
"generate:version": "env-cmd -e version npm run update && npm run lint -- --fix",
"changeset:version": "changeset version && npm run generate:version && git add --all",
- "changeset:publish": "changeset publish"
+ "changeset:publish": "npm run typegen && changeset publish"
},
"files": [
"lib"
@@ -98,6 +99,7 @@
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-unicorn": "^56.0.0",
"eslint-plugin-vue": "file:.",
+ "eslint-typegen": "^2.2.0",
"eslint-visitor-keys": "^4.2.0",
"espree": "^10.4.0",
"events": "^3.3.0",
diff --git a/tools/generate-typegen.mjs b/tools/generate-typegen.mjs
new file mode 100644
index 000000000..5bcb325a5
--- /dev/null
+++ b/tools/generate-typegen.mjs
@@ -0,0 +1,9 @@
+import fs from 'node:fs/promises'
+import { pluginsToRulesDTS } from 'eslint-typegen/core'
+import plugin from '../lib/index.js'
+
+const dts = await pluginsToRulesDTS({
+ vue: plugin
+})
+
+await fs.writeFile('lib/eslint-typegen.d.ts', dts)