Skip to content

Commit 24113b4

Browse files
committed
Fix $.update and $.update_pre for bigints
1 parent 4a85c41 commit 24113b4

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

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

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -972,23 +972,43 @@ function get_parent_context(component_context) {
972972
}
973973

974974
/**
975-
* @param {Value<number>} signal
975+
* @template {number|bigint} T
976+
* @param {Value<T>} signal
976977
* @param {1 | -1} [d]
977-
* @returns {number}
978+
* @returns {T}
978979
*/
979980
export function update(signal, d = 1) {
980-
var value = +get(signal);
981-
set(signal, value + d);
981+
var value = get(signal);
982+
983+
if(typeof value === "bigint") {
984+
//@ts-ignore
985+
set(signal, value + BigInt(d));
986+
}else {
987+
//@ts-ignore
988+
set(signal, +value + d);
989+
}
990+
982991
return value;
983992
}
984993

985994
/**
986-
* @param {Value<number>} signal
995+
* @template {number|bigint} T
996+
* @param {Value<T>} signal
987997
* @param {1 | -1} [d]
988-
* @returns {number}
998+
* @returns {T}
989999
*/
9901000
export function update_pre(signal, d = 1) {
991-
return set(signal, +get(signal) + d);
1001+
var value = get(signal);
1002+
1003+
if(typeof value === "bigint") {
1004+
//@ts-ignore
1005+
d = BigInt(d);
1006+
}else {
1007+
//@ts-ignore
1008+
value = +value;
1009+
}
1010+
//@ts-ignore
1011+
return set(signal, value + d);
9921012
}
9931013

9941014
/**

packages/svelte/tests/signals/test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,4 +739,20 @@ describe('signals', () => {
739739
assert.deepEqual(a.reactions, null);
740740
};
741741
});
742+
743+
test('bigint states update correctly', () => {
744+
return () => {
745+
const count = state(0n);
746+
747+
assert.doesNotThrow(() => $.update(count));
748+
assert.equal($.get(count), 1n);
749+
assert.doesNotThrow(() => $.update(count, -1));
750+
assert.equal($.get(count), 0n);
751+
752+
assert.doesNotThrow(() => $.update_pre(count));
753+
assert.equal($.get(count), 1n);
754+
assert.doesNotThrow(() => $.update_pre(count, -1));
755+
assert.equal($.get(count), 0n);
756+
}
757+
})
742758
});

0 commit comments

Comments
 (0)