From e78cfd393e16fb754f7393b535d2120815010381 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Mon, 5 Aug 2024 17:03:27 +0100 Subject: [PATCH] fix: correctly handle SvelteDate methods with arguments (#12738) * fix: correctly handle SvelteDate methods with arguments * tweak * Update packages/svelte/src/reactivity/date.js * Update packages/svelte/src/reactivity/date.js Co-authored-by: Rich Harris * Update packages/svelte/src/reactivity/date.test.ts --------- Co-authored-by: Rich Harris --- .changeset/dirty-pens-look.md | 5 +++++ packages/svelte/src/reactivity/date.js | 8 +++++++ packages/svelte/src/reactivity/date.test.ts | 24 +++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 .changeset/dirty-pens-look.md diff --git a/.changeset/dirty-pens-look.md b/.changeset/dirty-pens-look.md new file mode 100644 index 0000000000..16536edce7 --- /dev/null +++ b/.changeset/dirty-pens-look.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly handle SvelteDate methods with arguments diff --git a/packages/svelte/src/reactivity/date.js b/packages/svelte/src/reactivity/date.js index 1b64097e73..a1fb73c5f5 100644 --- a/packages/svelte/src/reactivity/date.js +++ b/packages/svelte/src/reactivity/date.js @@ -32,6 +32,14 @@ export class SvelteDate extends Date { if (method.startsWith('get') || method.startsWith('to')) { // @ts-ignore proto[method] = function (...args) { + // don't memoize if there are arguments + // @ts-ignore + if (args.length > 0) { + get(this.#time); + // @ts-ignore + return date_proto[method].apply(this, args); + } + var d = this.#deriveds.get(method); if (d === undefined) { diff --git a/packages/svelte/src/reactivity/date.test.ts b/packages/svelte/src/reactivity/date.test.ts index d1732d26b1..e2702d9ff6 100644 --- a/packages/svelte/src/reactivity/date.test.ts +++ b/packages/svelte/src/reactivity/date.test.ts @@ -555,6 +555,30 @@ test('Date fine grained tests', () => { cleanup(); }); +test('Date.toLocaleString', () => { + const date = new SvelteDate(initial_date); + + const log: any = []; + + const cleanup = effect_root(() => { + render_effect(() => { + log.push(date.toLocaleString(undefined, { month: 'long', year: 'numeric' })); + }); + render_effect(() => { + log.push(date.toLocaleString(undefined, { month: 'long' })); + }); + }); + + flushSync(); + + assert.deepEqual(log, [ + initial_date.toLocaleString(undefined, { month: 'long', year: 'numeric' }), + initial_date.toLocaleString(undefined, { month: 'long' }) + ]); + + cleanup(); +}); + test('Date.instanceOf', () => { assert.equal(new SvelteDate() instanceof Date, true); });