fix: Prevent `$state` `bigint`s 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>
pull/14489/head
ComputerGuy 9 months ago committed by GitHub
parent fe15ad4ae8
commit 945b625e95
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: correctly increment/decrement bigints

@ -1068,23 +1068,32 @@ function get_parent_context(component_context) {
} }
/** /**
* @param {Value<number>} signal * @template {number | bigint} T
* @param {Value<T>} signal
* @param {1 | -1} [d] * @param {1 | -1} [d]
* @returns {number} * @returns {T}
*/ */
export function update(signal, d = 1) { export function update(signal, d = 1) {
var value = +get(signal); var value = get(signal);
set(signal, value + d); var result = d === 1 ? value++ : value--;
return value;
set(signal, value);
// @ts-expect-error
return result;
} }
/** /**
* @param {Value<number>} signal * @template {number | bigint} T
* @param {Value<T>} signal
* @param {1 | -1} [d] * @param {1 | -1} [d]
* @returns {number} * @returns {T}
*/ */
export function update_pre(signal, d = 1) { export function update_pre(signal, d = 1) {
return set(signal, +get(signal) + d); var value = get(signal);
// @ts-expect-error
return set(signal, d === 1 ? ++value : --value);
} }
/** /**

@ -765,4 +765,20 @@ describe('signals', () => {
assert.deepEqual(a.deriveds, null); assert.deepEqual(a.deriveds, null);
}; };
}); });
test('bigint states update correctly', () => {
return () => {
const count = state(0n);
assert.doesNotThrow(() => $.update(count));
assert.equal($.get(count), 1n);
assert.doesNotThrow(() => $.update(count, -1));
assert.equal($.get(count), 0n);
assert.doesNotThrow(() => $.update_pre(count));
assert.equal($.get(count), 1n);
assert.doesNotThrow(() => $.update_pre(count, -1));
assert.equal($.get(count), 0n);
};
});
}); });

Loading…
Cancel
Save