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]
* @returns {number}
* @returns {T}
*/
export function update(signal, d = 1) {
var value = +get(signal);
set(signal, value + d);
return value;
var value = get(signal);
var result = d === 1 ? value++ : 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]
* @returns {number}
* @returns {T}
*/
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);
};
});
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