diff --git a/.changeset/fresh-trains-doubt.md b/.changeset/fresh-trains-doubt.md new file mode 100644 index 0000000000..5e68fd93fc --- /dev/null +++ b/.changeset/fresh-trains-doubt.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: warn when bare `` is used in a component diff --git a/documentation/docs/98-reference/.generated/compile-warnings.md b/documentation/docs/98-reference/.generated/compile-warnings.md index f372a010a5..42797f5749 100644 --- a/documentation/docs/98-reference/.generated/compile-warnings.md +++ b/documentation/docs/98-reference/.generated/compile-warnings.md @@ -982,6 +982,12 @@ A derived value may be used in other contexts: See [the note in the docs](legacy-svelte-self) for more info. +### unexpected_head + +``` +Using `` (%location%) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead +``` + ### unknown_code ``` diff --git a/packages/svelte/messages/compile-warnings/template.md b/packages/svelte/messages/compile-warnings/template.md index f1e32a6d18..2a1bcc8933 100644 --- a/packages/svelte/messages/compile-warnings/template.md +++ b/packages/svelte/messages/compile-warnings/template.md @@ -159,3 +159,7 @@ A derived value may be used in other contexts: > `` is deprecated — use self-imports (e.g. `import %name% from './%basename%'`) instead See [the note in the docs](legacy-svelte-self) for more info. + +## unexpected_head + +> Using `` (%location%) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index bc65bd65db..d213f5e43a 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -17,7 +17,7 @@ import { check_element } from './shared/a11y/index.js'; import { validate_element } from './shared/element.js'; import { mark_subtree_dynamic } from './shared/fragment.js'; import { object } from '../../../utils/ast.js'; -import { runes } from '../../../state.js'; +import { component_name, filename, locate_node, locator, runes } from '../../../state.js'; /** * @param {AST.RegularElement} node @@ -126,6 +126,10 @@ export function RegularElement(node, context) { w.component_name_lowercase(node, node.name); } + if (node.name === 'head' && !context.state.parent_element) { + w.unexpected_head(node, locate_node(node)); + } + node.metadata.has_spread = node.attributes.some( (attribute) => attribute.type === 'SpreadAttribute' ); diff --git a/packages/svelte/src/compiler/warnings.js b/packages/svelte/src/compiler/warnings.js index 98f407671d..9b47ec8273 100644 --- a/packages/svelte/src/compiler/warnings.js +++ b/packages/svelte/src/compiler/warnings.js @@ -119,7 +119,8 @@ export const codes = [ 'slot_element_deprecated', 'svelte_component_deprecated', 'svelte_element_invalid_this', - 'svelte_self_deprecated' + 'svelte_self_deprecated', + 'unexpected_head' ]; /** @@ -843,4 +844,13 @@ export function svelte_element_invalid_this(node) { */ export function svelte_self_deprecated(node, name, basename) { w(node, 'svelte_self_deprecated', `\`\` is deprecated — use self-imports (e.g. \`import ${name} from './${basename}'\`) instead\nhttps://svelte.dev/e/svelte_self_deprecated`); +} + +/** + * Using `` (%location%) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead + * @param {null | NodeLike} node + * @param {string} location + */ +export function unexpected_head(node, location) { + w(node, 'unexpected_head', `Using \`\` (${location}) will likely lead to runtime errors. Use [\`\`](https://svelte.dev/docs/svelte/svelte-head) instead\nhttps://svelte.dev/e/unexpected_head`); } \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/naked-head/input.svelte b/packages/svelte/tests/validator/samples/naked-head/input.svelte new file mode 100644 index 0000000000..601ca34d65 --- /dev/null +++ b/packages/svelte/tests/validator/samples/naked-head/input.svelte @@ -0,0 +1,3 @@ + + + diff --git a/packages/svelte/tests/validator/samples/naked-head/warnings.json b/packages/svelte/tests/validator/samples/naked-head/warnings.json new file mode 100644 index 0000000000..9820233a88 --- /dev/null +++ b/packages/svelte/tests/validator/samples/naked-head/warnings.json @@ -0,0 +1,14 @@ +[ + { + "code": "unexpected_head", + "message": "Using `` ((unknown):1:0) will likely lead to runtime errors. Use [``](https://svelte.dev/docs/svelte/svelte-head) instead", + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 7 + } + } +]