diff --git a/.changeset/swift-dolls-joke.md b/.changeset/swift-dolls-joke.md
new file mode 100644
index 00000000..4740d716
--- /dev/null
+++ b/.changeset/swift-dolls-joke.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-vue-scoped-css": minor
+---
+
+fix(deps): update dependency eslint-compat-utils to ^0.2.0
diff --git a/.github/workflows/NodeCI.yml b/.github/workflows/NodeCI.yml
index 6d0ccb94..d26dce09 100644
--- a/.github/workflows/NodeCI.yml
+++ b/.github/workflows/NodeCI.yml
@@ -35,6 +35,19 @@ jobs:
run: npm run build
- name: Test
run: npm test
+ test-with-eslint9:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Use Node.js
+ uses: actions/setup-node@v4
+ - name: Install Target Packages
+ run: |+
+ npm i -D eslint@^9.0.0-0 --legacy-peer-deps
+ npx rimraf node_modules
+ npm install -f
+ - name: Test
+ run: npm test
test-with-eslint6:
runs-on: ubuntu-latest
strategy:
diff --git a/package-lock.json b/package-lock.json
index 2aa5dfd5..32de0efa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "eslint-compat-utils": "^0.1.2",
+ "eslint-compat-utils": "^0.2.1",
"lodash": "^4.17.21",
"postcss": "^8.4.31",
"postcss-safe-parser": "^6.0.0",
@@ -10378,9 +10378,12 @@
}
},
"node_modules/eslint-compat-utils": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
- "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.2.1.tgz",
+ "integrity": "sha512-+0mhJhMeVaiMrgtltweI3sThf8g9VSZKVNSna6gdULUycp9HmcTvcYTw+b7YY+OUHAPXmRiJ9fvsDFnQq9i//A==",
+ "dependencies": {
+ "semver": "^7.5.4"
+ },
"engines": {
"node": ">=12"
},
@@ -14767,7 +14770,6 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
@@ -20047,7 +20049,6 @@
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -25399,8 +25400,7 @@
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/yaml": {
"version": "2.2.2",
@@ -33618,10 +33618,12 @@
}
},
"eslint-compat-utils": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
- "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
- "requires": {}
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.2.1.tgz",
+ "integrity": "sha512-+0mhJhMeVaiMrgtltweI3sThf8g9VSZKVNSna6gdULUycp9HmcTvcYTw+b7YY+OUHAPXmRiJ9fvsDFnQq9i//A==",
+ "requires": {
+ "semver": "^7.5.4"
+ }
},
"eslint-config-prettier": {
"version": "9.0.0",
@@ -36895,7 +36897,6 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
"requires": {
"yallist": "^4.0.0"
}
@@ -40972,7 +40973,6 @@
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
@@ -45243,8 +45243,7 @@
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"yaml": {
"version": "2.2.2",
diff --git a/package.json b/package.json
index fa8b7029..6eb273af 100644
--- a/package.json
+++ b/package.json
@@ -95,7 +95,7 @@
},
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "eslint-compat-utils": "^0.1.2",
+ "eslint-compat-utils": "^0.2.1",
"lodash": "^4.17.21",
"postcss": "^8.4.31",
"postcss-safe-parser": "^6.0.0",
diff --git a/tests/lib/comment-directives.ts b/tests/lib/comment-directives.ts
index 5dde412f..f251a655 100644
--- a/tests/lib/comment-directives.ts
+++ b/tests/lib/comment-directives.ts
@@ -1,9 +1,17 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "./test-lib/eslint-compat";
+import { Linter } from "eslint";
import rule = require("../../lib/rules/no-unused-selector");
+import * as semver from "semver";
+
+import * as vueParser from "vue-eslint-parser";
+
+const testRulePrefix = semver.gte(Linter.version, "9.0.0-0")
+ ? "rule-to-test/"
+ : "";
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
@@ -59,10 +67,10 @@ tester.run("no-unused-selector-comment-directives", rule as any, {
";
@@ -10,17 +12,19 @@ describe("Don't crash even if without vue-eslint-parser.", () => {
it(ruleId, () => {
const linter = new Linter();
const config = {
- parserOptions: {
+ languageOptions: {
ecmaVersion: 2015,
- ecmaFeatures: {
- jsx: true,
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
},
},
+ plugins: { "vue-scoped-css": plugin },
rules: {
[ruleId]: "error",
},
};
- linter.defineRule(ruleId, plugin.rules[key] as any);
linter.verifyAndFix(code, config as any, "test.vue");
});
}
diff --git a/tests/lib/rules/enforce-style-type.ts b/tests/lib/rules/enforce-style-type.ts
index 1152d648..1dbc5d4a 100644
--- a/tests/lib/rules/enforce-style-type.ts
+++ b/tests/lib/rules/enforce-style-type.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/enforce-style-type");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/no-deprecated-deep-combinator.ts b/tests/lib/rules/no-deprecated-deep-combinator.ts
index fd681d15..82198217 100644
--- a/tests/lib/rules/no-deprecated-deep-combinator.ts
+++ b/tests/lib/rules/no-deprecated-deep-combinator.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/no-deprecated-deep-combinator");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/no-deprecated-v-enter-v-leave-class.ts b/tests/lib/rules/no-deprecated-v-enter-v-leave-class.ts
index 0aec5ccd..b8f0a601 100644
--- a/tests/lib/rules/no-deprecated-v-enter-v-leave-class.ts
+++ b/tests/lib/rules/no-deprecated-v-enter-v-leave-class.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/no-deprecated-v-enter-v-leave-class");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/no-parent-of-v-global.ts b/tests/lib/rules/no-parent-of-v-global.ts
index a5cfcb45..55dc63c0 100644
--- a/tests/lib/rules/no-parent-of-v-global.ts
+++ b/tests/lib/rules/no-parent-of-v-global.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/no-parent-of-v-global");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/no-parsing-error.ts b/tests/lib/rules/no-parsing-error.ts
index 01764f3d..d128be35 100644
--- a/tests/lib/rules/no-parsing-error.ts
+++ b/tests/lib/rules/no-parsing-error.ts
@@ -1,11 +1,13 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import semver from "semver";
import rule = require("../../../lib/rules/no-parsing-error");
const parserVersion = require("vue-eslint-parser/package.json").version;
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/no-unused-keyframes.ts b/tests/lib/rules/no-unused-keyframes.ts
index 806a9fce..3d32f676 100644
--- a/tests/lib/rules/no-unused-keyframes.ts
+++ b/tests/lib/rules/no-unused-keyframes.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/no-unused-keyframes");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/no-unused-selector.ts b/tests/lib/rules/no-unused-selector.ts
index 4618cd5e..99173b9b 100644
--- a/tests/lib/rules/no-unused-selector.ts
+++ b/tests/lib/rules/no-unused-selector.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/no-unused-selector");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/require-scoped.ts b/tests/lib/rules/require-scoped.ts
index d452ee1e..ff486677 100644
--- a/tests/lib/rules/require-scoped.ts
+++ b/tests/lib/rules/require-scoped.ts
@@ -1,12 +1,14 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import semver from "semver";
import rule = require("../../../lib/rules/require-scoped");
const parserVersion = require("vue-eslint-parser/package.json").version;
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/require-selector-used-inside.ts b/tests/lib/rules/require-selector-used-inside.ts
index 7cc72b5e..84fef49e 100644
--- a/tests/lib/rules/require-selector-used-inside.ts
+++ b/tests/lib/rules/require-selector-used-inside.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/require-selector-used-inside");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/require-v-deep-argument.ts b/tests/lib/rules/require-v-deep-argument.ts
index a2f02c0e..c496c218 100644
--- a/tests/lib/rules/require-v-deep-argument.ts
+++ b/tests/lib/rules/require-v-deep-argument.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/require-v-deep-argument");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/require-v-global-argument.ts b/tests/lib/rules/require-v-global-argument.ts
index 2e0204e5..7124d716 100644
--- a/tests/lib/rules/require-v-global-argument.ts
+++ b/tests/lib/rules/require-v-global-argument.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/require-v-global-argument");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/require-v-slotted-argument.ts b/tests/lib/rules/require-v-slotted-argument.ts
index c16236fb..c53005ac 100644
--- a/tests/lib/rules/require-v-slotted-argument.ts
+++ b/tests/lib/rules/require-v-slotted-argument.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/require-v-slotted-argument");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/v-deep-pseudo-style.ts b/tests/lib/rules/v-deep-pseudo-style.ts
index a4312b71..082bbce4 100644
--- a/tests/lib/rules/v-deep-pseudo-style.ts
+++ b/tests/lib/rules/v-deep-pseudo-style.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/v-deep-pseudo-style");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/v-global-pseudo-style.ts b/tests/lib/rules/v-global-pseudo-style.ts
index 0e2df984..40360e72 100644
--- a/tests/lib/rules/v-global-pseudo-style.ts
+++ b/tests/lib/rules/v-global-pseudo-style.ts
@@ -1,9 +1,11 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/v-global-pseudo-style");
+import * as vueParser from "vue-eslint-parser";
+
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/rules/v-slotted-pseudo-style.ts b/tests/lib/rules/v-slotted-pseudo-style.ts
index 879db2bf..d96a5e87 100644
--- a/tests/lib/rules/v-slotted-pseudo-style.ts
+++ b/tests/lib/rules/v-slotted-pseudo-style.ts
@@ -1,9 +1,10 @@
-import { RuleTester } from "eslint";
+import { RuleTester } from "../test-lib/eslint-compat";
import rule = require("../../../lib/rules/v-slotted-pseudo-style");
+import * as vueParser from "vue-eslint-parser";
const tester = new RuleTester({
- parser: require.resolve("vue-eslint-parser"),
- parserOptions: {
+ languageOptions: {
+ parser: vueParser,
ecmaVersion: 2019,
sourceType: "module",
},
diff --git a/tests/lib/styles/test-utils.ts b/tests/lib/styles/test-utils.ts
index 0e8c3bf9..ddd1ff6a 100644
--- a/tests/lib/styles/test-utils.ts
+++ b/tests/lib/styles/test-utils.ts
@@ -1,4 +1,4 @@
-import eslint from "eslint";
+import { getLinter } from "eslint-compat-utils/linter";
import fs from "fs";
import path from "path";
@@ -6,16 +6,21 @@ import path from "path";
import type { RuleContext } from "../../../lib/types";
import type { StyleContext } from "../../../lib/styles/context";
import { getStyleContexts } from "../../../lib/styles/context";
+import * as vueParser from "vue-eslint-parser";
+// eslint-disable-next-line @typescript-eslint/naming-convention -- Class name
+const Linter = getLinter();
const ROOT = path.join(__dirname, "./fixtures/index");
-const ruleId = "test";
-
const config = {
- parser: "vue-eslint-parser",
- parserOptions: { ecmaVersion: 2019, sourceType: "module" },
+ files: ["*", "*.vue", "**/*.vue"],
+ languageOptions: {
+ parser: vueParser,
+ ecmaVersion: 2019,
+ sourceType: "module",
+ },
rules: {
- [ruleId]: "error",
+ "test/test": "error",
},
};
@@ -28,23 +33,34 @@ function executeLint(
sourcePath: string,
_name: string,
): { style: StyleContext; context: RuleContext } {
- const linter = new eslint.Linter();
+ const linter = new Linter();
let style: StyleContext | null = null;
let context: RuleContext | null = null;
let err = null;
- linter.defineParser("vue-eslint-parser", require("vue-eslint-parser"));
- linter.defineRule(ruleId, {
- create(ctx: RuleContext) {
- try {
- context = ctx;
- style = getStyleContexts(ctx)[0];
- } catch (e) {
- err = e;
- }
- return {};
- },
- } as any);
- linter.verifyAndFix(source, config as any, sourcePath);
+ linter.verifyAndFix(
+ source,
+ {
+ ...config,
+ plugins: {
+ test: {
+ rules: {
+ test: {
+ create(ctx: RuleContext) {
+ try {
+ context = ctx;
+ style = getStyleContexts(ctx)[0];
+ } catch (e) {
+ err = e;
+ }
+ return {};
+ },
+ },
+ },
+ },
+ },
+ } as any,
+ sourcePath,
+ );
if (err) {
throw err;
}
diff --git a/tests/lib/test-lib/eslint-compat.ts b/tests/lib/test-lib/eslint-compat.ts
new file mode 100644
index 00000000..3e9418c9
--- /dev/null
+++ b/tests/lib/test-lib/eslint-compat.ts
@@ -0,0 +1,8 @@
+import { getRuleTester } from "eslint-compat-utils/rule-tester";
+import { getLegacyESLint } from "eslint-compat-utils/eslint";
+
+// eslint-disable-next-line @typescript-eslint/naming-convention -- Class name
+export const RuleTester = getRuleTester();
+
+// eslint-disable-next-line @typescript-eslint/naming-convention -- Class name
+export const LegacyESLint = getLegacyESLint();
diff --git a/tests/regressions/reporter.ts b/tests/regressions/reporter.ts
index d4259019..b4e02711 100644
--- a/tests/regressions/reporter.ts
+++ b/tests/regressions/reporter.ts
@@ -1,7 +1,11 @@
+import { getLinter } from "eslint-compat-utils/linter";
import assert from "assert";
import plugin from "../../lib/index";
-import eslint from "eslint";
+import type * as eslint from "eslint";
+import * as vueParser from "vue-eslint-parser";
+// eslint-disable-next-line @typescript-eslint/naming-convention -- Class name
+const Linter = getLinter();
type LinterMessages = Partial