From 6c9b6a1a6e8b20d5e745f1939670b0cc3292f44f Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 7 May 2024 22:10:13 +0200 Subject: [PATCH 1/5] fix: increment and decrement edge case --- .changeset/chilled-seas-jog.md | 5 +++ .../svelte/src/internal/client/runtime.js | 15 +++++++- .../_config.js | 38 +++++++++++++++++++ .../main.svelte | 38 +++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 .changeset/chilled-seas-jog.md create mode 100644 packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte diff --git a/.changeset/chilled-seas-jog.md b/.changeset/chilled-seas-jog.md new file mode 100644 index 000000000000..a8115847dd96 --- /dev/null +++ b/.changeset/chilled-seas-jog.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: increment and decrement edge case diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index a9dee752e19b..a8d238897d46 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -1012,7 +1012,13 @@ function get_parent_context(component_context) { */ export function update(signal, d = 1) { const value = get(signal); - set(signal, value + d); + let to_mutate = value; + if (d === 1) { + to_mutate++; + } else { + to_mutate--; + } + set(signal, to_mutate); return value; } @@ -1022,7 +1028,12 @@ export function update(signal, d = 1) { * @returns {number} */ export function update_pre(signal, d = 1) { - const value = get(signal) + d; + let value = get(signal); + if (d === 1) { + ++value; + } else { + --value; + } set(signal, value); return value; } diff --git a/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js new file mode 100644 index 000000000000..83df014413ee --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js @@ -0,0 +1,38 @@ +import { test } from '../../test'; + +export default test({ + mode: ['client', 'hydrate'], + async test({ target, assert, logs }) { + /** + * @type {HTMLButtonElement | null} + */ + const increment = target.querySelector('#increment'); + /** + * @type {HTMLButtonElement | null} + */ + const decrement = target.querySelector('#decrement'); + /** + * @type {HTMLButtonElement | null} + */ + const increment_before = target.querySelector('#increment_before'); + /** + * @type {HTMLButtonElement | null} + */ + const decrement_before = target.querySelector('#decrement_before'); + + increment?.click(); + await Promise.resolve(); + assert.equal(increment?.innerHTML.trim(), '1'); + increment_before?.click(); + await Promise.resolve(); + assert.equal(increment_before?.innerHTML.trim(), '1'); + decrement?.click(); + await Promise.resolve(); + assert.equal(decrement?.innerHTML.trim(), '-1'); + decrement_before?.click(); + await Promise.resolve(); + assert.equal(decrement_before?.innerHTML.trim(), '-1'); + + assert.deepEqual(logs, ['0', 1, '0', -1]); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte new file mode 100644 index 000000000000..63931d42e741 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file From 7faf1d5f2441d76f7e66ad5d34e5bcbfe489ce1d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 May 2024 16:55:03 -0400 Subject: [PATCH 2/5] fix/simplify test --- .../_config.js | 48 +++++++------------ .../main.svelte | 48 ++++++------------- 2 files changed, 32 insertions(+), 64 deletions(-) diff --git a/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js index 83df014413ee..9e8999e0a173 100644 --- a/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/_config.js @@ -1,38 +1,24 @@ +import { flushSync } from 'svelte'; import { test } from '../../test'; export default test({ - mode: ['client', 'hydrate'], - async test({ target, assert, logs }) { - /** - * @type {HTMLButtonElement | null} - */ - const increment = target.querySelector('#increment'); - /** - * @type {HTMLButtonElement | null} - */ - const decrement = target.querySelector('#decrement'); - /** - * @type {HTMLButtonElement | null} - */ - const increment_before = target.querySelector('#increment_before'); - /** - * @type {HTMLButtonElement | null} - */ - const decrement_before = target.querySelector('#decrement_before'); + html: ` + +

0, 0, 0, 0

+ `, - increment?.click(); - await Promise.resolve(); - assert.equal(increment?.innerHTML.trim(), '1'); - increment_before?.click(); - await Promise.resolve(); - assert.equal(increment_before?.innerHTML.trim(), '1'); - decrement?.click(); - await Promise.resolve(); - assert.equal(decrement?.innerHTML.trim(), '-1'); - decrement_before?.click(); - await Promise.resolve(); - assert.equal(decrement_before?.innerHTML.trim(), '-1'); + test({ target, assert, logs }) { + const btn = target.querySelector('button'); + flushSync(() => btn?.click()); - assert.deepEqual(logs, ['0', 1, '0', -1]); + assert.htmlEqual( + target.innerHTML, + ` + +

1, -1, 1, -1

+ ` + ); + + assert.deepEqual(logs, [0, 0, 1, -1]); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte index 63931d42e741..9d8c67885831 100644 --- a/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/increment-and-decrement-strings/main.svelte @@ -1,38 +1,20 @@ - - - - - - - \ No newline at end of file + +

{a}, {b}, {c}, {d}

From 8ddd8fc233d2a4a10bd50be7c206ae83f62699a2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 May 2024 16:55:15 -0400 Subject: [PATCH 3/5] simplify --- packages/svelte/src/internal/client/runtime.js | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index a8d238897d46..8bb0b09d1f03 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -1011,14 +1011,8 @@ function get_parent_context(component_context) { * @returns {number} */ export function update(signal, d = 1) { - const value = get(signal); - let to_mutate = value; - if (d === 1) { - to_mutate++; - } else { - to_mutate--; - } - set(signal, to_mutate); + const value = +get(signal); + set(signal, value + d); return value; } @@ -1028,12 +1022,7 @@ export function update(signal, d = 1) { * @returns {number} */ export function update_pre(signal, d = 1) { - let value = get(signal); - if (d === 1) { - ++value; - } else { - --value; - } + let value = +get(signal) + d; set(signal, value); return value; } From 5b07450a25578e0e394c588af7116184d9a50463 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 May 2024 16:56:40 -0400 Subject: [PATCH 4/5] Apply suggestions from code review --- .changeset/chilled-seas-jog.md | 2 +- packages/svelte/src/internal/client/runtime.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/chilled-seas-jog.md b/.changeset/chilled-seas-jog.md index a8115847dd96..7862a5e2cded 100644 --- a/.changeset/chilled-seas-jog.md +++ b/.changeset/chilled-seas-jog.md @@ -2,4 +2,4 @@ "svelte": patch --- -fix: increment and decrement edge case +fix: coerce incremented/decremented sources diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 8bb0b09d1f03..18e73876b357 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -1011,7 +1011,7 @@ function get_parent_context(component_context) { * @returns {number} */ export function update(signal, d = 1) { - const value = +get(signal); + var value = +get(signal); set(signal, value + d); return value; } @@ -1022,7 +1022,7 @@ export function update(signal, d = 1) { * @returns {number} */ export function update_pre(signal, d = 1) { - let value = +get(signal) + d; + var value = +get(signal) + d; set(signal, value); return value; } From 718ba19685a399f18ae0291faca518375ac09bd2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 May 2024 16:58:08 -0400 Subject: [PATCH 5/5] golf --- packages/svelte/src/internal/client/runtime.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 18e73876b357..0311102f1e6e 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -1022,9 +1022,7 @@ export function update(signal, d = 1) { * @returns {number} */ export function update_pre(signal, d = 1) { - var value = +get(signal) + d; - set(signal, value); - return value; + return set(signal, +get(signal) + d); } /**