diff --git a/.changeset/little-laws-sit.md b/.changeset/little-laws-sit.md new file mode 100644 index 000000000000..a395ea6213fc --- /dev/null +++ b/.changeset/little-laws-sit.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: do not warn for `binding_property_non_reactive` if binding is a store in an each diff --git a/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts b/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts index db4adf451c2e..63fe3223cf7d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts +++ b/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts @@ -45,6 +45,7 @@ export interface ComponentClientTransformState extends ClientTransformState { readonly hoisted: Array; readonly events: Set; readonly is_instance: boolean; + readonly store_to_invalidate?: string; /** Stuff that happens before the render effect(s) */ readonly init: Statement[]; diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js index 24a696e7d215..629cacda0148 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js @@ -143,7 +143,8 @@ export function EachBlock(node, context) { const child_state = { ...context.state, - transform: { ...context.state.transform } + transform: { ...context.state.transform }, + store_to_invalidate }; /** The state used when generating the key function, if necessary */ diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js index 9214a13c94ca..ca5094f455c6 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js @@ -309,12 +309,16 @@ export function validate_binding(state, binding, expression) { const loc = locator(binding.start); + const obj = /** @type {Expression} */ (expression.object); + state.init.push( b.stmt( b.call( '$.validate_binding', b.literal(state.analysis.source.slice(binding.start, binding.end)), - b.thunk(/** @type {Expression} */ (expression.object)), + b.thunk( + state.store_to_invalidate ? b.sequence([b.call('$.mark_store_binding'), obj]) : obj + ), b.thunk( /** @type {Expression} */ ( expression.computed diff --git a/packages/svelte/tests/runtime-runes/samples/each-bind-store-no-warning/_config.js b/packages/svelte/tests/runtime-runes/samples/each-bind-store-no-warning/_config.js new file mode 100644 index 000000000000..dba2e856500c --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/each-bind-store-no-warning/_config.js @@ -0,0 +1,10 @@ +import { test } from '../../test'; + +export default test({ + compileOptions: { + dev: true + }, + async test({ assert, warnings }) { + assert.deepEqual(warnings, []); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/each-bind-store-no-warning/main.svelte b/packages/svelte/tests/runtime-runes/samples/each-bind-store-no-warning/main.svelte new file mode 100644 index 000000000000..f927bf079a1d --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/each-bind-store-no-warning/main.svelte @@ -0,0 +1,10 @@ + + + +{#each $array as item} +
+{/each}