Skip to content

Commit 945b625

Browse files
fix: Prevent $state bigints incrementing and decrementing from throwing (#14485)
* Fix `$.update` and `$.update_pre` for bigints * resolve conflicts * fix some things * fix thing i definitely didn't just break * hopefully this will fix it * fix formatting * simplify * style consistency * simplify * changeset --------- Co-authored-by: Rich Harris <rich.harris@vercel.com>
1 parent fe15ad4 commit 945b625

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

.changeset/young-beds-beam.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: correctly increment/decrement bigints

packages/svelte/src/internal/client/runtime.js

+17-8
Original file line numberDiff line numberDiff line change
@@ -1068,23 +1068,32 @@ function get_parent_context(component_context) {
10681068
}
10691069

10701070
/**
1071-
* @param {Value<number>} signal
1071+
* @template {number | bigint} T
1072+
* @param {Value<T>} signal
10721073
* @param {1 | -1} [d]
1073-
* @returns {number}
1074+
* @returns {T}
10741075
*/
10751076
export function update(signal, d = 1) {
1076-
var value = +get(signal);
1077-
set(signal, value + d);
1078-
return value;
1077+
var value = get(signal);
1078+
var result = d === 1 ? value++ : value--;
1079+
1080+
set(signal, value);
1081+
1082+
// @ts-expect-error
1083+
return result;
10791084
}
10801085

10811086
/**
1082-
* @param {Value<number>} signal
1087+
* @template {number | bigint} T
1088+
* @param {Value<T>} signal
10831089
* @param {1 | -1} [d]
1084-
* @returns {number}
1090+
* @returns {T}
10851091
*/
10861092
export function update_pre(signal, d = 1) {
1087-
return set(signal, +get(signal) + d);
1093+
var value = get(signal);
1094+
1095+
// @ts-expect-error
1096+
return set(signal, d === 1 ? ++value : --value);
10881097
}
10891098

10901099
/**

packages/svelte/tests/signals/test.ts

+16
Original file line numberDiff line numberDiff line change
@@ -765,4 +765,20 @@ describe('signals', () => {
765765
assert.deepEqual(a.deriveds, null);
766766
};
767767
});
768+
769+
test('bigint states update correctly', () => {
770+
return () => {
771+
const count = state(0n);
772+
773+
assert.doesNotThrow(() => $.update(count));
774+
assert.equal($.get(count), 1n);
775+
assert.doesNotThrow(() => $.update(count, -1));
776+
assert.equal($.get(count), 0n);
777+
778+
assert.doesNotThrow(() => $.update_pre(count));
779+
assert.equal($.get(count), 1n);
780+
assert.doesNotThrow(() => $.update_pre(count, -1));
781+
assert.equal($.get(count), 0n);
782+
};
783+
});
768784
});

0 commit comments

Comments
 (0)