Skip to content

Commit b72b97b

Browse files
authored
feat: add support for eslint v9 (#673)
1 parent 9cf5efb commit b72b97b

File tree

94 files changed

+450
-302
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+450
-302
lines changed

.changeset/stale-crews-brush.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-svelte": patch
3+
---
4+
5+
feat: add support for eslint v9

.eslintrc.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ module.exports = {
9494
},
9595
{
9696
selector: 'variable',
97-
format: ['camelCase', 'UPPER_CASE'],
97+
format: ['camelCase', 'UPPER_CASE', 'PascalCase'],
9898
leadingUnderscore: 'allow',
9999
trailingUnderscore: 'allow'
100100
},
@@ -156,7 +156,8 @@ module.exports = {
156156
{
157157
files: ['tests/**'],
158158
rules: {
159-
'@typescript-eslint/no-misused-promises': 'off'
159+
'@typescript-eslint/no-misused-promises': 'off',
160+
'@typescript-eslint/no-require-imports': 'off'
160161
}
161162
},
162163
{

.github/workflows/NodeCI.yml

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ jobs:
4141
os: [ubuntu-latest]
4242
eslint: [7, 8]
4343
node: [20]
44+
include:
45+
# On next ESLint version
46+
- eslint: ^9.0.0-0
47+
node: 20
48+
os: ubuntu-latest
4449
steps:
4550
- name: Checkout
4651
uses: actions/checkout@v4

.vscode/settings.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
"source.fixAll": "explicit",
77
"source.fixAll.stylelint": "explicit"
88
},
9-
"svelte.plugin.typescript.diagnostics.enable": false
9+
"svelte.plugin.typescript.diagnostics.enable": false,
10+
"typescript.tsdk": "node_modules/typescript/lib"
1011
}

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"version:ci": "env-cmd -e version-ci pnpm run update && changeset version"
5858
},
5959
"peerDependencies": {
60-
"eslint": "^7.0.0 || ^8.0.0-0",
60+
"eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0",
6161
"svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.33"
6262
},
6363
"peerDependenciesMeta": {
@@ -69,7 +69,7 @@
6969
"@eslint-community/eslint-utils": "^4.2.0",
7070
"@jridgewell/sourcemap-codec": "^1.4.14",
7171
"debug": "^4.3.1",
72-
"eslint-compat-utils": "^0.4.0",
72+
"eslint-compat-utils": "^0.4.1",
7373
"esutils": "^2.0.3",
7474
"known-css-properties": "^0.29.0",
7575
"postcss": "^8.4.5",

src/rules/no-spaces-around-equal-signs-in-attribute.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export default createRule('no-spaces-around-equal-signs-in-attribute', {
99
recommended: false,
1010
conflictWithPrettier: true
1111
},
12-
schema: {},
12+
schema: [],
1313
fixable: 'whitespace',
1414
messages: {
1515
noSpaces: 'Unexpected spaces found around equal signs.'

src/rules/prefer-destructured-store-props.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export default createRule('prefer-destructured-store-props', {
186186
// dynamic accesses like {$foo[bar]}
187187
!node.computed
188188
) {
189-
for (const variable of findReactiveVariable(node.object, node.property.name)) {
189+
for (const variable of new Set(findReactiveVariable(node.object, node.property.name))) {
190190
suggest.push({
191191
messageId: 'fixUseVariable',
192192
data: {

src/utils/eslint-core.ts

+12-6
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,17 @@ let ruleMap: Map<string, RuleModule> | null = null;
7676
* Get the core rule implementation from the rule name
7777
*/
7878
export function getCoreRule(ruleName: string): RuleModule {
79-
let map: Map<string, RuleModule>;
80-
if (ruleMap) {
81-
map = ruleMap;
82-
} else {
83-
ruleMap = map = (new Linter() as any).getRules();
79+
try {
80+
const map: Map<string, RuleModule> = ruleMap
81+
? ruleMap
82+
: (ruleMap = (new Linter() as any).getRules());
83+
return map.get(ruleName)!;
84+
} catch {
85+
// getRules() is no longer available in flat config.
8486
}
85-
return map.get(ruleName)!;
87+
88+
// eslint-disable-next-line @typescript-eslint/no-require-imports , @typescript-eslint/no-var-requires -- Ignore
89+
const { builtinRules } = require('eslint/use-at-your-own-risk');
90+
ruleMap = builtinRules;
91+
return builtinRules.get(ruleName) || null;
8692
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"rules": {
3+
"no-var": "off"
4+
}
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"options": ["functions", { "blockScopedFunctions": "disallow" }]
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"eslint": "^9.0.0-0"
3+
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"options": ["both"]
2+
"options": ["both", { "blockScopedFunctions": "disallow" }]
33
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"eslint": "^9.0.0-0"
3+
}

tests/fixtures/rules/no-inner-declarations/invalid/both/test01-errors.yaml

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,26 @@
33
column: 3
44
suggestions: null
55
- message: Move variable declaration to program root.
6-
line: 6
6+
line: 5
77
column: 11
88
suggestions: null
99
- message: Move variable declaration to program root.
10-
line: 8
10+
line: 6
1111
column: 31
1212
suggestions: null
1313
- message: Move function declaration to program root.
14-
line: 10
14+
line: 8
1515
column: 3
1616
suggestions: null
1717
- message: Move variable declaration to function body root.
18-
line: 13
18+
line: 10
1919
column: 5
2020
suggestions: null
2121
- message: Move function declaration to program root.
22-
line: 18
22+
line: 15
2323
column: 3
2424
suggestions: null
2525
- message: Move variable declaration to function body root.
26-
line: 20
26+
line: 16
2727
column: 13
2828
suggestions: null

tests/fixtures/rules/no-inner-declarations/invalid/both/test01-input.svelte

-4
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22
if (test) {
33
function doSomething() {}
44
}
5-
// eslint-disable-next-line no-var -- test
65
if (foo) var a;
7-
// eslint-disable-next-line no-var -- test
86
if (foo) /* some comments */ var a;
97
if (foo) {
108
function f() {
119
if (bar) {
12-
// eslint-disable-next-line no-var -- test
1310
var a;
1411
}
1512
}
1613
}
1714
if (foo) {
1815
function f() {
19-
// eslint-disable-next-line no-var -- test
2016
if (bar) var a;
2117
}
2218
}

tests/fixtures/rules/no-inner-declarations/invalid/test01-errors.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
column: 3
44
suggestions: null
55
- message: Move function declaration to program root.
6-
line: 10
6+
line: 8
77
column: 3
88
suggestions: null
99
- message: Move function declaration to program root.
10-
line: 18
10+
line: 15
1111
column: 3
1212
suggestions: null

tests/fixtures/rules/no-inner-declarations/invalid/test01-input.svelte

-4
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22
if (test) {
33
function doSomething() {}
44
}
5-
// eslint-disable-next-line no-var -- test
65
if (foo) var a;
7-
// eslint-disable-next-line no-var -- test
86
if (foo) /* some comments */ var a;
97
if (foo) {
108
function f() {
119
if (bar) {
12-
// eslint-disable-next-line no-var -- test
1310
var a;
1411
}
1512
}
1613
}
1714
if (foo) {
1815
function f() {
19-
// eslint-disable-next-line no-var -- test
2016
if (bar) var a;
2117
}
2218
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"options": ["functions"]
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"eslint": "<=8"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"options": ["both"]
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"eslint": "<=8"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- message: Move function declaration to program root.
2+
line: 3
3+
column: 3
4+
suggestions: null
5+
- message: Move variable declaration to program root.
6+
line: 5
7+
column: 11
8+
suggestions: null
9+
- message: Move variable declaration to program root.
10+
line: 6
11+
column: 31
12+
suggestions: null
13+
- message: Move function declaration to program root.
14+
line: 8
15+
column: 3
16+
suggestions: null
17+
- message: Move variable declaration to function body root.
18+
line: 10
19+
column: 5
20+
suggestions: null
21+
- message: Move function declaration to program root.
22+
line: 15
23+
column: 3
24+
suggestions: null
25+
- message: Move variable declaration to function body root.
26+
line: 16
27+
column: 13
28+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script>
2+
if (test) {
3+
function doSomething() {}
4+
}
5+
if (foo) var a;
6+
if (foo) /* some comments */ var a;
7+
if (foo) {
8+
function f() {
9+
if (bar) {
10+
var a;
11+
}
12+
}
13+
}
14+
if (foo) {
15+
function f() {
16+
if (bar) var a;
17+
}
18+
}
19+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
- message: Move function declaration to program root.
2+
line: 3
3+
column: 3
4+
suggestions: null
5+
- message: Move function declaration to program root.
6+
line: 8
7+
column: 3
8+
suggestions: null
9+
- message: Move function declaration to program root.
10+
line: 15
11+
column: 3
12+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script>
2+
if (test) {
3+
function doSomething() {}
4+
}
5+
if (foo) var a;
6+
if (foo) /* some comments */ var a;
7+
if (foo) {
8+
function f() {
9+
if (bar) {
10+
var a;
11+
}
12+
}
13+
}
14+
if (foo) {
15+
function f() {
16+
if (bar) var a;
17+
}
18+
}
19+
</script>

tests/fixtures/rules/prefer-destructured-store-props/invalid/member02-errors.yaml

-17
Original file line numberDiff line numberDiff line change
@@ -95,23 +95,6 @@
9595
bar.foo: {b.foo}
9696
bar.baz: {$store.bar.baz}
9797
98-
baz.foo: {bbb.foo}
99-
baz.bar: {bbb.bar}
100-
- desc: Using the predefined reactive variable bbb
101-
messageId: fixUseVariable
102-
output: |
103-
<script>
104-
import store from './store.js';
105-
$: ({ foo, bar: b } = $store);
106-
$: bbb = $store.baz;
107-
</script>
108-
109-
foo.bar: {foo.bar}
110-
foo.baz: {$store.foo.baz}
111-
112-
bar.foo: {b.foo}
113-
bar.baz: {$store.bar.baz}
114-
11598
baz.foo: {bbb.foo}
11699
baz.bar: {bbb.bar}
117100
- desc: 'Using destructuring like $: ({ baz } = $store); will run faster'
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
{
2-
"parserOptions": {
3-
"parser": "@babel/eslint-parser"
4-
}
2+
"languageOptions": {
3+
"parserOptions": {
4+
"parser": "@babel/eslint-parser"
5+
}
6+
}
57
}

tests/src/configs/all.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import assert from 'assert';
2-
import eslint from 'eslint';
32
import plugin from '../../../src/index';
3+
import { LegacyESLint } from '../../utils/eslint-compat';
44

55
describe('`all` config', () => {
66
it('`all` config should work. ', async () => {
77
const code = `<script>const a = 1, b = 2;</script>{@html a+b}`;
88

9-
const linter = new eslint.ESLint({
9+
const linter = new LegacyESLint({
1010
plugins: {
1111
svelte: plugin as never
1212
},

tests/src/integration/no-unused-vars.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { RuleTester, Linter } from 'eslint';
1+
import type { Rule } from 'eslint';
2+
import { getCoreRule } from '../../../src/utils/eslint-core';
3+
import { RuleTester } from '../../utils/eslint-compat';
24

35
describe('Integration test for no-unused-vars', () => {
4-
const ruleNoUnusedVars = new Linter().getRules().get('no-unused-vars')!;
6+
const ruleNoUnusedVars = getCoreRule('no-unused-vars') as unknown as Rule.RuleModule;
57
const tester = new RuleTester({
6-
parser: require.resolve('svelte-eslint-parser'),
7-
parserOptions: {
8+
languageOptions: {
9+
parser: require('svelte-eslint-parser'),
810
ecmaVersion: 2020,
911
sourceType: 'module'
1012
}

0 commit comments

Comments
 (0)