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 @@ + + + +