Skip to content

Commit

Permalink
fix: remove let variable from select binding dependencies (#8969)
Browse files Browse the repository at this point in the history
Fixes #2943

The issue linked above invalidates a variable that is not defined in <script> but instead is defined as a let: variable, which does not make sense to invalidate, therefore, this PR exists.
  • Loading branch information
ngtr6788 authored Jul 19, 2023
1 parent cb1358c commit f8283fb
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/cyan-geese-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'svelte': patch
---

fix: remove `let:variable` slot bindings from select binding dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ export default class AttributeWrapper extends BaseAttributeWrapper {
if (select && select.select_binding_dependencies) {
select.select_binding_dependencies.forEach((prop) => {
this.node.dependencies.forEach((dependency) => {
this.parent.renderer.component.indirect_dependencies.get(prop).add(dependency);
if (this.node.scope.is_top_level(dependency)) {
this.parent.renderer.component.indirect_dependencies.get(prop).add(dependency);
}
});
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<script>
const tasks = ["do laundry", "do taxes", "cook food", "watch the kids"];
</script>

<slot {tasks} />

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
export default {
html: `
<select>
<option value='do laundry'>do laundry</option>
<option value='do taxes'>do taxes</option>
<option value='cook food'>cook food</option>
<option value='watch the kids'>watch the kids</option>
</select>
<p>1</p>
`,

async test({ assert, component, target, window }) {
const select = target.querySelector('select');
const options = target.querySelectorAll('option');

assert.equal(component.tasks_touched, 1);

const change = new window.Event('change');
options[1].selected = true;
await select.dispatchEvent(change);

assert.equal(component.selected, options[1].value);
assert.equal(component.tasks_touched, 1);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<script>
import Parent from "./Parent.svelte";
export let selected;
export let tasks = ['do nothing'];
export let tasks_touched = 0;
$: {
tasks, tasks_touched++;
}
</script>

<Parent let:tasks={tasks}>
<select bind:value={selected}>
{#each tasks as task}
<option value={task}>{task}</option>
{/each}
</select>
</Parent>
<p>{tasks_touched}</p>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<script>
const tasks = ["do laundry", "do taxes", "cook food", "watch the kids"];
</script>

<slot {tasks} />

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export default {
html: `
<select>
<option value='do laundry'>do laundry</option>
<option value='do taxes'>do taxes</option>
<option value='cook food'>cook food</option>
<option value='watch the kids'>watch the kids</option>
</select>
`,

async test({ assert, component, target, window }) {
const select = target.querySelector('select');
const options = target.querySelectorAll('option');

const change = new window.Event('change');
options[1].selected = true;
await select.dispatchEvent(change);

assert.equal(component.selected, options[1].value);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<script>
import Parent from "./Parent.svelte";
export let selected;
</script>

<Parent let:tasks={tasks}>
<select bind:value={selected}>
{#each tasks as task}
<option value={task}>{task}</option>
{/each}
</select>
</Parent>

0 comments on commit f8283fb

Please sign in to comment.