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)