From b9ad774fac76f6de62e80063e7c48fa1894405c4 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 21 Aug 2025 17:39:23 +0800 Subject: [PATCH 01/31] feat: introduce `tsdown`, support js & ts --- .gitignore | 1 + eslint.config.mjs | 1 + lib/meta.js | 3 --- lib/meta.ts | 3 +++ package.json | 7 ++++--- tsdown.config.ts | 9 +++++++++ 6 files changed, 18 insertions(+), 6 deletions(-) delete mode 100644 lib/meta.js create mode 100644 lib/meta.ts create mode 100644 tsdown.config.ts diff --git a/.gitignore b/.gitignore index d6fadf92c..5a7a63a56 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ yarn-error.log /docs/.vitepress/cache typings/eslint/lib/rules eslint-typegen.d.ts +dist diff --git a/eslint.config.mjs b/eslint.config.mjs index 0fe41f792..e30b18a35 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -49,6 +49,7 @@ const MD_LINKS_FOR_DOCS = { export default typegen([ { ignores: [ + 'dist', '.nyc_output', 'coverage', 'node_modules', diff --git a/lib/meta.js b/lib/meta.js deleted file mode 100644 index d70069950..000000000 --- a/lib/meta.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' -const { name, version } = require('../package.json') -module.exports = { name, version } diff --git a/lib/meta.ts b/lib/meta.ts new file mode 100644 index 000000000..55688c5c6 --- /dev/null +++ b/lib/meta.ts @@ -0,0 +1,3 @@ +import { name, version } from '../package.json' + +export { name, version } diff --git a/package.json b/package.json index d1e693690..0677581b6 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "name": "eslint-plugin-vue", "version": "10.4.0", "description": "Official ESLint plugin for Vue.js", - "main": "lib/index.js", - "types": "lib/index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "scripts": { "new": "node tools/new-rule.js", "start": "npm run test:base -- --watch --growl", @@ -30,7 +30,7 @@ "changeset:publish": "npm run typegen && changeset publish" }, "files": [ - "lib" + "dist" ], "homepage": "https://eslint.vuejs.org", "keywords": [ @@ -115,6 +115,7 @@ "markdownlint-cli": "^0.42.0", "pathe": "^1.1.2", "prettier": "^3.3.3", + "tsdown": "^0.14.1", "typescript": "^5.7.2", "vite-plugin-eslint4b": "^0.5.1", "vitepress": "^1.4.1", diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 000000000..c53ea6374 --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: ['lib/index.js'], + format: ['cjs'], + copy: ['lib/index.d.ts'], + dts: false, + unbundle: true +}) From 928fe26ae62ed7c52c9cd197efb084536b6843c5 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 21 Aug 2025 17:54:09 +0800 Subject: [PATCH 02/31] fix: dont bundle typescript --- tsdown.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tsdown.config.ts b/tsdown.config.ts index c53ea6374..7c111ecab 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -5,5 +5,6 @@ export default defineConfig({ format: ['cjs'], copy: ['lib/index.d.ts'], dts: false, + external: ['typescript'], unbundle: true }) From 1b24273fafca062ebad9e1b16f8cef2534395c95 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 08:52:40 +0800 Subject: [PATCH 03/31] chore: update --- lib/meta.ts | 2 +- tsconfig.json | 6 +++--- tsdown.config.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/meta.ts b/lib/meta.ts index 55688c5c6..f5e106e02 100644 --- a/lib/meta.ts +++ b/lib/meta.ts @@ -1,3 +1,3 @@ -import { name, version } from '../package.json' +import { name, version } from '../package.json' with { type: 'json' } export { name, version } diff --git a/tsconfig.json b/tsconfig.json index b488a6b93..ac453bb65 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "ES2019", - "module": "node16", - "moduleResolution": "Node16", + "target": "esnext", + "module": "preserve", + "moduleResolution": "bundler", "lib": ["es2020"], "allowJs": true, "checkJs": true, diff --git a/tsdown.config.ts b/tsdown.config.ts index 7c111ecab..0e0815ae1 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -5,6 +5,6 @@ export default defineConfig({ format: ['cjs'], copy: ['lib/index.d.ts'], dts: false, - external: ['typescript'], + skipNodeModulesBundle: true, unbundle: true }) From 0f786d8d7d1f4ed21174085904d3a5817680f966 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 09:03:57 +0800 Subject: [PATCH 04/31] chore: update --- docs/.vitepress/theme/index.ts | 5 ----- tsconfig.json | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 757e63cab..a0943fd5f 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -9,15 +9,10 @@ if (typeof window !== 'undefined') { } } } -// @ts-expect-error -- Cannot change `module` option import type { Theme } from 'vitepress' -// @ts-expect-error -- Cannot change `module` option import DefaultTheme from 'vitepress/theme' -// @ts-expect-error -- ignore import Layout from './Layout.vue' -// @ts-expect-error -- ignore import ESLintCodeBlock from './components/eslint-code-block.vue' -// @ts-expect-error -- ignore import RulesTable from './components/rules-table.vue' const theme: Theme = { diff --git a/tsconfig.json b/tsconfig.json index ac453bb65..a8517c036 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,8 @@ "noFallthroughCasesInSwitch": true, "esModuleInterop": true, "resolveJsonModule": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, "baseUrl": ".", "paths": { "*": ["typings/*"] From aedcd8df37893bc81df5e4e6c1e11c73153abd28 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 09:43:55 +0800 Subject: [PATCH 05/31] refactor: rewrite `processor` in ts --- lib/{processor.js => processor.ts} | 72 ++++++++++++------------------ 1 file changed, 28 insertions(+), 44 deletions(-) rename lib/{processor.js => processor.ts} (74%) diff --git a/lib/processor.js b/lib/processor.ts similarity index 74% rename from lib/processor.js rename to lib/processor.ts index b7268fab9..5c01f41ef 100644 --- a/lib/processor.js +++ b/lib/processor.ts @@ -1,44 +1,33 @@ /** * @author Toru Nagashima */ -'use strict' +import type { Linter } from 'eslint' -/** - * @typedef {import('eslint').Linter.LintMessage} LintMessage - */ -/** - * @typedef {object} GroupState - * @property {Set} GroupState.disableAllKeys - * @property {Map} GroupState.disableRuleKeys - */ +type LintMessage = Linter.LintMessage + +interface GroupState { + disableAllKeys: Set + disableRuleKeys: Map +} -module.exports = { - /** @param {string} code */ - preprocess(code) { +export default { + preprocess(code: string) { return [code] }, - /** - * @param {LintMessage[][]} messages - * @returns {LintMessage[]} - */ - postprocess(messages) { + postprocess(messages: LintMessage[][]) { const state = { - /** @type {GroupState} */ block: { - disableAllKeys: new Set(), - disableRuleKeys: new Map() - }, - /** @type {GroupState} */ + disableAllKeys: new Set(), + disableRuleKeys: new Map() + } as GroupState, line: { - disableAllKeys: new Set(), - disableRuleKeys: new Map() - } + disableAllKeys: new Set(), + disableRuleKeys: new Map() + } as GroupState } - /** @type {string[]} */ - const usedDisableDirectiveKeys = [] - /** @type {Map} */ - const unusedDisableDirectiveReports = new Map() + const usedDisableDirectiveKeys: string[] = [] + const unusedDisableDirectiveReports = new Map() // Filter messages which are in disabled area. const filteredMessages = messages[0].filter((message) => { @@ -139,12 +128,11 @@ module.exports = { meta: require('./meta') } -/** - * @param {Map} disableRuleKeys - * @param {string} rule - * @param {string} key - */ -function addDisableRule(disableRuleKeys, rule, key) { +function addDisableRule( + disableRuleKeys: GroupState['disableRuleKeys'], + rule: string, + key: string +) { let keys = disableRuleKeys.get(rule) if (keys) { keys.push(key) @@ -154,11 +142,7 @@ function addDisableRule(disableRuleKeys, rule, key) { } } -/** - * @param {LintMessage} message - * @returns {string} message key - */ -function messageToKey(message) { +function messageToKey(message: LintMessage) { return `line:${message.line},column${ // -1 because +1 by ESLint's `report-translator`. message.column - 1 @@ -167,11 +151,11 @@ function messageToKey(message) { /** * Compares the locations of two objects in a source file - * @param {Position} itemA The first object - * @param {Position} itemB The second object - * @returns {number} A value less than 1 if itemA appears before itemB in the source file, greater than 1 if + * @param itemA The first object + * @param itemB The second object + * @returns A value less than 1 if itemA appears before itemB in the source file, greater than 1 if * itemA appears after itemB in the source file, or 0 if itemA and itemB have the same location. */ -function compareLocations(itemA, itemB) { +function compareLocations(itemA: Position, itemB: Position) { return itemA.line - itemB.line || itemA.column - itemB.column } From bd930b78e6c8b81aa72a06b12598bac67920ad61 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 10:01:16 +0800 Subject: [PATCH 06/31] chore: specific tsdown target --- tsdown.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tsdown.config.ts b/tsdown.config.ts index 0e0815ae1..4db6eadf8 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from 'tsdown' export default defineConfig({ + target: 'node18', entry: ['lib/index.js'], format: ['cjs'], copy: ['lib/index.d.ts'], From 79d440d27d1f5acec4ffb0431ead6f6a3b63a256 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 10:03:01 +0800 Subject: [PATCH 07/31] fix: dont touch docs --- docs/.vitepress/theme/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index a0943fd5f..757e63cab 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -9,10 +9,15 @@ if (typeof window !== 'undefined') { } } } +// @ts-expect-error -- Cannot change `module` option import type { Theme } from 'vitepress' +// @ts-expect-error -- Cannot change `module` option import DefaultTheme from 'vitepress/theme' +// @ts-expect-error -- ignore import Layout from './Layout.vue' +// @ts-expect-error -- ignore import ESLintCodeBlock from './components/eslint-code-block.vue' +// @ts-expect-error -- ignore import RulesTable from './components/rules-table.vue' const theme: Theme = { From 18d7488c01a71b61c22e3ebd2520e169594b6136 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 10:14:59 +0800 Subject: [PATCH 08/31] ci: try fix --- docs/.vitepress/theme/components/eslint-code-block.vue | 2 +- package.json | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/.vitepress/theme/components/eslint-code-block.vue b/docs/.vitepress/theme/components/eslint-code-block.vue index 12cd1ff8b..8c3eed9b7 100644 --- a/docs/.vitepress/theme/components/eslint-code-block.vue +++ b/docs/.vitepress/theme/components/eslint-code-block.vue @@ -142,7 +142,7 @@ export default { this.height = `${Math.max(120, 20 * (1 + lines))}px` // Load linter. const [plugin, { Linter }, vueEslintParser, globals] = await Promise.all([ - import('../../../..'), + import('eslint-plugin-vue'), import('eslint'), import('vue-eslint-parser'), import('globals') diff --git a/package.json b/package.json index 0677581b6..d983f1a16 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,14 @@ "update": "node ./tools/update.js", "update-resources": "node ./tools/update-resources.js", "typegen": "node ./tools/generate-typegen.mjs", + "build": "tsdown", "docs:watch": "vitepress dev docs", - "predocs:build": "npm run update", + "predocs:build": "npm run update && npm run build", "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": "npm run typegen && changeset publish" + "changeset:publish": "npm run typegen && changeset publish", + "prepublishOnly": "npm run build" }, "files": [ "dist" From 861c1d6a0f6b49774e8202acfb5340443d54a56e Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 10:40:39 +0800 Subject: [PATCH 09/31] fix: correct docs dev & build --- docs/.vitepress/theme/components/eslint-code-block.vue | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/theme/components/eslint-code-block.vue b/docs/.vitepress/theme/components/eslint-code-block.vue index 8c3eed9b7..29d7cf0eb 100644 --- a/docs/.vitepress/theme/components/eslint-code-block.vue +++ b/docs/.vitepress/theme/components/eslint-code-block.vue @@ -142,7 +142,7 @@ export default { this.height = `${Math.max(120, 20 * (1 + lines))}px` // Load linter. const [plugin, { Linter }, vueEslintParser, globals] = await Promise.all([ - import('eslint-plugin-vue'), + import('../../../../lib/index'), import('eslint'), import('vue-eslint-parser'), import('globals') diff --git a/package.json b/package.json index d983f1a16..f0c438917 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "typegen": "node ./tools/generate-typegen.mjs", "build": "tsdown", "docs:watch": "vitepress dev docs", - "predocs:build": "npm run update && npm run build", + "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", From 3d7f91cb37fa4f27c1581b716d85e89cd4ca751f Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 22 Aug 2025 10:40:52 +0800 Subject: [PATCH 10/31] chore: update --- tsdown.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsdown.config.ts b/tsdown.config.ts index 4db6eadf8..7694f5310 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -6,6 +6,6 @@ export default defineConfig({ format: ['cjs'], copy: ['lib/index.d.ts'], dts: false, - skipNodeModulesBundle: true, + external: ['typescriopt'], unbundle: true }) From f1c5923fc8e3ee53183e3109757caa36d92b9a38 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Mon, 25 Aug 2025 17:52:25 +0800 Subject: [PATCH 11/31] chore: update --- lib/processor.ts | 14 +++++++------- tsdown.config.ts | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/processor.ts b/lib/processor.ts index 5c01f41ef..e95e31d5d 100644 --- a/lib/processor.ts +++ b/lib/processor.ts @@ -11,20 +11,20 @@ interface GroupState { } export default { - preprocess(code: string) { + preprocess(code: string): string[] { return [code] }, - postprocess(messages: LintMessage[][]) { + postprocess(messages: LintMessage[][]): LintMessage[] { const state = { block: { disableAllKeys: new Set(), disableRuleKeys: new Map() - } as GroupState, + } satisfies GroupState, line: { disableAllKeys: new Set(), disableRuleKeys: new Map() - } as GroupState + } satisfies GroupState } const usedDisableDirectiveKeys: string[] = [] const unusedDisableDirectiveReports = new Map() @@ -132,7 +132,7 @@ function addDisableRule( disableRuleKeys: GroupState['disableRuleKeys'], rule: string, key: string -) { +): void { let keys = disableRuleKeys.get(rule) if (keys) { keys.push(key) @@ -142,7 +142,7 @@ function addDisableRule( } } -function messageToKey(message: LintMessage) { +function messageToKey(message: LintMessage): string { return `line:${message.line},column${ // -1 because +1 by ESLint's `report-translator`. message.column - 1 @@ -156,6 +156,6 @@ function messageToKey(message: LintMessage) { * @returns A value less than 1 if itemA appears before itemB in the source file, greater than 1 if * itemA appears after itemB in the source file, or 0 if itemA and itemB have the same location. */ -function compareLocations(itemA: Position, itemB: Position) { +function compareLocations(itemA: Position, itemB: Position): number { return itemA.line - itemB.line || itemA.column - itemB.column } diff --git a/tsdown.config.ts b/tsdown.config.ts index 7694f5310..06ef6e55f 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -6,6 +6,6 @@ export default defineConfig({ format: ['cjs'], copy: ['lib/index.d.ts'], dts: false, - external: ['typescriopt'], + external: ['typescript'], unbundle: true }) From eb2d18d56f7f91973508ae2dc181faca9a2af193 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 30 Oct 2025 14:48:02 +0800 Subject: [PATCH 12/31] build: remove specific node version --- tsdown.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tsdown.config.ts b/tsdown.config.ts index 06ef6e55f..7c111ecab 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,7 +1,6 @@ import { defineConfig } from 'tsdown' export default defineConfig({ - target: 'node18', entry: ['lib/index.js'], format: ['cjs'], copy: ['lib/index.d.ts'], From 27f3479e8e881209bd19b326b462baafa177f59b Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 30 Oct 2025 15:00:21 +0800 Subject: [PATCH 13/31] chore: use `import` instead of `require` in esm files --- lib/processor.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/processor.ts b/lib/processor.ts index e95e31d5d..270036172 100644 --- a/lib/processor.ts +++ b/lib/processor.ts @@ -2,6 +2,7 @@ * @author Toru Nagashima */ import type { Linter } from 'eslint' +import meta from './meta.ts' type LintMessage = Linter.LintMessage @@ -125,7 +126,7 @@ export default { supportsAutofix: true, - meta: require('./meta') + meta } function addDisableRule( From 17974ebeaa7b2878a926ed57b2f8f1e634584da9 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 15:13:56 +0800 Subject: [PATCH 14/31] chore: update `tsdown` --- lib/processor.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/processor.ts b/lib/processor.ts index 270036172..ad055d7d0 100644 --- a/lib/processor.ts +++ b/lib/processor.ts @@ -2,7 +2,7 @@ * @author Toru Nagashima */ import type { Linter } from 'eslint' -import meta from './meta.ts' +import * as meta from './meta' type LintMessage = Linter.LintMessage diff --git a/package.json b/package.json index 51cf7a802..00d5d6104 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "markdownlint-cli": "^0.42.0", "pathe": "^1.1.2", "prettier": "^3.3.3", - "tsdown": "^0.14.1", + "tsdown": "^0.16.5", "typescript": "^5.7.2", "vite-plugin-eslint4b": "^0.5.1", "vitepress": "^1.4.1", From 5e71d493ba46fa588ea2b0896a601e2407da90f5 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 15:14:34 +0800 Subject: [PATCH 15/31] ci: add build in workflow --- .github/workflows/CI.yml | 10 ++++++++++ .github/workflows/Release.yml | 3 +++ 2 files changed, 13 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fede1a47a..5986affc0 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -41,6 +41,8 @@ jobs: node-version: ${{ matrix.node }} - name: Install Packages run: npm install + - name: Build + run: npm run build - name: Test run: npm test @@ -58,6 +60,8 @@ jobs: run: npm install - name: Install ESLint v8 run: npm install --save-dev eslint@8 --force + - name: Build + run: npm run build - name: Test run: npm test @@ -73,6 +77,8 @@ jobs: run: npm install - name: Uninstall @stylistic/eslint-plugin run: npm uninstall @stylistic/eslint-plugin + - name: Build + run: npm run build - name: Test run: npm test @@ -91,6 +97,8 @@ jobs: run: npm install - name: Install @stylistic/eslint-plugin v${{ matrix.stylistic }} run: npm install -D @stylistic/eslint-plugin@${{ matrix.stylistic }} --force + - name: Build + run: npm run build - name: Test run: npm test @@ -106,5 +114,7 @@ jobs: run: npm install - name: Install @typescript-eslint/parser v7 run: npm install -D @typescript-eslint/parser@7 --force + - name: Build + run: npm run build - name: Test run: npm test diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 81b6223d9..85f1f5424 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -27,6 +27,9 @@ jobs: - name: Install Dependencies run: npm install + - name: Build + run: npm run build + - name: Create Release Pull Request or Publish to npm id: changesets uses: changesets/action@v1 From 6c4041ba1faa311afdd2a7b9e12e983d1fd0d0e3 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 15:20:27 +0800 Subject: [PATCH 16/31] fix: don't fix extension --- tsdown.config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsdown.config.ts b/tsdown.config.ts index 7c111ecab..36b6fb7d5 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -6,5 +6,6 @@ export default defineConfig({ copy: ['lib/index.d.ts'], dts: false, external: ['typescript'], - unbundle: true + unbundle: true, + fixedExtension: false }) From 8d33d931ba2afa7e347709eb78ac5d4826afae4f Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 15:23:52 +0800 Subject: [PATCH 17/31] chore: update --- lib/index.js | 6 +++--- lib/meta.ts | 4 ++-- lib/processor.ts | 2 +- tests/lib/rules/block-order.js | 2 +- tests/lib/rules/comment-directive.js | 4 ++-- tsconfig.json | 3 ++- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/index.js b/lib/index.js index 2921a2c99..44f562a8f 100644 --- a/lib/index.js +++ b/lib/index.js @@ -6,7 +6,7 @@ 'use strict' const plugin = { - meta: require('./meta'), + meta: require('./meta.ts').default, configs: { // eslintrc configs base: require('./configs/base'), @@ -284,8 +284,8 @@ const plugin = { 'valid-v-text': require('./rules/valid-v-text') }, processors: { - '.vue': require('./processor'), - vue: require('./processor') + '.vue': require('./processor.ts').default, + vue: require('./processor.ts').default } } diff --git a/lib/meta.ts b/lib/meta.ts index f5e106e02..aa5e07211 100644 --- a/lib/meta.ts +++ b/lib/meta.ts @@ -1,3 +1,3 @@ -import { name, version } from '../package.json' with { type: 'json' } +import pkg from '../package.json' with { type: 'json' } -export { name, version } +export default { name: pkg.name, version: pkg.version } diff --git a/lib/processor.ts b/lib/processor.ts index ad055d7d0..270036172 100644 --- a/lib/processor.ts +++ b/lib/processor.ts @@ -2,7 +2,7 @@ * @author Toru Nagashima */ import type { Linter } from 'eslint' -import * as meta from './meta' +import meta from './meta.ts' type LintMessage = Linter.LintMessage diff --git a/tests/lib/rules/block-order.js b/tests/lib/rules/block-order.js index 4eb25e2bd..137607ab7 100644 --- a/tests/lib/rules/block-order.js +++ b/tests/lib/rules/block-order.js @@ -22,7 +22,7 @@ const eslint = new ESLint({ 'vue/comment-directive': 'error', 'vue/block-order': 'error' }, - processor: require('../../../lib/processor') + processor: require('../../../lib/processor.ts').default }, fix: true }) diff --git a/tests/lib/rules/comment-directive.js b/tests/lib/rules/comment-directive.js index b9acb1092..fdaea54a1 100644 --- a/tests/lib/rules/comment-directive.js +++ b/tests/lib/rules/comment-directive.js @@ -24,7 +24,7 @@ const eslint = new ESLint({ 'vue/no-parsing-error': 'error', 'vue/no-duplicate-attributes': 'error' }, - processor: require('../../../lib/processor') + processor: require('../../../lib/processor.ts').default } }) @@ -370,7 +370,7 @@ describe('comment-directive', () => { 'vue/no-parsing-error': 'error', 'vue/no-duplicate-attributes': 'error' }, - processor: require('../../../lib/processor') + processor: require('../../../lib/processor.ts').default } }) diff --git a/tsconfig.json b/tsconfig.json index a8517c036..6aae92ec5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,8 @@ "paths": { "*": ["typings/*"] }, - "skipLibCheck": true + "skipLibCheck": true, + "allowImportingTsExtensions": true }, "include": [ "lib/**/*", From 7108c0a6d565b98d56fefffbe2aadc64ea48fdba Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 19:11:43 +0800 Subject: [PATCH 18/31] chore: use pkg.pr.new/rolldown temporarily --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 00d5d6104..e0559713f 100644 --- a/package.json +++ b/package.json @@ -123,5 +123,8 @@ "vitepress": "^1.4.1", "vitest": "^3.2.4", "vue-eslint-parser": "^10.0.0" + }, + "overrides": { + "rolldown": "https://pkg.pr.new/rolldown@main" } } From 1d7a583ae048110410af036a612c5f2c6972fbb8 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 19:21:30 +0800 Subject: [PATCH 19/31] ci: run build on node lts --- .github/workflows/CI.yml | 52 ++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5986affc0..445b53efe 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -26,6 +26,28 @@ jobs: - name: Lint run: npm run lint + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v6 + with: + node-version: lts/* + + - name: Install Packages + run: npm install + + - name: Build + run: npm run build + + - name: Cache dist + uses: actions/upload-artifact@v5 + with: + retention-days: 3 + name: dist + path: dist + test: name: Test strategy: @@ -41,8 +63,10 @@ jobs: node-version: ${{ matrix.node }} - name: Install Packages run: npm install - - name: Build - run: npm run build + - name: Restore dist cache + uses: actions/download-artifact@v6 + with: + name: dist - name: Test run: npm test @@ -60,8 +84,10 @@ jobs: run: npm install - name: Install ESLint v8 run: npm install --save-dev eslint@8 --force - - name: Build - run: npm run build + - name: Restore dist cache + uses: actions/download-artifact@v6 + with: + name: dist - name: Test run: npm test @@ -77,8 +103,10 @@ jobs: run: npm install - name: Uninstall @stylistic/eslint-plugin run: npm uninstall @stylistic/eslint-plugin - - name: Build - run: npm run build + - name: Restore dist cache + uses: actions/download-artifact@v6 + with: + name: dist - name: Test run: npm test @@ -97,8 +125,10 @@ jobs: run: npm install - name: Install @stylistic/eslint-plugin v${{ matrix.stylistic }} run: npm install -D @stylistic/eslint-plugin@${{ matrix.stylistic }} --force - - name: Build - run: npm run build + - name: Restore dist cache + uses: actions/download-artifact@v6 + with: + name: dist - name: Test run: npm test @@ -114,7 +144,9 @@ jobs: run: npm install - name: Install @typescript-eslint/parser v7 run: npm install -D @typescript-eslint/parser@7 --force - - name: Build - run: npm run build + - name: Restore dist cache + uses: actions/download-artifact@v6 + with: + name: dist - name: Test run: npm test From e9f7c7e0a92190bd68978168e08a1f79fb6c36c7 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 19:23:43 +0800 Subject: [PATCH 20/31] ci: cleanup --- .github/workflows/CI.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 445b53efe..999a592eb 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -30,7 +30,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v6 with: node-version: lts/* From 3b54278ccc057da5f398f7092246cfd50c4ea291 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 19:24:35 +0800 Subject: [PATCH 21/31] ci: add `needs` --- .github/workflows/CI.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 999a592eb..946903219 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -53,6 +53,8 @@ jobs: matrix: node: [18, 20, 21, 'lts/*'] runs-on: ubuntu-latest + needs: + - build steps: - name: Checkout uses: actions/checkout@v4 @@ -72,6 +74,8 @@ jobs: test-with-eslint-v8: name: Test with ESLint v8 runs-on: ubuntu-latest + needs: + - build steps: - name: Checkout uses: actions/checkout@v4 @@ -93,6 +97,8 @@ jobs: test-without-eslint-stylistic: name: Test without ESLint Stylistic runs-on: ubuntu-latest + needs: + - build steps: - name: Checkout uses: actions/checkout@v4 @@ -115,6 +121,8 @@ jobs: matrix: stylistic: [2, 3, 4] runs-on: ubuntu-latest + needs: + - build steps: - name: Checkout uses: actions/checkout@v4 @@ -134,6 +142,8 @@ jobs: test-with-typescript-eslint-v7: name: Test with typescript-eslint v7 runs-on: ubuntu-latest + needs: + - build steps: - name: Checkout uses: actions/checkout@v4 From 4438e9f477b5a25d97ebec04b10598a7d1ffece0 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 20 Nov 2025 23:06:03 +0800 Subject: [PATCH 22/31] chore: update --- .github/workflows/Release.yml | 3 --- package.json | 3 +-- tools/update-lib-index.js | 6 +++--- tsdown.config.ts | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 85f1f5424..81b6223d9 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -27,9 +27,6 @@ jobs: - name: Install Dependencies run: npm install - - name: Build - run: npm run build - - name: Create Release Pull Request or Publish to npm id: changesets uses: changesets/action@v1 diff --git a/package.json b/package.json index e0559713f..6bcc6f1bf 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,7 @@ "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": "npm run typegen && changeset publish", - "prepublishOnly": "npm run build" + "changeset:publish": "npm run typegen && npm run build && changeset publish" }, "files": [ "dist" diff --git a/tools/update-lib-index.js b/tools/update-lib-index.js index 5e9dd6187..c97dbc1ea 100644 --- a/tools/update-lib-index.js +++ b/tools/update-lib-index.js @@ -24,7 +24,7 @@ const content = `/* 'use strict' const plugin = { - meta: require('./meta'), + meta: require('./meta.ts').default, configs: { // eslintrc configs base: require('./configs/base'), @@ -57,8 +57,8 @@ const plugin = { .join(',\n')} }, processors: { - '.vue': require('./processor'), - 'vue': require('./processor') + '.vue': require('./processor.ts').default, + 'vue': require('./processor.ts').default } } diff --git a/tsdown.config.ts b/tsdown.config.ts index 36b6fb7d5..f8e04cd4f 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'tsdown' export default defineConfig({ entry: ['lib/index.js'], format: ['cjs'], - copy: ['lib/index.d.ts'], + copy: ['lib/index.d.ts', 'lib/eslint-typegen.d.ts'], dts: false, external: ['typescript'], unbundle: true, From 75b42d3c1bf5fca0a0e737c6ea7e2d314a79b1a9 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sat, 22 Nov 2025 23:18:09 +0800 Subject: [PATCH 23/31] chore: update typegen --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 46ef0a16a..c3ec08b94 100644 --- a/package.json +++ b/package.json @@ -22,13 +22,13 @@ "update": "node ./tools/update.js", "update-resources": "node ./tools/update-resources.js", "typegen": "node ./tools/generate-typegen.mjs", - "build": "tsdown", + "build": "npm run typegen && tsdown", "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": "npm run typegen && npm run build && changeset publish" + "changeset:publish": "npm run build && changeset publish" }, "files": [ "dist" From 34f9c2b40788400004713d5e5f489f622b8c81fb Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sat, 22 Nov 2025 23:56:15 +0800 Subject: [PATCH 24/31] cherry-pick: #2967 --- lib/configs/flat/base.js | 4 +- lib/configs/index.js | 28 +++ lib/index.js | 292 +------------------------------ lib/plugin.js | 266 ++++++++++++++++++++++++++++ tools/update-lib-flat-configs.js | 4 +- tools/update-lib-index.js | 76 -------- tools/update-lib-plugin.js | 50 ++++++ tools/update.js | 2 +- 8 files changed, 352 insertions(+), 370 deletions(-) create mode 100644 lib/configs/index.js create mode 100644 lib/plugin.js delete mode 100644 tools/update-lib-index.js create mode 100644 tools/update-lib-plugin.js diff --git a/lib/configs/flat/base.js b/lib/configs/flat/base.js index 22386f377..1f4579afa 100644 --- a/lib/configs/flat/base.js +++ b/lib/configs/flat/base.js @@ -8,7 +8,7 @@ module.exports = [ name: 'vue/base/setup', plugins: { get vue() { - return require('../../index') + return require('../../plugin') } }, languageOptions: { @@ -20,7 +20,7 @@ module.exports = [ files: ['*.vue', '**/*.vue'], plugins: { get vue() { - return require('../../index') + return require('../../plugin') } }, languageOptions: { diff --git a/lib/configs/index.js b/lib/configs/index.js new file mode 100644 index 000000000..fbc7a84f5 --- /dev/null +++ b/lib/configs/index.js @@ -0,0 +1,28 @@ +const configs = { + // eslintrc configs + base: require('./base'), + + 'vue2-essential': require('./vue2-essential'), + 'vue2-strongly-recommended': require('./vue2-strongly-recommended'), + 'vue2-recommended': require('./vue2-recommended'), + + essential: require('./vue3-essential'), + 'strongly-recommended': require('./vue3-strongly-recommended'), + recommended: require('./vue3-recommended'), + + // flat configs + 'flat/base': require('./flat/base.js'), + + 'flat/vue2-essential': require('./flat/vue2-essential.js'), + 'flat/vue2-strongly-recommended': require('./flat/vue2-strongly-recommended.js'), + 'flat/vue2-recommended': require('./flat/vue2-recommended.js'), + + 'flat/essential': require('./flat/vue3-essential.js'), + 'flat/strongly-recommended': require('./flat/vue3-strongly-recommended.js'), + 'flat/recommended': require('./flat/vue3-recommended.js'), + + // config-format-agnostic configs + 'no-layout-rules': require('./no-layout-rules') +} + +module.exports = configs diff --git a/lib/index.js b/lib/index.js index 44f562a8f..788f5de9e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,292 +1,6 @@ -/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" - */ 'use strict' -const plugin = { - meta: require('./meta.ts').default, - configs: { - // eslintrc configs - base: require('./configs/base'), +const configs = require('./configs') +const plugin = require('./plugin') - 'vue2-essential': require('./configs/vue2-essential'), - 'vue2-strongly-recommended': require('./configs/vue2-strongly-recommended'), - 'vue2-recommended': require('./configs/vue2-recommended'), - - essential: require('./configs/vue3-essential'), - 'strongly-recommended': require('./configs/vue3-strongly-recommended'), - recommended: require('./configs/vue3-recommended'), - - // flat configs - 'flat/base': require('./configs/flat/base.js'), - - 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'), - 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'), - 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'), - - 'flat/essential': require('./configs/flat/vue3-essential.js'), - 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js'), - 'flat/recommended': require('./configs/flat/vue3-recommended.js'), - - // config-format-agnostic configs - 'no-layout-rules': require('./configs/no-layout-rules') - }, - rules: { - 'array-bracket-newline': require('./rules/array-bracket-newline'), - 'array-bracket-spacing': require('./rules/array-bracket-spacing'), - 'array-element-newline': require('./rules/array-element-newline'), - 'arrow-spacing': require('./rules/arrow-spacing'), - 'attribute-hyphenation': require('./rules/attribute-hyphenation'), - 'attributes-order': require('./rules/attributes-order'), - 'block-lang': require('./rules/block-lang'), - 'block-order': require('./rules/block-order'), - 'block-spacing': require('./rules/block-spacing'), - 'block-tag-newline': require('./rules/block-tag-newline'), - 'brace-style': require('./rules/brace-style'), - camelcase: require('./rules/camelcase'), - 'comma-dangle': require('./rules/comma-dangle'), - 'comma-spacing': require('./rules/comma-spacing'), - 'comma-style': require('./rules/comma-style'), - 'comment-directive': require('./rules/comment-directive'), - 'component-api-style': require('./rules/component-api-style'), - 'component-definition-name-casing': require('./rules/component-definition-name-casing'), - 'component-name-in-template-casing': require('./rules/component-name-in-template-casing'), - 'component-options-name-casing': require('./rules/component-options-name-casing'), - 'custom-event-name-casing': require('./rules/custom-event-name-casing'), - 'define-emits-declaration': require('./rules/define-emits-declaration'), - 'define-macros-order': require('./rules/define-macros-order'), - 'define-props-declaration': require('./rules/define-props-declaration'), - 'define-props-destructuring': require('./rules/define-props-destructuring'), - 'dot-location': require('./rules/dot-location'), - 'dot-notation': require('./rules/dot-notation'), - 'enforce-style-attribute': require('./rules/enforce-style-attribute'), - eqeqeq: require('./rules/eqeqeq'), - 'first-attribute-linebreak': require('./rules/first-attribute-linebreak'), - 'func-call-spacing': require('./rules/func-call-spacing'), - 'html-button-has-type': require('./rules/html-button-has-type'), - 'html-closing-bracket-newline': require('./rules/html-closing-bracket-newline'), - 'html-closing-bracket-spacing': require('./rules/html-closing-bracket-spacing'), - 'html-comment-content-newline': require('./rules/html-comment-content-newline'), - 'html-comment-content-spacing': require('./rules/html-comment-content-spacing'), - 'html-comment-indent': require('./rules/html-comment-indent'), - 'html-end-tags': require('./rules/html-end-tags'), - 'html-indent': require('./rules/html-indent'), - 'html-quotes': require('./rules/html-quotes'), - 'html-self-closing': require('./rules/html-self-closing'), - 'jsx-uses-vars': require('./rules/jsx-uses-vars'), - 'key-spacing': require('./rules/key-spacing'), - 'keyword-spacing': require('./rules/keyword-spacing'), - 'match-component-file-name': require('./rules/match-component-file-name'), - 'match-component-import-name': require('./rules/match-component-import-name'), - 'max-attributes-per-line': require('./rules/max-attributes-per-line'), - 'max-len': require('./rules/max-len'), - 'max-lines-per-block': require('./rules/max-lines-per-block'), - 'max-props': require('./rules/max-props'), - 'max-template-depth': require('./rules/max-template-depth'), - 'multi-word-component-names': require('./rules/multi-word-component-names'), - 'multiline-html-element-content-newline': require('./rules/multiline-html-element-content-newline'), - 'multiline-ternary': require('./rules/multiline-ternary'), - 'mustache-interpolation-spacing': require('./rules/mustache-interpolation-spacing'), - 'new-line-between-multi-line-property': require('./rules/new-line-between-multi-line-property'), - 'next-tick-style': require('./rules/next-tick-style'), - 'no-arrow-functions-in-watch': require('./rules/no-arrow-functions-in-watch'), - 'no-async-in-computed-properties': require('./rules/no-async-in-computed-properties'), - 'no-bare-strings-in-template': require('./rules/no-bare-strings-in-template'), - 'no-boolean-default': require('./rules/no-boolean-default'), - 'no-child-content': require('./rules/no-child-content'), - 'no-computed-properties-in-data': require('./rules/no-computed-properties-in-data'), - 'no-console': require('./rules/no-console'), - 'no-constant-condition': require('./rules/no-constant-condition'), - 'no-custom-modifiers-on-v-model': require('./rules/no-custom-modifiers-on-v-model'), - 'no-deprecated-data-object-declaration': require('./rules/no-deprecated-data-object-declaration'), - 'no-deprecated-delete-set': require('./rules/no-deprecated-delete-set'), - 'no-deprecated-destroyed-lifecycle': require('./rules/no-deprecated-destroyed-lifecycle'), - 'no-deprecated-dollar-listeners-api': require('./rules/no-deprecated-dollar-listeners-api'), - 'no-deprecated-dollar-scopedslots-api': require('./rules/no-deprecated-dollar-scopedslots-api'), - 'no-deprecated-events-api': require('./rules/no-deprecated-events-api'), - 'no-deprecated-filter': require('./rules/no-deprecated-filter'), - 'no-deprecated-functional-template': require('./rules/no-deprecated-functional-template'), - 'no-deprecated-html-element-is': require('./rules/no-deprecated-html-element-is'), - 'no-deprecated-inline-template': require('./rules/no-deprecated-inline-template'), - 'no-deprecated-model-definition': require('./rules/no-deprecated-model-definition'), - 'no-deprecated-props-default-this': require('./rules/no-deprecated-props-default-this'), - 'no-deprecated-router-link-tag-prop': require('./rules/no-deprecated-router-link-tag-prop'), - 'no-deprecated-scope-attribute': require('./rules/no-deprecated-scope-attribute'), - 'no-deprecated-slot-attribute': require('./rules/no-deprecated-slot-attribute'), - 'no-deprecated-slot-scope-attribute': require('./rules/no-deprecated-slot-scope-attribute'), - 'no-deprecated-v-bind-sync': require('./rules/no-deprecated-v-bind-sync'), - 'no-deprecated-v-is': require('./rules/no-deprecated-v-is'), - 'no-deprecated-v-on-native-modifier': require('./rules/no-deprecated-v-on-native-modifier'), - 'no-deprecated-v-on-number-modifiers': require('./rules/no-deprecated-v-on-number-modifiers'), - 'no-deprecated-vue-config-keycodes': require('./rules/no-deprecated-vue-config-keycodes'), - 'no-dupe-keys': require('./rules/no-dupe-keys'), - 'no-dupe-v-else-if': require('./rules/no-dupe-v-else-if'), - 'no-duplicate-attr-inheritance': require('./rules/no-duplicate-attr-inheritance'), - 'no-duplicate-attributes': require('./rules/no-duplicate-attributes'), - 'no-duplicate-class-names': require('./rules/no-duplicate-class-names'), - 'no-empty-component-block': require('./rules/no-empty-component-block'), - 'no-empty-pattern': require('./rules/no-empty-pattern'), - 'no-export-in-script-setup': require('./rules/no-export-in-script-setup'), - 'no-expose-after-await': require('./rules/no-expose-after-await'), - 'no-extra-parens': require('./rules/no-extra-parens'), - 'no-implicit-coercion': require('./rules/no-implicit-coercion'), - 'no-import-compiler-macros': require('./rules/no-import-compiler-macros'), - 'no-irregular-whitespace': require('./rules/no-irregular-whitespace'), - 'no-lifecycle-after-await': require('./rules/no-lifecycle-after-await'), - 'no-lone-template': require('./rules/no-lone-template'), - 'no-loss-of-precision': require('./rules/no-loss-of-precision'), - 'no-multi-spaces': require('./rules/no-multi-spaces'), - 'no-multiple-objects-in-class': require('./rules/no-multiple-objects-in-class'), - 'no-multiple-slot-args': require('./rules/no-multiple-slot-args'), - 'no-multiple-template-root': require('./rules/no-multiple-template-root'), - 'no-mutating-props': require('./rules/no-mutating-props'), - 'no-negated-condition': require('./rules/no-negated-condition'), - 'no-negated-v-if-condition': require('./rules/no-negated-v-if-condition'), - 'no-parsing-error': require('./rules/no-parsing-error'), - 'no-potential-component-option-typo': require('./rules/no-potential-component-option-typo'), - 'no-ref-as-operand': require('./rules/no-ref-as-operand'), - 'no-ref-object-reactivity-loss': require('./rules/no-ref-object-reactivity-loss'), - 'no-required-prop-with-default': require('./rules/no-required-prop-with-default'), - 'no-reserved-component-names': require('./rules/no-reserved-component-names'), - 'no-reserved-keys': require('./rules/no-reserved-keys'), - 'no-reserved-props': require('./rules/no-reserved-props'), - 'no-restricted-block': require('./rules/no-restricted-block'), - 'no-restricted-call-after-await': require('./rules/no-restricted-call-after-await'), - 'no-restricted-class': require('./rules/no-restricted-class'), - 'no-restricted-component-names': require('./rules/no-restricted-component-names'), - 'no-restricted-component-options': require('./rules/no-restricted-component-options'), - 'no-restricted-custom-event': require('./rules/no-restricted-custom-event'), - 'no-restricted-html-elements': require('./rules/no-restricted-html-elements'), - 'no-restricted-props': require('./rules/no-restricted-props'), - 'no-restricted-static-attribute': require('./rules/no-restricted-static-attribute'), - 'no-restricted-syntax': require('./rules/no-restricted-syntax'), - 'no-restricted-v-bind': require('./rules/no-restricted-v-bind'), - 'no-restricted-v-on': require('./rules/no-restricted-v-on'), - 'no-root-v-if': require('./rules/no-root-v-if'), - 'no-setup-props-reactivity-loss': require('./rules/no-setup-props-reactivity-loss'), - 'no-shared-component-data': require('./rules/no-shared-component-data'), - 'no-side-effects-in-computed-properties': require('./rules/no-side-effects-in-computed-properties'), - 'no-spaces-around-equal-signs-in-attribute': require('./rules/no-spaces-around-equal-signs-in-attribute'), - 'no-sparse-arrays': require('./rules/no-sparse-arrays'), - 'no-static-inline-styles': require('./rules/no-static-inline-styles'), - 'no-template-key': require('./rules/no-template-key'), - 'no-template-shadow': require('./rules/no-template-shadow'), - 'no-template-target-blank': require('./rules/no-template-target-blank'), - 'no-textarea-mustache': require('./rules/no-textarea-mustache'), - 'no-this-in-before-route-enter': require('./rules/no-this-in-before-route-enter'), - 'no-undef-components': require('./rules/no-undef-components'), - 'no-undef-properties': require('./rules/no-undef-properties'), - 'no-unsupported-features': require('./rules/no-unsupported-features'), - 'no-unused-components': require('./rules/no-unused-components'), - 'no-unused-emit-declarations': require('./rules/no-unused-emit-declarations'), - 'no-unused-properties': require('./rules/no-unused-properties'), - 'no-unused-refs': require('./rules/no-unused-refs'), - 'no-unused-vars': require('./rules/no-unused-vars'), - 'no-use-computed-property-like-method': require('./rules/no-use-computed-property-like-method'), - 'no-use-v-else-with-v-for': require('./rules/no-use-v-else-with-v-for'), - 'no-use-v-if-with-v-for': require('./rules/no-use-v-if-with-v-for'), - 'no-useless-concat': require('./rules/no-useless-concat'), - 'no-useless-mustaches': require('./rules/no-useless-mustaches'), - 'no-useless-template-attributes': require('./rules/no-useless-template-attributes'), - 'no-useless-v-bind': require('./rules/no-useless-v-bind'), - 'no-v-for-template-key-on-child': require('./rules/no-v-for-template-key-on-child'), - 'no-v-for-template-key': require('./rules/no-v-for-template-key'), - 'no-v-html': require('./rules/no-v-html'), - 'no-v-model-argument': require('./rules/no-v-model-argument'), - 'no-v-text-v-html-on-component': require('./rules/no-v-text-v-html-on-component'), - 'no-v-text': require('./rules/no-v-text'), - 'no-watch-after-await': require('./rules/no-watch-after-await'), - 'object-curly-newline': require('./rules/object-curly-newline'), - 'object-curly-spacing': require('./rules/object-curly-spacing'), - 'object-property-newline': require('./rules/object-property-newline'), - 'object-shorthand': require('./rules/object-shorthand'), - 'one-component-per-file': require('./rules/one-component-per-file'), - 'operator-linebreak': require('./rules/operator-linebreak'), - 'order-in-components': require('./rules/order-in-components'), - 'padding-line-between-blocks': require('./rules/padding-line-between-blocks'), - 'padding-line-between-tags': require('./rules/padding-line-between-tags'), - 'padding-lines-in-component-definition': require('./rules/padding-lines-in-component-definition'), - 'prefer-define-options': require('./rules/prefer-define-options'), - 'prefer-import-from-vue': require('./rules/prefer-import-from-vue'), - 'prefer-prop-type-boolean-first': require('./rules/prefer-prop-type-boolean-first'), - 'prefer-separate-static-class': require('./rules/prefer-separate-static-class'), - 'prefer-template': require('./rules/prefer-template'), - 'prefer-true-attribute-shorthand': require('./rules/prefer-true-attribute-shorthand'), - 'prefer-use-template-ref': require('./rules/prefer-use-template-ref'), - 'prop-name-casing': require('./rules/prop-name-casing'), - 'quote-props': require('./rules/quote-props'), - 'require-component-is': require('./rules/require-component-is'), - 'require-default-export': require('./rules/require-default-export'), - 'require-default-prop': require('./rules/require-default-prop'), - 'require-direct-export': require('./rules/require-direct-export'), - 'require-emit-validator': require('./rules/require-emit-validator'), - 'require-explicit-emits': require('./rules/require-explicit-emits'), - 'require-explicit-slots': require('./rules/require-explicit-slots'), - 'require-expose': require('./rules/require-expose'), - 'require-macro-variable-name': require('./rules/require-macro-variable-name'), - 'require-name-property': require('./rules/require-name-property'), - 'require-prop-comment': require('./rules/require-prop-comment'), - 'require-prop-type-constructor': require('./rules/require-prop-type-constructor'), - 'require-prop-types': require('./rules/require-prop-types'), - 'require-render-return': require('./rules/require-render-return'), - 'require-slots-as-functions': require('./rules/require-slots-as-functions'), - 'require-toggle-inside-transition': require('./rules/require-toggle-inside-transition'), - 'require-typed-object-prop': require('./rules/require-typed-object-prop'), - 'require-typed-ref': require('./rules/require-typed-ref'), - 'require-v-for-key': require('./rules/require-v-for-key'), - 'require-valid-default-prop': require('./rules/require-valid-default-prop'), - 'restricted-component-names': require('./rules/restricted-component-names'), - 'return-in-computed-property': require('./rules/return-in-computed-property'), - 'return-in-emits-validator': require('./rules/return-in-emits-validator'), - 'script-indent': require('./rules/script-indent'), - 'singleline-html-element-content-newline': require('./rules/singleline-html-element-content-newline'), - 'slot-name-casing': require('./rules/slot-name-casing'), - 'sort-keys': require('./rules/sort-keys'), - 'space-in-parens': require('./rules/space-in-parens'), - 'space-infix-ops': require('./rules/space-infix-ops'), - 'space-unary-ops': require('./rules/space-unary-ops'), - 'static-class-names-order': require('./rules/static-class-names-order'), - 'template-curly-spacing': require('./rules/template-curly-spacing'), - 'this-in-template': require('./rules/this-in-template'), - 'use-v-on-exact': require('./rules/use-v-on-exact'), - 'v-bind-style': require('./rules/v-bind-style'), - 'v-for-delimiter-style': require('./rules/v-for-delimiter-style'), - 'v-if-else-key': require('./rules/v-if-else-key'), - 'v-on-event-hyphenation': require('./rules/v-on-event-hyphenation'), - 'v-on-handler-style': require('./rules/v-on-handler-style'), - 'v-on-style': require('./rules/v-on-style'), - 'v-slot-style': require('./rules/v-slot-style'), - 'valid-attribute-name': require('./rules/valid-attribute-name'), - 'valid-define-emits': require('./rules/valid-define-emits'), - 'valid-define-options': require('./rules/valid-define-options'), - 'valid-define-props': require('./rules/valid-define-props'), - 'valid-model-definition': require('./rules/valid-model-definition'), - 'valid-next-tick': require('./rules/valid-next-tick'), - 'valid-template-root': require('./rules/valid-template-root'), - 'valid-v-bind-sync': require('./rules/valid-v-bind-sync'), - 'valid-v-bind': require('./rules/valid-v-bind'), - 'valid-v-cloak': require('./rules/valid-v-cloak'), - 'valid-v-else-if': require('./rules/valid-v-else-if'), - 'valid-v-else': require('./rules/valid-v-else'), - 'valid-v-for': require('./rules/valid-v-for'), - 'valid-v-html': require('./rules/valid-v-html'), - 'valid-v-if': require('./rules/valid-v-if'), - 'valid-v-is': require('./rules/valid-v-is'), - 'valid-v-memo': require('./rules/valid-v-memo'), - 'valid-v-model': require('./rules/valid-v-model'), - 'valid-v-on': require('./rules/valid-v-on'), - 'valid-v-once': require('./rules/valid-v-once'), - 'valid-v-pre': require('./rules/valid-v-pre'), - 'valid-v-show': require('./rules/valid-v-show'), - 'valid-v-slot': require('./rules/valid-v-slot'), - 'valid-v-text': require('./rules/valid-v-text') - }, - processors: { - '.vue': require('./processor.ts').default, - vue: require('./processor.ts').default - } -} - -module.exports = plugin +module.exports = Object.assign(plugin, { configs }) diff --git a/lib/plugin.js b/lib/plugin.js new file mode 100644 index 000000000..7bedbbdf5 --- /dev/null +++ b/lib/plugin.js @@ -0,0 +1,266 @@ +/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +'use strict' + +const plugin = { + meta: require('./meta'), + rules: { + 'array-bracket-newline': require('./rules/array-bracket-newline'), + 'array-bracket-spacing': require('./rules/array-bracket-spacing'), + 'array-element-newline': require('./rules/array-element-newline'), + 'arrow-spacing': require('./rules/arrow-spacing'), + 'attribute-hyphenation': require('./rules/attribute-hyphenation'), + 'attributes-order': require('./rules/attributes-order'), + 'block-lang': require('./rules/block-lang'), + 'block-order': require('./rules/block-order'), + 'block-spacing': require('./rules/block-spacing'), + 'block-tag-newline': require('./rules/block-tag-newline'), + 'brace-style': require('./rules/brace-style'), + camelcase: require('./rules/camelcase'), + 'comma-dangle': require('./rules/comma-dangle'), + 'comma-spacing': require('./rules/comma-spacing'), + 'comma-style': require('./rules/comma-style'), + 'comment-directive': require('./rules/comment-directive'), + 'component-api-style': require('./rules/component-api-style'), + 'component-definition-name-casing': require('./rules/component-definition-name-casing'), + 'component-name-in-template-casing': require('./rules/component-name-in-template-casing'), + 'component-options-name-casing': require('./rules/component-options-name-casing'), + 'custom-event-name-casing': require('./rules/custom-event-name-casing'), + 'define-emits-declaration': require('./rules/define-emits-declaration'), + 'define-macros-order': require('./rules/define-macros-order'), + 'define-props-declaration': require('./rules/define-props-declaration'), + 'define-props-destructuring': require('./rules/define-props-destructuring'), + 'dot-location': require('./rules/dot-location'), + 'dot-notation': require('./rules/dot-notation'), + 'enforce-style-attribute': require('./rules/enforce-style-attribute'), + eqeqeq: require('./rules/eqeqeq'), + 'first-attribute-linebreak': require('./rules/first-attribute-linebreak'), + 'func-call-spacing': require('./rules/func-call-spacing'), + 'html-button-has-type': require('./rules/html-button-has-type'), + 'html-closing-bracket-newline': require('./rules/html-closing-bracket-newline'), + 'html-closing-bracket-spacing': require('./rules/html-closing-bracket-spacing'), + 'html-comment-content-newline': require('./rules/html-comment-content-newline'), + 'html-comment-content-spacing': require('./rules/html-comment-content-spacing'), + 'html-comment-indent': require('./rules/html-comment-indent'), + 'html-end-tags': require('./rules/html-end-tags'), + 'html-indent': require('./rules/html-indent'), + 'html-quotes': require('./rules/html-quotes'), + 'html-self-closing': require('./rules/html-self-closing'), + 'jsx-uses-vars': require('./rules/jsx-uses-vars'), + 'key-spacing': require('./rules/key-spacing'), + 'keyword-spacing': require('./rules/keyword-spacing'), + 'match-component-file-name': require('./rules/match-component-file-name'), + 'match-component-import-name': require('./rules/match-component-import-name'), + 'max-attributes-per-line': require('./rules/max-attributes-per-line'), + 'max-len': require('./rules/max-len'), + 'max-lines-per-block': require('./rules/max-lines-per-block'), + 'max-props': require('./rules/max-props'), + 'max-template-depth': require('./rules/max-template-depth'), + 'multi-word-component-names': require('./rules/multi-word-component-names'), + 'multiline-html-element-content-newline': require('./rules/multiline-html-element-content-newline'), + 'multiline-ternary': require('./rules/multiline-ternary'), + 'mustache-interpolation-spacing': require('./rules/mustache-interpolation-spacing'), + 'new-line-between-multi-line-property': require('./rules/new-line-between-multi-line-property'), + 'next-tick-style': require('./rules/next-tick-style'), + 'no-arrow-functions-in-watch': require('./rules/no-arrow-functions-in-watch'), + 'no-async-in-computed-properties': require('./rules/no-async-in-computed-properties'), + 'no-bare-strings-in-template': require('./rules/no-bare-strings-in-template'), + 'no-boolean-default': require('./rules/no-boolean-default'), + 'no-child-content': require('./rules/no-child-content'), + 'no-computed-properties-in-data': require('./rules/no-computed-properties-in-data'), + 'no-console': require('./rules/no-console'), + 'no-constant-condition': require('./rules/no-constant-condition'), + 'no-custom-modifiers-on-v-model': require('./rules/no-custom-modifiers-on-v-model'), + 'no-deprecated-data-object-declaration': require('./rules/no-deprecated-data-object-declaration'), + 'no-deprecated-delete-set': require('./rules/no-deprecated-delete-set'), + 'no-deprecated-destroyed-lifecycle': require('./rules/no-deprecated-destroyed-lifecycle'), + 'no-deprecated-dollar-listeners-api': require('./rules/no-deprecated-dollar-listeners-api'), + 'no-deprecated-dollar-scopedslots-api': require('./rules/no-deprecated-dollar-scopedslots-api'), + 'no-deprecated-events-api': require('./rules/no-deprecated-events-api'), + 'no-deprecated-filter': require('./rules/no-deprecated-filter'), + 'no-deprecated-functional-template': require('./rules/no-deprecated-functional-template'), + 'no-deprecated-html-element-is': require('./rules/no-deprecated-html-element-is'), + 'no-deprecated-inline-template': require('./rules/no-deprecated-inline-template'), + 'no-deprecated-model-definition': require('./rules/no-deprecated-model-definition'), + 'no-deprecated-props-default-this': require('./rules/no-deprecated-props-default-this'), + 'no-deprecated-router-link-tag-prop': require('./rules/no-deprecated-router-link-tag-prop'), + 'no-deprecated-scope-attribute': require('./rules/no-deprecated-scope-attribute'), + 'no-deprecated-slot-attribute': require('./rules/no-deprecated-slot-attribute'), + 'no-deprecated-slot-scope-attribute': require('./rules/no-deprecated-slot-scope-attribute'), + 'no-deprecated-v-bind-sync': require('./rules/no-deprecated-v-bind-sync'), + 'no-deprecated-v-is': require('./rules/no-deprecated-v-is'), + 'no-deprecated-v-on-native-modifier': require('./rules/no-deprecated-v-on-native-modifier'), + 'no-deprecated-v-on-number-modifiers': require('./rules/no-deprecated-v-on-number-modifiers'), + 'no-deprecated-vue-config-keycodes': require('./rules/no-deprecated-vue-config-keycodes'), + 'no-dupe-keys': require('./rules/no-dupe-keys'), + 'no-dupe-v-else-if': require('./rules/no-dupe-v-else-if'), + 'no-duplicate-attr-inheritance': require('./rules/no-duplicate-attr-inheritance'), + 'no-duplicate-attributes': require('./rules/no-duplicate-attributes'), + 'no-duplicate-class-names': require('./rules/no-duplicate-class-names'), + 'no-empty-component-block': require('./rules/no-empty-component-block'), + 'no-empty-pattern': require('./rules/no-empty-pattern'), + 'no-export-in-script-setup': require('./rules/no-export-in-script-setup'), + 'no-expose-after-await': require('./rules/no-expose-after-await'), + 'no-extra-parens': require('./rules/no-extra-parens'), + 'no-implicit-coercion': require('./rules/no-implicit-coercion'), + 'no-import-compiler-macros': require('./rules/no-import-compiler-macros'), + 'no-irregular-whitespace': require('./rules/no-irregular-whitespace'), + 'no-lifecycle-after-await': require('./rules/no-lifecycle-after-await'), + 'no-lone-template': require('./rules/no-lone-template'), + 'no-loss-of-precision': require('./rules/no-loss-of-precision'), + 'no-multi-spaces': require('./rules/no-multi-spaces'), + 'no-multiple-objects-in-class': require('./rules/no-multiple-objects-in-class'), + 'no-multiple-slot-args': require('./rules/no-multiple-slot-args'), + 'no-multiple-template-root': require('./rules/no-multiple-template-root'), + 'no-mutating-props': require('./rules/no-mutating-props'), + 'no-negated-condition': require('./rules/no-negated-condition'), + 'no-negated-v-if-condition': require('./rules/no-negated-v-if-condition'), + 'no-parsing-error': require('./rules/no-parsing-error'), + 'no-potential-component-option-typo': require('./rules/no-potential-component-option-typo'), + 'no-ref-as-operand': require('./rules/no-ref-as-operand'), + 'no-ref-object-reactivity-loss': require('./rules/no-ref-object-reactivity-loss'), + 'no-required-prop-with-default': require('./rules/no-required-prop-with-default'), + 'no-reserved-component-names': require('./rules/no-reserved-component-names'), + 'no-reserved-keys': require('./rules/no-reserved-keys'), + 'no-reserved-props': require('./rules/no-reserved-props'), + 'no-restricted-block': require('./rules/no-restricted-block'), + 'no-restricted-call-after-await': require('./rules/no-restricted-call-after-await'), + 'no-restricted-class': require('./rules/no-restricted-class'), + 'no-restricted-component-names': require('./rules/no-restricted-component-names'), + 'no-restricted-component-options': require('./rules/no-restricted-component-options'), + 'no-restricted-custom-event': require('./rules/no-restricted-custom-event'), + 'no-restricted-html-elements': require('./rules/no-restricted-html-elements'), + 'no-restricted-props': require('./rules/no-restricted-props'), + 'no-restricted-static-attribute': require('./rules/no-restricted-static-attribute'), + 'no-restricted-syntax': require('./rules/no-restricted-syntax'), + 'no-restricted-v-bind': require('./rules/no-restricted-v-bind'), + 'no-restricted-v-on': require('./rules/no-restricted-v-on'), + 'no-root-v-if': require('./rules/no-root-v-if'), + 'no-setup-props-reactivity-loss': require('./rules/no-setup-props-reactivity-loss'), + 'no-shared-component-data': require('./rules/no-shared-component-data'), + 'no-side-effects-in-computed-properties': require('./rules/no-side-effects-in-computed-properties'), + 'no-spaces-around-equal-signs-in-attribute': require('./rules/no-spaces-around-equal-signs-in-attribute'), + 'no-sparse-arrays': require('./rules/no-sparse-arrays'), + 'no-static-inline-styles': require('./rules/no-static-inline-styles'), + 'no-template-key': require('./rules/no-template-key'), + 'no-template-shadow': require('./rules/no-template-shadow'), + 'no-template-target-blank': require('./rules/no-template-target-blank'), + 'no-textarea-mustache': require('./rules/no-textarea-mustache'), + 'no-this-in-before-route-enter': require('./rules/no-this-in-before-route-enter'), + 'no-undef-components': require('./rules/no-undef-components'), + 'no-undef-properties': require('./rules/no-undef-properties'), + 'no-unsupported-features': require('./rules/no-unsupported-features'), + 'no-unused-components': require('./rules/no-unused-components'), + 'no-unused-emit-declarations': require('./rules/no-unused-emit-declarations'), + 'no-unused-properties': require('./rules/no-unused-properties'), + 'no-unused-refs': require('./rules/no-unused-refs'), + 'no-unused-vars': require('./rules/no-unused-vars'), + 'no-use-computed-property-like-method': require('./rules/no-use-computed-property-like-method'), + 'no-use-v-else-with-v-for': require('./rules/no-use-v-else-with-v-for'), + 'no-use-v-if-with-v-for': require('./rules/no-use-v-if-with-v-for'), + 'no-useless-concat': require('./rules/no-useless-concat'), + 'no-useless-mustaches': require('./rules/no-useless-mustaches'), + 'no-useless-template-attributes': require('./rules/no-useless-template-attributes'), + 'no-useless-v-bind': require('./rules/no-useless-v-bind'), + 'no-v-for-template-key-on-child': require('./rules/no-v-for-template-key-on-child'), + 'no-v-for-template-key': require('./rules/no-v-for-template-key'), + 'no-v-html': require('./rules/no-v-html'), + 'no-v-model-argument': require('./rules/no-v-model-argument'), + 'no-v-text-v-html-on-component': require('./rules/no-v-text-v-html-on-component'), + 'no-v-text': require('./rules/no-v-text'), + 'no-watch-after-await': require('./rules/no-watch-after-await'), + 'object-curly-newline': require('./rules/object-curly-newline'), + 'object-curly-spacing': require('./rules/object-curly-spacing'), + 'object-property-newline': require('./rules/object-property-newline'), + 'object-shorthand': require('./rules/object-shorthand'), + 'one-component-per-file': require('./rules/one-component-per-file'), + 'operator-linebreak': require('./rules/operator-linebreak'), + 'order-in-components': require('./rules/order-in-components'), + 'padding-line-between-blocks': require('./rules/padding-line-between-blocks'), + 'padding-line-between-tags': require('./rules/padding-line-between-tags'), + 'padding-lines-in-component-definition': require('./rules/padding-lines-in-component-definition'), + 'prefer-define-options': require('./rules/prefer-define-options'), + 'prefer-import-from-vue': require('./rules/prefer-import-from-vue'), + 'prefer-prop-type-boolean-first': require('./rules/prefer-prop-type-boolean-first'), + 'prefer-separate-static-class': require('./rules/prefer-separate-static-class'), + 'prefer-template': require('./rules/prefer-template'), + 'prefer-true-attribute-shorthand': require('./rules/prefer-true-attribute-shorthand'), + 'prefer-use-template-ref': require('./rules/prefer-use-template-ref'), + 'prop-name-casing': require('./rules/prop-name-casing'), + 'quote-props': require('./rules/quote-props'), + 'require-component-is': require('./rules/require-component-is'), + 'require-default-export': require('./rules/require-default-export'), + 'require-default-prop': require('./rules/require-default-prop'), + 'require-direct-export': require('./rules/require-direct-export'), + 'require-emit-validator': require('./rules/require-emit-validator'), + 'require-explicit-emits': require('./rules/require-explicit-emits'), + 'require-explicit-slots': require('./rules/require-explicit-slots'), + 'require-expose': require('./rules/require-expose'), + 'require-macro-variable-name': require('./rules/require-macro-variable-name'), + 'require-name-property': require('./rules/require-name-property'), + 'require-prop-comment': require('./rules/require-prop-comment'), + 'require-prop-type-constructor': require('./rules/require-prop-type-constructor'), + 'require-prop-types': require('./rules/require-prop-types'), + 'require-render-return': require('./rules/require-render-return'), + 'require-slots-as-functions': require('./rules/require-slots-as-functions'), + 'require-toggle-inside-transition': require('./rules/require-toggle-inside-transition'), + 'require-typed-object-prop': require('./rules/require-typed-object-prop'), + 'require-typed-ref': require('./rules/require-typed-ref'), + 'require-v-for-key': require('./rules/require-v-for-key'), + 'require-valid-default-prop': require('./rules/require-valid-default-prop'), + 'restricted-component-names': require('./rules/restricted-component-names'), + 'return-in-computed-property': require('./rules/return-in-computed-property'), + 'return-in-emits-validator': require('./rules/return-in-emits-validator'), + 'script-indent': require('./rules/script-indent'), + 'singleline-html-element-content-newline': require('./rules/singleline-html-element-content-newline'), + 'slot-name-casing': require('./rules/slot-name-casing'), + 'sort-keys': require('./rules/sort-keys'), + 'space-in-parens': require('./rules/space-in-parens'), + 'space-infix-ops': require('./rules/space-infix-ops'), + 'space-unary-ops': require('./rules/space-unary-ops'), + 'static-class-names-order': require('./rules/static-class-names-order'), + 'template-curly-spacing': require('./rules/template-curly-spacing'), + 'this-in-template': require('./rules/this-in-template'), + 'use-v-on-exact': require('./rules/use-v-on-exact'), + 'v-bind-style': require('./rules/v-bind-style'), + 'v-for-delimiter-style': require('./rules/v-for-delimiter-style'), + 'v-if-else-key': require('./rules/v-if-else-key'), + 'v-on-event-hyphenation': require('./rules/v-on-event-hyphenation'), + 'v-on-handler-style': require('./rules/v-on-handler-style'), + 'v-on-style': require('./rules/v-on-style'), + 'v-slot-style': require('./rules/v-slot-style'), + 'valid-attribute-name': require('./rules/valid-attribute-name'), + 'valid-define-emits': require('./rules/valid-define-emits'), + 'valid-define-options': require('./rules/valid-define-options'), + 'valid-define-props': require('./rules/valid-define-props'), + 'valid-model-definition': require('./rules/valid-model-definition'), + 'valid-next-tick': require('./rules/valid-next-tick'), + 'valid-template-root': require('./rules/valid-template-root'), + 'valid-v-bind-sync': require('./rules/valid-v-bind-sync'), + 'valid-v-bind': require('./rules/valid-v-bind'), + 'valid-v-cloak': require('./rules/valid-v-cloak'), + 'valid-v-else-if': require('./rules/valid-v-else-if'), + 'valid-v-else': require('./rules/valid-v-else'), + 'valid-v-for': require('./rules/valid-v-for'), + 'valid-v-html': require('./rules/valid-v-html'), + 'valid-v-if': require('./rules/valid-v-if'), + 'valid-v-is': require('./rules/valid-v-is'), + 'valid-v-memo': require('./rules/valid-v-memo'), + 'valid-v-model': require('./rules/valid-v-model'), + 'valid-v-on': require('./rules/valid-v-on'), + 'valid-v-once': require('./rules/valid-v-once'), + 'valid-v-pre': require('./rules/valid-v-pre'), + 'valid-v-show': require('./rules/valid-v-show'), + 'valid-v-slot': require('./rules/valid-v-slot'), + 'valid-v-text': require('./rules/valid-v-text') + }, + processors: { + '.vue': require('./processor'), + vue: require('./processor') + } +} + +module.exports = plugin diff --git a/tools/update-lib-flat-configs.js b/tools/update-lib-flat-configs.js index e55fb2d01..bc103cad1 100644 --- a/tools/update-lib-flat-configs.js +++ b/tools/update-lib-flat-configs.js @@ -60,7 +60,7 @@ module.exports = [ name: 'vue/base/setup', plugins: { get vue() { - return require('../../index') + return require('../../plugin') } }, languageOptions: { @@ -72,7 +72,7 @@ module.exports = [ files: ['*.vue', '**/*.vue'], plugins: { get vue() { - return require('../../index') + return require('../../plugin') } }, languageOptions: { diff --git a/tools/update-lib-index.js b/tools/update-lib-index.js deleted file mode 100644 index c97dbc1ea..000000000 --- a/tools/update-lib-index.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @author Toru Nagashima - * @copyright 2017 Toru Nagashima. All rights reserved. - * See LICENSE file in root directory for full license. - */ -'use strict' - -/* -This script updates `lib/index.js` file from rule's meta data. -*/ - -const fs = require('fs') -const path = require('path') -const { FlatESLint } = require('eslint/use-at-your-own-risk') -const rules = require('./lib/rules') - -// Update files. -const filePath = path.resolve(__dirname, '../lib/index.js') -const content = `/* - * IMPORTANT! - * This file has been automatically generated, - * in order to update its content execute "npm run update" - */ -'use strict' - -const plugin = { - meta: require('./meta.ts').default, - configs: { - // eslintrc configs - base: require('./configs/base'), - - 'vue2-essential': require('./configs/vue2-essential'), - 'vue2-strongly-recommended': require('./configs/vue2-strongly-recommended'), - 'vue2-recommended': require('./configs/vue2-recommended'), - - essential: require('./configs/vue3-essential'), - 'strongly-recommended': require('./configs/vue3-strongly-recommended'), - recommended: require('./configs/vue3-recommended'), - - // flat configs - 'flat/base': require('./configs/flat/base.js'), - - 'flat/vue2-essential': require('./configs/flat/vue2-essential.js'), - 'flat/vue2-strongly-recommended': require('./configs/flat/vue2-strongly-recommended.js'), - 'flat/vue2-recommended': require('./configs/flat/vue2-recommended.js'), - - 'flat/essential': require('./configs/flat/vue3-essential.js'), - 'flat/strongly-recommended': require('./configs/flat/vue3-strongly-recommended.js'), - 'flat/recommended': require('./configs/flat/vue3-recommended.js'), - - // config-format-agnostic configs - 'no-layout-rules': require('./configs/no-layout-rules'), - }, - rules: { - ${rules - .map((rule) => `'${rule.name}': require('./rules/${rule.name}')`) - .join(',\n')} - }, - processors: { - '.vue': require('./processor.ts').default, - 'vue': require('./processor.ts').default - } -} - -module.exports = plugin -` -fs.writeFileSync(filePath, content) - -// Format files. -async function format() { - const linter = new FlatESLint({ fix: true }) - const report = await linter.lintFiles([filePath]) - FlatESLint.outputFixes(report) -} - -format() diff --git a/tools/update-lib-plugin.js b/tools/update-lib-plugin.js new file mode 100644 index 000000000..b9fa03870 --- /dev/null +++ b/tools/update-lib-plugin.js @@ -0,0 +1,50 @@ +/** + * @author Toru Nagashima + * @copyright 2017 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ +'use strict' + +/* +This script updates `lib/plugin.js` file from rule's meta data. +*/ + +const fs = require('fs') +const path = require('path') +const { FlatESLint } = require('eslint/use-at-your-own-risk') +const rules = require('./lib/rules') + +// Update files. +const filePath = path.resolve(__dirname, '../lib/plugin.js') +const content = `/* + * IMPORTANT! + * This file has been automatically generated, + * in order to update its content execute "npm run update" + */ +'use strict' + +const plugin = { + meta: require('./meta'), + rules: { + ${rules + .map((rule) => `'${rule.name}': require('./rules/${rule.name}')`) + .join(',\n')} + }, + processors: { + '.vue': require('./processor'), + 'vue': require('./processor') + } +} + +module.exports = plugin +` +fs.writeFileSync(filePath, content) + +// Format files. +async function format() { + const linter = new FlatESLint({ fix: true }) + const report = await linter.lintFiles([filePath]) + FlatESLint.outputFixes(report) +} + +format() diff --git a/tools/update.js b/tools/update.js index 64da1be1b..f1a77c9a0 100644 --- a/tools/update.js +++ b/tools/update.js @@ -8,6 +8,6 @@ require('./update-no-layout-rules-config') require('./update-lib-configs') require('./update-lib-flat-configs') -require('./update-lib-index') +require('./update-lib-plugin') require('./update-docs') require('./update-docs-rules-index') From 4f2f5250da89c38b4b2354c381e1c5ab9767fbb2 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sun, 23 Nov 2025 00:03:09 +0800 Subject: [PATCH 25/31] chore: update `plugin.js` --- lib/plugin.js | 6 +++--- tools/update-lib-plugin.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/plugin.js b/lib/plugin.js index 7bedbbdf5..dce33001b 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -6,7 +6,7 @@ 'use strict' const plugin = { - meta: require('./meta'), + meta: require('./meta.ts').default, rules: { 'array-bracket-newline': require('./rules/array-bracket-newline'), 'array-bracket-spacing': require('./rules/array-bracket-spacing'), @@ -258,8 +258,8 @@ const plugin = { 'valid-v-text': require('./rules/valid-v-text') }, processors: { - '.vue': require('./processor'), - vue: require('./processor') + '.vue': require('./processor.ts').default, + vue: require('./processor.ts').default } } diff --git a/tools/update-lib-plugin.js b/tools/update-lib-plugin.js index b9fa03870..8d6d46488 100644 --- a/tools/update-lib-plugin.js +++ b/tools/update-lib-plugin.js @@ -24,15 +24,15 @@ const content = `/* 'use strict' const plugin = { - meta: require('./meta'), + meta: require('./meta.ts').default, rules: { ${rules .map((rule) => `'${rule.name}': require('./rules/${rule.name}')`) .join(',\n')} }, processors: { - '.vue': require('./processor'), - 'vue': require('./processor') + '.vue': require('./processor.ts').default, + 'vue': require('./processor.ts').default } } From 7cfa8d074b067a7e18f27109f4fee0653bc8eb28 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sun, 23 Nov 2025 00:11:13 +0800 Subject: [PATCH 26/31] refactor: rewrite `index` in `.ts` --- lib/index.js | 6 ------ lib/index.ts | 4 ++++ tests/lib/configs/eslintrc.js | 2 +- tests/lib/configs/flat.js | 2 +- tests/lib/rules/block-order.js | 2 +- tests/lib/rules/comment-directive.js | 4 ++-- tools/generate-typegen.mjs | 2 +- tsdown.config.ts | 2 +- 8 files changed, 11 insertions(+), 13 deletions(-) delete mode 100644 lib/index.js create mode 100644 lib/index.ts diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 788f5de9e..000000000 --- a/lib/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -const configs = require('./configs') -const plugin = require('./plugin') - -module.exports = Object.assign(plugin, { configs }) diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 000000000..a52f8d635 --- /dev/null +++ b/lib/index.ts @@ -0,0 +1,4 @@ +import configs from './configs/index.js' +import plugin from './plugin.js' + +export default Object.assign(plugin, { configs }) diff --git a/tests/lib/configs/eslintrc.js b/tests/lib/configs/eslintrc.js index a9febaeeb..561a6d749 100644 --- a/tests/lib/configs/eslintrc.js +++ b/tests/lib/configs/eslintrc.js @@ -1,7 +1,7 @@ 'use strict' const { ESLint } = require('../../eslint-compat') -const plugin = require('../../../lib/index') +const plugin = require('../../../lib/index.ts').default describe('eslintrc configs', () => { for (const name of Object.keys(plugin.configs)) { diff --git a/tests/lib/configs/flat.js b/tests/lib/configs/flat.js index 51449953a..afdaff3df 100644 --- a/tests/lib/configs/flat.js +++ b/tests/lib/configs/flat.js @@ -5,7 +5,7 @@ 'use strict' -const plugin = require('../../../lib/index') +const plugin = require('../../../lib/index.ts').default const { strict: assert } = require('assert') // node v14 does not support 'assert/strict' const { FlatESLint } = require('../../eslint-compat') diff --git a/tests/lib/rules/block-order.js b/tests/lib/rules/block-order.js index 137607ab7..718cae845 100644 --- a/tests/lib/rules/block-order.js +++ b/tests/lib/rules/block-order.js @@ -17,7 +17,7 @@ const eslint = new ESLint({ parser: require('vue-eslint-parser'), ecmaVersion: 2015 }, - plugins: { vue: require('../../../lib/index') }, + plugins: { vue: require('../../../lib/index.ts').default }, rules: { 'vue/comment-directive': 'error', 'vue/block-order': 'error' diff --git a/tests/lib/rules/comment-directive.js b/tests/lib/rules/comment-directive.js index fdaea54a1..d7e0f975b 100644 --- a/tests/lib/rules/comment-directive.js +++ b/tests/lib/rules/comment-directive.js @@ -17,7 +17,7 @@ const eslint = new ESLint({ parser: require('vue-eslint-parser'), ecmaVersion: 2015 }, - plugins: { vue: require('../../../lib/index') }, + plugins: { vue: require('../../../lib/index.ts').default }, rules: { 'no-unused-vars': 'error', 'vue/comment-directive': 'error', @@ -360,7 +360,7 @@ describe('comment-directive', () => { parser: require('vue-eslint-parser'), ecmaVersion: 2015 }, - plugins: { vue: require('../../../lib/index') }, + plugins: { vue: require('../../../lib/index.ts').default }, rules: { 'no-unused-vars': 'error', 'vue/comment-directive': [ diff --git a/tools/generate-typegen.mjs b/tools/generate-typegen.mjs index 1f3b4a129..b247c5552 100644 --- a/tools/generate-typegen.mjs +++ b/tools/generate-typegen.mjs @@ -1,6 +1,6 @@ import fs from 'node:fs/promises' import { pluginsToRulesDTS } from 'eslint-typegen/core' -import plugin from '../lib/index.js' +import plugin from '../lib/index.ts' const dts = await pluginsToRulesDTS( { diff --git a/tsdown.config.ts b/tsdown.config.ts index f8e04cd4f..87abad4b5 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ['lib/index.js'], + entry: ['lib/index.ts'], format: ['cjs'], copy: ['lib/index.d.ts', 'lib/eslint-typegen.d.ts'], dts: false, From e3dbe931e0a4418c808f3017508d34333bb75fe8 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sun, 23 Nov 2025 00:27:17 +0800 Subject: [PATCH 27/31] cherry-pick: #2968 --- .../lib/configs/{eslintrc.js => eslintrc.ts} | 6 +- tests/lib/configs/{flat.js => flat.ts} | 103 +++++++++--------- .../rules/{block-order.js => block-order.ts} | 21 ++-- ...ment-directive.js => comment-directive.ts} | 25 +++-- tsconfig.json | 4 + 5 files changed, 81 insertions(+), 78 deletions(-) rename tests/lib/configs/{eslintrc.js => eslintrc.ts} (82%) rename tests/lib/configs/{flat.js => flat.ts} (65%) rename tests/lib/rules/{block-order.js => block-order.ts} (97%) rename tests/lib/rules/{comment-directive.js => comment-directive.ts} (96%) diff --git a/tests/lib/configs/eslintrc.js b/tests/lib/configs/eslintrc.ts similarity index 82% rename from tests/lib/configs/eslintrc.js rename to tests/lib/configs/eslintrc.ts index 561a6d749..85d25022c 100644 --- a/tests/lib/configs/eslintrc.js +++ b/tests/lib/configs/eslintrc.ts @@ -1,7 +1,5 @@ -'use strict' - -const { ESLint } = require('../../eslint-compat') -const plugin = require('../../../lib/index.ts').default +import { ESLint } from '../../eslint-compat' +import plugin from '../../../lib' describe('eslintrc configs', () => { for (const name of Object.keys(plugin.configs)) { diff --git a/tests/lib/configs/flat.js b/tests/lib/configs/flat.ts similarity index 65% rename from tests/lib/configs/flat.js rename to tests/lib/configs/flat.ts index afdaff3df..ed9e282b1 100644 --- a/tests/lib/configs/flat.js +++ b/tests/lib/configs/flat.ts @@ -3,14 +3,13 @@ * @author 唯然 */ -'use strict' +import { Linter } from 'eslint' +import plugin from '../../../lib' +import { strict as assert } from 'assert' +import { FlatESLint } from '../../eslint-compat' -const plugin = require('../../../lib/index.ts').default -const { strict: assert } = require('assert') // node v14 does not support 'assert/strict' -const { FlatESLint } = require('../../eslint-compat') - -function mergeConfig(configs) { - let config = { rules: {}, plugins: {} } +function mergeConfig(configs: Linter.FlatConfig[]): Linter.FlatConfig { + let config: Linter.FlatConfig = { rules: {}, plugins: {} } for (const item of configs) { config = { ...config, @@ -37,16 +36,16 @@ describe('flat configs', () => { const forVue = mergeConfig( base.filter((config) => config.files?.includes('*.vue') || !config.files) ) - assert.strictEqual(forVue.plugins.vue, plugin) + assert.strictEqual(forVue.plugins!.vue, plugin) assert.strictEqual(forVue.processor, 'vue/vue') - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') const forOtherThanVue = mergeConfig( base.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) }) @@ -61,20 +60,20 @@ describe('flat configs', () => { (config) => config.files?.includes('*.vue') || !config.files ) ) - assert.strictEqual(forVue.plugins.vue, plugin) - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') - assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error') + assert.strictEqual(forVue.plugins!.vue, plugin) + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error') const forOtherThanVue = mergeConfig( essential.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) assert.strictEqual( - forOtherThanVue.rules['vue/multi-word-component-names'], + forOtherThanVue.rules!['vue/multi-word-component-names'], 'error' ) }) @@ -89,20 +88,20 @@ describe('flat configs', () => { (config) => config.files?.includes('*.vue') || !config.files ) ) - assert.strictEqual(forVue.plugins.vue, plugin) - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') - assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error') + assert.strictEqual(forVue.plugins!.vue, plugin) + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error') const forOtherThanVue = mergeConfig( stronglyRecommended.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) assert.strictEqual( - forOtherThanVue.rules['vue/multi-word-component-names'], + forOtherThanVue.rules!['vue/multi-word-component-names'], 'error' ) }) @@ -117,24 +116,24 @@ describe('flat configs', () => { (config) => config.files?.includes('*.vue') || !config.files ) ) - assert.strictEqual(forVue.plugins.vue, plugin) - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') - assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error') - assert.strictEqual(forVue.rules['vue/attributes-order'], 'warn') + assert.strictEqual(forVue.plugins!.vue, plugin) + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error') + assert.strictEqual(forVue.rules!['vue/attributes-order'], 'warn') const forOtherThanVue = mergeConfig( recommended.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) assert.strictEqual( - forOtherThanVue.rules['vue/multi-word-component-names'], + forOtherThanVue.rules!['vue/multi-word-component-names'], 'error' ) - assert.strictEqual(forOtherThanVue.rules['vue/attributes-order'], 'warn') + assert.strictEqual(forOtherThanVue.rules!['vue/attributes-order'], 'warn') }) it('should export vue2-essential config', () => { @@ -147,20 +146,20 @@ describe('flat configs', () => { (config) => config.files?.includes('*.vue') || !config.files ) ) - assert.strictEqual(forVue.plugins.vue, plugin) - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') - assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error') + assert.strictEqual(forVue.plugins!.vue, plugin) + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error') const forOtherThanVue = mergeConfig( essential.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) assert.strictEqual( - forOtherThanVue.rules['vue/multi-word-component-names'], + forOtherThanVue.rules!['vue/multi-word-component-names'], 'error' ) }) @@ -175,20 +174,20 @@ describe('flat configs', () => { (config) => config.files?.includes('*.vue') || !config.files ) ) - assert.strictEqual(forVue.plugins.vue, plugin) - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') - assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error') + assert.strictEqual(forVue.plugins!.vue, plugin) + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error') const forOtherThanVue = mergeConfig( stronglyRecommended.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) assert.strictEqual( - forOtherThanVue.rules['vue/multi-word-component-names'], + forOtherThanVue.rules!['vue/multi-word-component-names'], 'error' ) }) @@ -203,24 +202,24 @@ describe('flat configs', () => { (config) => config.files?.includes('*.vue') || !config.files ) ) - assert.strictEqual(forVue.plugins.vue, plugin) - assert.strictEqual(forVue.rules['vue/comment-directive'], 'error') - assert.strictEqual(forVue.rules['vue/multi-word-component-names'], 'error') - assert.strictEqual(forVue.rules['vue/attributes-order'], 'warn') + assert.strictEqual(forVue.plugins!.vue, plugin) + assert.strictEqual(forVue.rules!['vue/comment-directive'], 'error') + assert.strictEqual(forVue.rules!['vue/multi-word-component-names'], 'error') + assert.strictEqual(forVue.rules!['vue/attributes-order'], 'warn') const forOtherThanVue = mergeConfig( recommended.filter((config) => !config.files?.includes('*.vue')) ) - assert.strictEqual(forOtherThanVue.plugins.vue, plugin) + assert.strictEqual(forOtherThanVue.plugins!.vue, plugin) assert.strictEqual( - forOtherThanVue.rules['vue/comment-directive'], + forOtherThanVue.rules!['vue/comment-directive'], undefined ) assert.strictEqual( - forOtherThanVue.rules['vue/multi-word-component-names'], + forOtherThanVue.rules!['vue/multi-word-component-names'], 'error' ) - assert.strictEqual(forOtherThanVue.rules['vue/attributes-order'], 'warn') + assert.strictEqual(forOtherThanVue.rules!['vue/attributes-order'], 'warn') }) it('should work the suppress comments with base config', async () => { @@ -281,7 +280,7 @@ describe('flat configs', () => { const result = await eslint.lintText(code, { filePath: 'MyComponent.vue' }) assert.deepStrictEqual( - result[0].messages.map((message) => message.ruleId), + result[0].messages.map((message: Linter.LintMessage) => message.ruleId), [ 'vue/no-parsing-error', 'vue/max-attributes-per-line', diff --git a/tests/lib/rules/block-order.js b/tests/lib/rules/block-order.ts similarity index 97% rename from tests/lib/rules/block-order.js rename to tests/lib/rules/block-order.ts index 718cae845..e421055a7 100644 --- a/tests/lib/rules/block-order.js +++ b/tests/lib/rules/block-order.ts @@ -1,12 +1,12 @@ /** * @author Yosuke Ota */ -'use strict' - -const rule = require('../../../lib/rules/block-order') -const RuleTester = require('../../eslint-compat').RuleTester -const assert = require('assert') -const { ESLint } = require('../../eslint-compat') +import assert from 'assert' +import parserVue from 'vue-eslint-parser' +import rule from '../../../lib/rules/block-order' +import { ESLint, RuleTester } from '../../eslint-compat' +import pluginVue from '../../../lib' +import processor from '../../../lib/processor' // Initialize linter. const eslint = new ESLint({ @@ -14,25 +14,26 @@ const eslint = new ESLint({ overrideConfig: { files: ['**/*.vue'], languageOptions: { - parser: require('vue-eslint-parser'), + parser: parserVue, ecmaVersion: 2015 }, - plugins: { vue: require('../../../lib/index.ts').default }, + plugins: { vue: pluginVue }, rules: { 'vue/comment-directive': 'error', 'vue/block-order': 'error' }, - processor: require('../../../lib/processor.ts').default + processor }, fix: true }) const tester = new RuleTester({ languageOptions: { - parser: require('vue-eslint-parser') + parser: parserVue } }) +// @ts-expect-error tester.run('block-order', rule, { valid: [ // default diff --git a/tests/lib/rules/comment-directive.js b/tests/lib/rules/comment-directive.ts similarity index 96% rename from tests/lib/rules/comment-directive.js rename to tests/lib/rules/comment-directive.ts index d7e0f975b..2a7efdab6 100644 --- a/tests/lib/rules/comment-directive.js +++ b/tests/lib/rules/comment-directive.ts @@ -3,10 +3,11 @@ * @author Toru Nagashima */ -'use strict' - -const assert = require('assert') -const { ESLint } = require('../../eslint-compat') +import assert from 'assert' +import parserVue from 'vue-eslint-parser' +import { ESLint } from '../../eslint-compat' +import pluginVue from '../../../lib' +import processor from '../../../lib/processor' // Initialize linter. const eslint = new ESLint({ @@ -14,21 +15,21 @@ const eslint = new ESLint({ overrideConfig: { files: ['*.*'], languageOptions: { - parser: require('vue-eslint-parser'), + parser: parserVue, ecmaVersion: 2015 }, - plugins: { vue: require('../../../lib/index.ts').default }, + plugins: { vue: pluginVue }, rules: { 'no-unused-vars': 'error', 'vue/comment-directive': 'error', 'vue/no-parsing-error': 'error', 'vue/no-duplicate-attributes': 'error' }, - processor: require('../../../lib/processor.ts').default + processor } }) -async function lintMessages(code) { +async function lintMessages(code: string) { const result = await eslint.lintText(code, { filePath: 'test.vue' }) return result[0].messages } @@ -357,10 +358,10 @@ describe('comment-directive', () => { overrideConfig: { files: ['**/*.vue'], languageOptions: { - parser: require('vue-eslint-parser'), + parser: parserVue, ecmaVersion: 2015 }, - plugins: { vue: require('../../../lib/index.ts').default }, + plugins: { vue: pluginVue }, rules: { 'no-unused-vars': 'error', 'vue/comment-directive': [ @@ -370,11 +371,11 @@ describe('comment-directive', () => { 'vue/no-parsing-error': 'error', 'vue/no-duplicate-attributes': 'error' }, - processor: require('../../../lib/processor.ts').default + processor } }) - async function lintMessages(code) { + async function lintMessages(code: string) { const result = await eslint.lintText(code, { filePath: 'test.vue' }) return result[0].messages } diff --git a/tsconfig.json b/tsconfig.json index 6aae92ec5..5c6bfa7ff 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,9 @@ "module": "preserve", "moduleResolution": "bundler", "lib": ["es2020"], + "types": [ + "vitest/globals" + ], "allowJs": true, "checkJs": true, "noEmit": true, @@ -28,6 +31,7 @@ }, "include": [ "lib/**/*", + "tests/**/*.ts", "typings/eslint-plugin-vue/global.d.ts", "docs/.vitepress/**/*.ts", "docs/.vitepress/**/*.mts" From b92bc9cbc8013d0eeea2a686e35b074b33dd591a Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Sun, 23 Nov 2025 00:38:46 +0800 Subject: [PATCH 28/31] chore: fix lint --- eslint.config.mjs | 1 + tests/lib/rules/block-order.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 0f4dbef04..36728ea74 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -285,6 +285,7 @@ export default typegen([ '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-empty-object-type': 'off', '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/triple-slash-reference': 'off', '@typescript-eslint/unified-signatures': 'off', '@typescript-eslint/ban-ts-comment': [ diff --git a/tests/lib/rules/block-order.ts b/tests/lib/rules/block-order.ts index e421055a7..c96eda126 100644 --- a/tests/lib/rules/block-order.ts +++ b/tests/lib/rules/block-order.ts @@ -33,7 +33,7 @@ const tester = new RuleTester({ } }) -// @ts-expect-error +// @ts-expect-error rule ts(#2345) tester.run('block-order', rule, { valid: [ // default From 9c58e1f48bf7b86b107ebaaa9e382c20f08b2971 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 27 Nov 2025 20:53:22 +0800 Subject: [PATCH 29/31] chore: use latest `tsdown`, don't override `rolldown` --- package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/package.json b/package.json index 09b07b3c4..66ace80ae 100644 --- a/package.json +++ b/package.json @@ -118,14 +118,11 @@ "markdownlint-cli": "^0.42.0", "pathe": "^1.1.2", "prettier": "^3.7.0", - "tsdown": "^0.16.5", + "tsdown": "^0.16.7", "typescript": "^5.7.2", "vite-plugin-eslint4b": "^0.5.1", "vitepress": "^1.4.1", "vitest": "^3.2.4", "vue-eslint-parser": "^10.0.0" - }, - "overrides": { - "rolldown": "https://pkg.pr.new/rolldown@main" } } From 7559e8d2b90c59c29f3eddcd96196a161a6849ac Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 5 Dec 2025 11:26:58 +0800 Subject: [PATCH 30/31] build: upgrade tsdown --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f824f24a..f4ba47968 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "markdownlint-cli": "^0.42.0", "pathe": "^1.1.2", "prettier": "^3.7.0", - "tsdown": "^0.16.7", + "tsdown": "^0.17.0", "typescript": "^5.7.2", "vite-plugin-eslint4b": "^0.5.1", "vitepress": "^1.4.1", From 7e482cb887682170adca845554d69bc8a8765aed Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Fri, 5 Dec 2025 11:35:57 +0800 Subject: [PATCH 31/31] fix: includes `removed-rules` --- tsdown.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsdown.config.ts b/tsdown.config.ts index 87abad4b5..3016d5017 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from 'tsdown' export default defineConfig({ entry: ['lib/index.ts'], format: ['cjs'], - copy: ['lib/index.d.ts', 'lib/eslint-typegen.d.ts'], + copy: ['lib/index.d.ts', 'lib/eslint-typegen.d.ts', 'lib/removed-rules.js'], dts: false, external: ['typescript'], unbundle: true,