Skip to content

Commit 58c1d1b

Browse files
committed
feat: migrate warnings
1 parent 2bc39b1 commit 58c1d1b

File tree

5 files changed

+64
-1
lines changed

5 files changed

+64
-1
lines changed

.changeset/eight-pianos-raise.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
fix: add backwards-compat for old warning codes in legacy mode

packages/svelte/src/compiler/migrate/index.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { get_rune } from '../phases/scope.js';
77
import { reset } from '../state.js';
88
import { extract_identifiers } from '../utils/ast.js';
99
import { regex_is_valid_identifier } from '../phases/patterns.js';
10+
import { migrate_svelte_ignore } from '../utils/extract_svelte_ignore.js';
1011

1112
/**
1213
* Does a best-effort migration of Svelte code towards using runes, event attributes and render tags.
@@ -174,6 +175,21 @@ export function migrate(source) {
174175

175176
/** @type {import('zimmerframe').Visitors<import('../types/template.js').SvelteNode, State>} */
176177
const instance_script = {
178+
_(node, { state, next }) {
179+
// @ts-expect-error
180+
const comments = node.leadingComments;
181+
if (comments) {
182+
for (const comment of comments) {
183+
if (comment.type === 'Line') {
184+
const migrated = migrate_svelte_ignore(comment.value);
185+
if (migrated !== comment.value) {
186+
state.str.overwrite(comment.start + '//'.length, comment.end, migrated);
187+
}
188+
}
189+
}
190+
}
191+
next();
192+
},
177193
Identifier(node, { state }) {
178194
handle_identifier(node, state);
179195
},
@@ -474,6 +490,12 @@ const template = {
474490
} else {
475491
state.str.update(node.start, node.end, `{@render ${name}?.(${slot_props})}`);
476492
}
493+
},
494+
Comment(node, { state }) {
495+
const migrated = migrate_svelte_ignore(node.data);
496+
if (migrated !== node.data) {
497+
state.str.overwrite(node.start + '<!--'.length, node.end - '-->'.length, migrated);
498+
}
477499
}
478500
};
479501

packages/svelte/src/compiler/utils/extract_svelte_ignore.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as w from '../warnings.js';
33

44
const regex_svelte_ignore = /^\s*svelte-ignore\s/;
55

6-
/** @type {Record<string, string>} */
6+
/** @type {Record<string, string>} Map of legacy code -> new code */
77
const replacements = {
88
'non-top-level-reactive-declaration': 'reactive_declaration_invalid_placement'
99
};
@@ -56,3 +56,21 @@ export function extract_svelte_ignore(offset, text, runes) {
5656

5757
return ignores;
5858
}
59+
60+
/**
61+
* Replaces legacy svelte-ignore codes with new codes.
62+
* @param {string} text
63+
* @returns {string}
64+
*/
65+
export function migrate_svelte_ignore(text) {
66+
const match = regex_svelte_ignore.exec(text);
67+
if (!match) return text;
68+
69+
const length = match[0].length;
70+
return (
71+
text.substring(0, length) +
72+
text
73+
.substring(length)
74+
.replace(/\w+-\w+(-\w+)*/g, (code) => replacements[code] ?? code.replace(/-/g, '_'))
75+
);
76+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
function foo() {
3+
// svelte-ignore non-top-level-reactive-declaration
4+
$: x = 1;
5+
}
6+
</script>
7+
8+
<!-- svelte-ignore a11y-something-something -->
9+
<div></div>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
function foo() {
3+
// svelte-ignore reactive_declaration_invalid_placement
4+
$: x = 1;
5+
}
6+
</script>
7+
8+
<!-- svelte-ignore a11y_something_something -->
9+
<div></div>

0 commit comments

Comments
 (0)