From 5ba35727d274aa24ef14a4edeef6cf332ef6f2e5 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 22 May 2025 22:40:20 +0200 Subject: [PATCH] allow writing to public deriveds on server --- .../3-transform/server/visitors/ClassBody.js | 7 +++-- .../samples/writable-derived-3/_config.js | 5 ++++ .../samples/writable-derived-3/main.svelte | 29 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 packages/svelte/tests/runtime-runes/samples/writable-derived-3/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/writable-derived-3/main.svelte diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js index 6797b0beff..432d0142cd 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/ClassBody.js @@ -36,7 +36,8 @@ export function ClassBody(node, context) { body.push( b.prop_def(field.key, null), - b.method('get', b.key(name), [], [b.return(b.call(member))]) + b.method('get', b.key(name), [], [b.return(b.call(member))]), + b.method('set', b.key(name), [b.id('$$value')], [b.return(b.call(member, b.id('$$value')))]) ); } } @@ -61,6 +62,7 @@ export function ClassBody(node, context) { if (name[0] === '#' || field.type === '$state' || field.type === '$state.raw') { body.push(/** @type {PropertyDefinition} */ (context.visit(definition, child_state))); } else if (field.node === definition) { + // $derived / $derived.by const member = b.member(b.this, field.key); body.push( @@ -69,7 +71,8 @@ export function ClassBody(node, context) { /** @type {CallExpression} */ (context.visit(field.value, child_state)) ), - b.method('get', definition.key, [], [b.return(b.call(member))]) + b.method('get', definition.key, [], [b.return(b.call(member))]), + b.method('set', b.key(name), [b.id('$$value')], [b.return(b.call(member, b.id('$$value')))]) ); } } diff --git a/packages/svelte/tests/runtime-runes/samples/writable-derived-3/_config.js b/packages/svelte/tests/runtime-runes/samples/writable-derived-3/_config.js new file mode 100644 index 0000000000..999e4ad6e0 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/writable-derived-3/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `3 3 3 3` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/writable-derived-3/main.svelte b/packages/svelte/tests/runtime-runes/samples/writable-derived-3/main.svelte new file mode 100644 index 0000000000..0b20f811c3 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/writable-derived-3/main.svelte @@ -0,0 +1,29 @@ + + +{x.on_class} {x.in_constructor} {x.on_class_private} {x.in_constructor_private}