From 945b625e95171de227bffa5a44a62dd983b15b93 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Sun, 1 Dec 2024 07:23:04 -0800 Subject: [PATCH] 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 --- .changeset/young-beds-beam.md | 5 ++++ .../svelte/src/internal/client/runtime.js | 25 +++++++++++++------ packages/svelte/tests/signals/test.ts | 16 ++++++++++++ 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 .changeset/young-beds-beam.md diff --git a/.changeset/young-beds-beam.md b/.changeset/young-beds-beam.md new file mode 100644 index 0000000000..4349d82dd9 --- /dev/null +++ b/.changeset/young-beds-beam.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly increment/decrement bigints diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index caa481dd1f..2779898d6f 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -1068,23 +1068,32 @@ function get_parent_context(component_context) { } /** - * @param {Value} signal + * @template {number | bigint} T + * @param {Value} 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} signal + * @template {number | bigint} T + * @param {Value} 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); } /** diff --git a/packages/svelte/tests/signals/test.ts b/packages/svelte/tests/signals/test.ts index db061bfb55..6796655cc8 100644 --- a/packages/svelte/tests/signals/test.ts +++ b/packages/svelte/tests/signals/test.ts @@ -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); + }; + }); });