Skip to content

Commit d6ab12a

Browse files
authored
feat: deprecate <svelte:self> in runes mode (#13333)
* feat: deprecate `<svelte:self>` in runes mode * fix
1 parent 313bcea commit d6ab12a

File tree

8 files changed

+62
-5
lines changed

8 files changed

+62
-5
lines changed

.changeset/old-spoons-pull.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+
feat: deprecate `<svelte:self>` in runes mode

packages/svelte/messages/compile-warnings/template.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,7 @@ A derived value may be used in other contexts:
9797
## svelte_element_invalid_this
9898

9999
> `this` should be an `{expression}`. Using a string attribute value will cause an error in future versions of Svelte
100+
101+
## svelte_self_deprecated
102+
103+
> `<svelte:self>` is deprecated — use self-imports (e.g. `import %name% from './%basename%'`) instead

packages/svelte/src/compiler/phases/2-analyze/visitors/SvelteSelf.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
/** @import { Context } from '../types' */
33
import { visit_component } from './shared/component.js';
44
import * as e from '../../../errors.js';
5+
import * as w from '../../../warnings.js';
6+
import { filename } from '../../../state.js';
57

68
/**
79
* @param {AST.SvelteSelf} node
@@ -20,5 +22,15 @@ export function SvelteSelf(node, context) {
2022
e.svelte_self_invalid_placement(node);
2123
}
2224

25+
if (context.state.analysis.runes) {
26+
const name = filename === '(unknown)' ? 'Self' : context.state.analysis.name;
27+
const basename =
28+
filename === '(unknown)'
29+
? 'Self.svelte'
30+
: /** @type {string} */ (filename.split(/[/\\]/).pop());
31+
32+
w.svelte_self_deprecated(node, name, basename);
33+
}
34+
2335
visit_component(node, context);
2436
}

packages/svelte/src/compiler/warnings.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ export const codes = [
121121
"script_unknown_attribute",
122122
"slot_element_deprecated",
123123
"svelte_component_deprecated",
124-
"svelte_element_invalid_this"
124+
"svelte_element_invalid_this",
125+
"svelte_self_deprecated"
125126
];
126127

127128
/**
@@ -809,4 +810,14 @@ export function svelte_component_deprecated(node) {
809810
*/
810811
export function svelte_element_invalid_this(node) {
811812
w(node, "svelte_element_invalid_this", "`this` should be an `{expression}`. Using a string attribute value will cause an error in future versions of Svelte");
813+
}
814+
815+
/**
816+
* `<svelte:self>` is deprecated — use self-imports (e.g. `import %name% from './%basename%'`) instead
817+
* @param {null | NodeLike} node
818+
* @param {string} name
819+
* @param {string} basename
820+
*/
821+
export function svelte_self_deprecated(node, name, basename) {
822+
w(node, "svelte_self_deprecated", `\`<svelte:self>\` is deprecated — use self-imports (e.g. \`import ${name} from './${basename}'\`) instead`);
812823
}

packages/svelte/tests/validator/samples/attribute-quoted/input.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<svelte:component this={foo} class="{foo}" />
1616
<!-- prettier-ignore -->
1717
{#if foo}
18+
<!-- svelte-ignore svelte_self_deprecated -->
1819
<svelte:self class="{foo}" />
1920
{/if}
2021
<!-- prettier-ignore -->

packages/svelte/tests/validator/samples/attribute-quoted/warnings.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,23 @@
4040
"message": "Quoted attributes on components and custom elements will be stringified in a future version of Svelte. If this isn't what you want, remove the quotes",
4141
"start": {
4242
"column": 14,
43-
"line": 18
43+
"line": 19
4444
},
4545
"end": {
4646
"column": 27,
47-
"line": 18
47+
"line": 19
4848
}
4949
},
5050
{
5151
"code": "attribute_quoted",
5252
"message": "Quoted attributes on components and custom elements will be stringified in a future version of Svelte. If this isn't what you want, remove the quotes",
5353
"start": {
5454
"column": 16,
55-
"line": 21
55+
"line": 22
5656
},
5757
"end": {
5858
"column": 29,
59-
"line": 21
59+
"line": 22
6060
}
6161
}
6262
]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script>
2+
let { n = 5 } = $props();
3+
</script>
4+
5+
{#if n === 0}
6+
<p>lift-off!</p>
7+
{:else}
8+
<p>{n}</p>
9+
<svelte:self n={n - 1} />
10+
{/if}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[
2+
{
3+
"code": "svelte_self_deprecated",
4+
"message": "`<svelte:self>` is deprecated — use self-imports (e.g. `import Self from './Self.svelte'`) instead",
5+
"start": {
6+
"line": 9,
7+
"column": 1
8+
},
9+
"end": {
10+
"line": 9,
11+
"column": 26
12+
}
13+
}
14+
]

0 commit comments

Comments
 (0)