Skip to content

Commit 1097107

Browse files
authored
feat: (experimental) partial support for Svelte v5 (#620)
1 parent 371bb20 commit 1097107

File tree

59 files changed

+306
-39
lines changed

Some content is hidden

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

59 files changed

+306
-39
lines changed

.changeset/cuddly-cats-beam.md

Lines changed: 5 additions & 0 deletions

.changeset/pre.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"mode": "pre",
3+
"tag": "next",
4+
"initialVersions": {
5+
"eslint-plugin-svelte": "2.35.0"
6+
},
7+
"changesets": []
8+
}

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
/tests/fixtures/rules/valid-compile/valid/ts
1717
/tests/fixtures/rules/prefer-style-directive
1818
/tests/fixtures/rules/@typescript-eslint
19+
/tests/fixtures/rules/valid-compile/valid/svelte3-options-custom-element-input.svelte
1920
/.svelte-kit
2021
/svelte.config-dist.js
2122
/build

.github/workflows/NodeCI.yml

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ jobs:
3434
pnpm run update
3535
pnpm run build
3636
test:
37-
name: 'Test for ESLint ${{ matrix.eslint }} on ${{ matrix.node }} OS: ${{matrix.os}}'
37+
name: 'Test for ESLint ${{ matrix.eslint }} on Node.js: ${{ matrix.node }} OS: ${{matrix.os}}'
3838
runs-on: ${{ matrix.os }}
3939
strategy:
4040
matrix:
4141
os: [ubuntu-latest]
4242
eslint: [7, 8]
43-
node: [16, 17, 18, 20]
43+
node: [20]
4444
steps:
4545
- name: Checkout
4646
uses: actions/checkout@v4
@@ -58,6 +58,29 @@ jobs:
5858
run: pnpm install
5959
- name: Test
6060
run: pnpm run test
61+
test-for-svelte-v4:
62+
name: 'Test for Svelte v4 on Node.js: ${{ matrix.node }} OS: ${{matrix.os}}'
63+
runs-on: ${{ matrix.os }}
64+
strategy:
65+
matrix:
66+
os: [ubuntu-latest]
67+
node: [16, 17, 18, 20]
68+
steps:
69+
- name: Checkout
70+
uses: actions/checkout@v4
71+
- uses: pnpm/action-setup@v2
72+
- name: Setup Node.js ${{ matrix.node }}
73+
uses: actions/setup-node@v4
74+
with:
75+
node-version: ${{ matrix.node }}
76+
- name: Install svelte@4
77+
run: |+
78+
pnpm install -D svelte@4
79+
rm -rf node_modules
80+
- name: Install Packages
81+
run: pnpm install
82+
- name: Test
83+
run: pnpm run test
6184
test-for-svelte-v3:
6285
name: Test for Svelte v3
6386
runs-on: ${{ matrix.os }}

README.md

Lines changed: 6 additions & 0 deletions

docs/README.md

Lines changed: 6 additions & 0 deletions

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
},
5959
"peerDependencies": {
6060
"eslint": "^7.0.0 || ^8.0.0-0",
61-
"svelte": "^3.37.0 || ^4.0.0"
61+
"svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.8"
6262
},
6363
"peerDependenciesMeta": {
6464
"svelte": {
@@ -77,7 +77,7 @@
7777
"postcss-safe-parser": "^6.0.0",
7878
"postcss-selector-parser": "^6.0.11",
7979
"semver": "^7.5.3",
80-
"svelte-eslint-parser": ">=0.33.0 <1.0.0"
80+
"svelte-eslint-parser": ">=0.34.0-next.2 <1.0.0"
8181
},
8282
"devDependencies": {
8383
"@1stg/browserslist-config": "^1.2.3",
@@ -164,7 +164,7 @@
164164
"stylelint": "^15.0.0",
165165
"stylelint-config-standard": "^34.0.0",
166166
"stylus": "^0.62.0",
167-
"svelte": "^4.0.0",
167+
"svelte": "^5.0.0-next.8",
168168
"svelte-adapter-ghpages": "0.1.0",
169169
"svelte-i18n": "^4.0.0",
170170
"tslib": "^2.5.0",

src/rules/indent-helpers/commons.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ export function isBeginningOfElement(node: AST.SvelteText): boolean {
9090
node.parent.type === 'SvelteElseBlock' ||
9191
node.parent.type === 'SvelteIfBlock' ||
9292
node.parent.type === 'SvelteKeyBlock' ||
93+
node.parent.type === 'SvelteSnippetBlock' ||
9394
node.parent.type === 'SvelteStyleElement'
9495
) {
9596
return node.parent.children[0] === node;

src/rules/valid-compile.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ export default createRule('valid-compile', {
2828
}
2929
const ignoreWarnings = Boolean(context.options[0]?.ignoreWarnings);
3030

31-
const ignores = ['missing-declaration', 'dynamic-slot-name'];
31+
const ignores = [
32+
'missing-declaration',
33+
// Svelte v4
34+
'dynamic-slot-name',
35+
// Svelte v5
36+
'invalid-slot-name'
37+
];
3238

3339
/**
3440
* report

src/types-for-node.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ export type ASTNodeListener = {
221221
SvelteMustacheTag?: (node: AST.SvelteMustacheTag & ASTNodeWithParent) => void;
222222
SvelteDebugTag?: (node: AST.SvelteDebugTag & ASTNodeWithParent) => void;
223223
SvelteConstTag?: (node: AST.SvelteConstTag & ASTNodeWithParent) => void;
224+
SvelteRenderTag?: (node: AST.SvelteRenderTag & ASTNodeWithParent) => void;
224225
SvelteIfBlock?: (node: AST.SvelteIfBlock & ASTNodeWithParent) => void;
225226
SvelteElseBlock?: (node: AST.SvelteElseBlock & ASTNodeWithParent) => void;
226227
SvelteEachBlock?: (node: AST.SvelteEachBlock & ASTNodeWithParent) => void;
@@ -229,6 +230,7 @@ export type ASTNodeListener = {
229230
SvelteAwaitThenBlock?: (node: AST.SvelteAwaitThenBlock & ASTNodeWithParent) => void;
230231
SvelteAwaitCatchBlock?: (node: AST.SvelteAwaitCatchBlock & ASTNodeWithParent) => void;
231232
SvelteKeyBlock?: (node: AST.SvelteKeyBlock & ASTNodeWithParent) => void;
233+
SvelteSnippetBlock?: (node: AST.SvelteSnippetBlock & ASTNodeWithParent) => void;
232234
SvelteAttribute?: (node: AST.SvelteAttribute & ASTNodeWithParent) => void;
233235
SvelteShorthandAttribute?: (node: AST.SvelteShorthandAttribute & ASTNodeWithParent) => void;
234236
SvelteSpreadAttribute?: (node: AST.SvelteSpreadAttribute & ASTNodeWithParent) => void;
@@ -439,6 +441,7 @@ export type SvelteNodeListener = {
439441
SvelteMustacheTag?: (node: AST.SvelteMustacheTag & ASTNodeWithParent) => void;
440442
SvelteDebugTag?: (node: AST.SvelteDebugTag & ASTNodeWithParent) => void;
441443
SvelteConstTag?: (node: AST.SvelteConstTag & ASTNodeWithParent) => void;
444+
SvelteRenderTag?: (node: AST.SvelteRenderTag & ASTNodeWithParent) => void;
442445
SvelteIfBlock?: (node: AST.SvelteIfBlock & ASTNodeWithParent) => void;
443446
SvelteElseBlock?: (node: AST.SvelteElseBlock & ASTNodeWithParent) => void;
444447
SvelteEachBlock?: (node: AST.SvelteEachBlock & ASTNodeWithParent) => void;
@@ -447,6 +450,7 @@ export type SvelteNodeListener = {
447450
SvelteAwaitThenBlock?: (node: AST.SvelteAwaitThenBlock & ASTNodeWithParent) => void;
448451
SvelteAwaitCatchBlock?: (node: AST.SvelteAwaitCatchBlock & ASTNodeWithParent) => void;
449452
SvelteKeyBlock?: (node: AST.SvelteKeyBlock & ASTNodeWithParent) => void;
453+
SvelteSnippetBlock?: (node: AST.SvelteSnippetBlock & ASTNodeWithParent) => void;
450454
SvelteAttribute?: (node: AST.SvelteAttribute & ASTNodeWithParent) => void;
451455
SvelteShorthandAttribute?: (node: AST.SvelteShorthandAttribute & ASTNodeWithParent) => void;
452456
SvelteSpreadAttribute?: (node: AST.SvelteSpreadAttribute & ASTNodeWithParent) => void;

tests/fixtures/rules/indent/invalid/await01-input.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,5 @@ name
8383
/await
8484
}
8585
</div>
86+
87+
<!--tests/fixtures/rules/indent/invalid/await01-input.svelte-->

tests/fixtures/rules/indent/invalid/await01-output.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,5 @@
8383
/await
8484
}
8585
</div>
86+
87+
<!--tests/fixtures/rules/indent/invalid/await01-input.svelte-->
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems to return the wrong location in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems to return the wrong location in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems to return the wrong location in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems to return the wrong location in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}

tests/fixtures/rules/mustache-spacing/invalid/always/test01-input.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@
4646
{#await expression}...{:then}...{:catch}...{/await}
4747

4848
{#key expression}...{/key}
49+
50+
<!--tests/fixtures/rules/mustache-spacing/invalid/always/test01-input.svelte-->

tests/fixtures/rules/mustache-spacing/invalid/always/test01-output.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@
4646
{ #await expression }...{ :then}...{ :catch}...{ /await }
4747

4848
{ #key expression }...{ /key }
49+
50+
<!--tests/fixtures/rules/mustache-spacing/invalid/always/test01-input.svelte-->

tests/fixtures/rules/mustache-spacing/invalid/test01-input.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@
4646

4747
{ #key expression }...{ /key }
4848
</div>
49+
50+
<!--tests/fixtures/rules/mustache-spacing/invalid/test01-input.svelte-->

tests/fixtures/rules/mustache-spacing/invalid/test01-output.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@
4646

4747
{#key expression}...{/key}
4848
</div>
49+
50+
<!--tests/fixtures/rules/mustache-spacing/invalid/test01-input.svelte-->
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems to return the wrong location in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
- message: svelte-ignore comment is used, but not warned
2-
line: 3
3-
column: 19
4-
suggestions: null
5-
- message: svelte-ignore comment is used, but not warned
6-
line: 5
2+
line: 4
73
column: 19
84
suggestions: null
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<script>
2-
let foo;
3-
// svelte-ignore unused-export-let
4-
export let used;
5-
// svelte-ignore module-script-reactive-declaration
6-
$: reactive = foo;
2+
// svelte-ignore state-rune-not-mutated
3+
let mutable = $state(42);
4+
// svelte-ignore state-rune-not-mutated
5+
let immutable = $state(42);
6+
export function update(a) {
7+
immutable = a;
8+
}
79
</script>
810

9-
{used}
11+
{mutable}{immutable}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- message: svelte-ignore comment is used, but not warned
2+
line: 3
3+
column: 19
4+
suggestions: null
5+
- message: svelte-ignore comment is used, but not warned
6+
line: 5
7+
column: 19
8+
suggestions: null
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
let foo;
3+
// svelte-ignore unused-export-let
4+
export let used;
5+
// svelte-ignore module-script-reactive-declaration
6+
$: reactive = foo;
7+
</script>
8+
9+
{used}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": "^3.0.0 || ^4.0.0"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": "^3.0.0 || ^4.0.0"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": "^3.0.0 || ^4.0.0"
3+
}
Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
<script context="module">
2-
let foo;
3-
</script>
4-
51
<script>
6-
// svelte-ignore unused-export-let
7-
export let unused;
8-
// svelte-ignore module-script-reactive-declaration
9-
$: reactive = foo;
2+
// svelte-ignore state-rune-not-mutated
3+
let immutable = $state(42);
104
</script>
5+
6+
{immutable}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script context="module">
2+
let foo;
3+
</script>
4+
5+
<script>
6+
// svelte-ignore unused-export-let
7+
export let unused;
8+
// svelte-ignore module-script-reactive-declaration
9+
$: reactive = foo;
10+
</script>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": "^3.0.0 || ^4.0.0"
3+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems that unused selectors are not checked yet in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems that unused selectors are not checked yet in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems that unused selectors are not checked yet in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems that unused selectors are not checked yet in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems that unused selectors are not checked yet in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems that unused selectors are not checked yet in Svelte v5.",
3+
"svelte": "^4 || ^3"
4+
}
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
<script lang="ts">
2-
// svelte-ignore unused-export-let
3-
export let something;
1+
<script>
2+
let mutable = $state(42);
3+
// svelte-ignore state-rune-not-mutated
4+
let immutable = $state(42);
5+
export function update(a) {
6+
mutable = a;
7+
}
48
</script>
9+
10+
{mutable}{immutable}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<script lang="ts">
2+
// svelte-ignore unused-export-let
3+
export let something;
4+
</script>

0 commit comments

Comments
 (0)