From 9f87f059d227f86369e8aef835ba3d77d2028e40 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Thu, 18 Jan 2024 00:48:16 +0100 Subject: [PATCH] fix: skip certain slot validations for custom elements (#10207) fixes #10196 --- .changeset/blue-timers-film.md | 5 +++ .../compiler/phases/2-analyze/validation.js | 38 +++++++++++-------- .../main.svelte | 6 +++ 3 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 .changeset/blue-timers-film.md diff --git a/.changeset/blue-timers-film.md b/.changeset/blue-timers-film.md new file mode 100644 index 0000000000..4a7e421700 --- /dev/null +++ b/.changeset/blue-timers-film.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: skip certain slot validations for custom elements diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index e4e6275b46..49aea8c195 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -172,31 +172,37 @@ function validate_slot_attribute(context, attribute) { error(attribute, 'invalid-slot-attribute'); } - if (owner.type === 'Component' || owner.type === 'SvelteComponent') { + if ( + owner.type === 'Component' || + owner.type === 'SvelteComponent' || + owner.type === 'SvelteSelf' + ) { if (owner !== context.path.at(-2)) { error(attribute, 'invalid-slot-placement'); } - } - const name = attribute.value[0].data; - if (context.state.component_slots.has(name)) { - error(attribute, 'duplicate-slot-name', name, owner.name); - } - context.state.component_slots.add(name); + const name = attribute.value[0].data; - if (name === 'default') { - for (const node of owner.fragment.nodes) { - if (node.type === 'Text' && regex_only_whitespaces.test(node.data)) { - continue; - } + if (context.state.component_slots.has(name)) { + error(attribute, 'duplicate-slot-name', name, owner.name); + } - if (node.type === 'RegularElement' || node.type === 'SvelteFragment') { - if (node.attributes.some((a) => a.type === 'Attribute' && a.name === 'slot')) { + context.state.component_slots.add(name); + + if (name === 'default') { + for (const node of owner.fragment.nodes) { + if (node.type === 'Text' && regex_only_whitespaces.test(node.data)) { continue; } - } - error(node, 'invalid-default-slot-content'); + if (node.type === 'RegularElement' || node.type === 'SvelteFragment') { + if (node.attributes.some((a) => a.type === 'Attribute' && a.name === 'slot')) { + continue; + } + } + + error(node, 'invalid-default-slot-content'); + } } } } else { diff --git a/packages/svelte/tests/compiler-errors/samples/component-slot-duplicate-error/main.svelte b/packages/svelte/tests/compiler-errors/samples/component-slot-duplicate-error/main.svelte index 05475a3bf2..bbaf69118b 100644 --- a/packages/svelte/tests/compiler-errors/samples/component-slot-duplicate-error/main.svelte +++ b/packages/svelte/tests/compiler-errors/samples/component-slot-duplicate-error/main.svelte @@ -2,6 +2,12 @@ import Nested from './irrelevant'; + + + + + +

{value}

{value}