Closed
Description
Describe the bug
I have this code for Box
export class Box<T> {
#getter: () => T;
#setter?: (value: T) => void;
#derived = $derived.by(() => {
let val = $state(this.#getter());
return {
get current() {
return val;
},
set current(value) {
val = value;
}
};
});
constructor(getter: () => T, setter?: (value: T) => void) {
this.#getter = getter;
this.#setter = setter;
$effect(() => {
this.#setter?.($state.snapshot(this.#derived.current) as T);
});
}
get current(): T {
return this.#derived.current;
}
set current(value: T) {
this.#derived.current = value;
}
}
Then, I tried to leverage writable $derived and rewrote to this:
export class Box<T> {
#getter: () => T;
#setter?: (value: T) => void;
#derived = $derived.by(() => this.#getter());
constructor(getter: () => T, setter?: (value: T) => void) {
this.#getter = getter;
this.#setter = setter;
$effect(() => {
this.#setter?.($state.snapshot(this.#derived) as T);
});
}
get current(): T {
return this.#derived;
}
set current(value: T) {
this.#derived = value;
}
}
This gave the issue when generated on server
Reason: This is generating the following invalid code when generate: "server"
:
class Box {
#getter;
#setter;
#derived = $.once(() => this.#getter());
constructor(getter, setter) {
this.#getter = getter;
this.#setter = setter;
}
get current() {
return this.#derived();
}
set current(value) {
this.#derived() = value;
}
}
The line this.#derived() = value;
is wrong.
Reproduction
Go to compile settings, turn on generate: server
Logs
System Info
System:
OS: macOS 15.4
CPU: (10) arm64 Apple M1 Pro
Memory: 97.44 MB / 16.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 22.14.0 - ~/.volta/tools/image/node/22.14.0/bin/node
npm: 10.9.2 - ~/.volta/tools/image/node/22.14.0/bin/npm
pnpm: 9.2.0 - ~/.volta/bin/pnpm
bun: 1.2.4 - ~/.bun/bin/bun
Browsers:
Edge: 134.0.3124.95
Safari: 18.4
npmPackages:
svelte: 5.25.6 => 5.25.6
Severity
annoyance
Metadata
Metadata
Assignees
Labels
No labels