diff --git a/.changeset/large-emus-cough.md b/.changeset/large-emus-cough.md
new file mode 100644
index 0000000000..81e6d9b714
--- /dev/null
+++ b/.changeset/large-emus-cough.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+feat: allow ignoring binding_property_non_reactive
diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js
index 3e8fff654f..a6b4b0f72e 100644
--- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js
+++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js
@@ -53,7 +53,7 @@ import { regex_is_valid_identifier } from '../../../patterns.js';
import { javascript_visitors_runes } from './javascript-runes.js';
import { sanitize_template_string } from '../../../../utils/sanitize_template_string.js';
import { walk } from 'zimmerframe';
-import { locator } from '../../../../state.js';
+import { ignore_map, locator } from '../../../../state.js';
import is_reference from 'is-reference';
/**
@@ -781,10 +781,15 @@ function serialize_inline_component(node, component_name, context, anchor = cont
} else if (attribute.type === 'BindDirective') {
const expression = /** @type {Expression} */ (context.visit(attribute.expression));
+ const to_ignore = ignore_map
+ .get(node)
+ ?.some((code) => code.has('binding_property_non_reactive'));
+
if (
expression.type === 'MemberExpression' &&
context.state.options.dev &&
- context.state.analysis.runes
+ context.state.analysis.runes &&
+ !to_ignore
) {
context.state.init.push(serialize_validate_binding(context.state, attribute, expression));
}
@@ -2872,6 +2877,10 @@ export const template_visitors = {
const expression = node.expression;
const property = binding_properties[node.name];
+ const to_ignore = ignore_map
+ .get(node)
+ ?.some((code) => code.has('binding_property_non_reactive'));
+
if (
expression.type === 'MemberExpression' &&
(node.name !== 'this' ||
@@ -2883,7 +2892,8 @@ export const template_visitors = {
type === 'KeyBlock'
)) &&
context.state.options.dev &&
- context.state.analysis.runes
+ context.state.analysis.runes &&
+ !to_ignore
) {
context.state.init.push(
serialize_validate_binding(
diff --git a/packages/svelte/src/compiler/warnings.js b/packages/svelte/src/compiler/warnings.js
index d9c197cf75..2735193a6d 100644
--- a/packages/svelte/src/compiler/warnings.js
+++ b/packages/svelte/src/compiler/warnings.js
@@ -115,7 +115,8 @@ export const codes = [
"element_invalid_self_closing_tag",
"event_directive_deprecated",
"slot_element_deprecated",
- "svelte_element_invalid_this"
+ "svelte_element_invalid_this",
+ "binding_property_non_reactive"
];
/**
diff --git a/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored-2/_config.js b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored-2/_config.js
new file mode 100644
index 0000000000..e93067eb9d
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored-2/_config.js
@@ -0,0 +1,11 @@
+import { test } from '../../test';
+
+export default test({
+ mode: ['client'],
+ compileOptions: {
+ dev: true
+ },
+ async test({ warnings, assert }) {
+ assert.deepEqual(warnings, []);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored-2/main.svelte b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored-2/main.svelte
new file mode 100644
index 0000000000..218cfe7506
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored-2/main.svelte
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored/_config.js b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored/_config.js
new file mode 100644
index 0000000000..e93067eb9d
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored/_config.js
@@ -0,0 +1,11 @@
+import { test } from '../../test';
+
+export default test({
+ mode: ['client'],
+ compileOptions: {
+ dev: true
+ },
+ async test({ warnings, assert }) {
+ assert.deepEqual(warnings, []);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored/main.svelte b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored/main.svelte
new file mode 100644
index 0000000000..4cbd69d06b
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/binding-property-non-reactive-ignored/main.svelte
@@ -0,0 +1,6 @@
+
+
+
+