From cd0ff3b31f80b190be7fa046242c16a82940252a Mon Sep 17 00:00:00 2001 From: tanzehao Date: Tue, 18 Aug 2026 00:33:01 +0800 Subject: [PATCH 1/4] fix: keep click pointerType undefined instead of the string "undefined" String(undefined) produced an invalid pointerType token. Pointer events without an explicit type should leave the property unset. Change-Id: Ib2f744ee8eb282499c83e5f483d9301d4b3d5e99 Co-authored-by: Cursor --- src/event/createEvent.ts | 12 ++++++++---- tests/event/createEvent.ts | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 tests/event/createEvent.ts diff --git a/src/event/createEvent.ts b/src/event/createEvent.ts index c6b1462d..3c54a6a9 100644 --- a/src/event/createEvent.ts +++ b/src/event/createEvent.ts @@ -222,9 +222,9 @@ function initMouseEvent( pageX, pageY, }: MouseEventInit & - Partial< - Pick - >, + Partial< + Pick + >, ) { assignProps(event, { screenX: sanitizeNumber(screenX), @@ -268,7 +268,11 @@ function initPointerEvent( tiltX: sanitizeNumber(tiltX), tiltY: sanitizeNumber(tiltY), twist: sanitizeNumber(twist), - pointerType: String(pointerType), isPrimary: Boolean(isPrimary), }) + // Do not String(undefined) — that yields the invalid token "undefined". + // assignProps also coalesces undefined to null, so set this property directly. + Object.defineProperty(event, 'pointerType', { + get: () => (pointerType === undefined ? undefined : String(pointerType)), + }) } diff --git a/tests/event/createEvent.ts b/tests/event/createEvent.ts new file mode 100644 index 00000000..25e1486c --- /dev/null +++ b/tests/event/createEvent.ts @@ -0,0 +1,8 @@ +import {createEvent} from '#src/event/createEvent' +import {render} from '#testHelpers' + +test('it does not stringify click pointerType', () => { + const {element} = render(``) + const event = createEvent('click', element) + expect(event).toHaveProperty('pointerType', undefined) +}) From 32e4155afdfa1eedb64a186e7bd89886dcc013f8 Mon Sep 17 00:00:00 2001 From: tzh476 Date: Fri, 21 Aug 2026 16:57:43 +0800 Subject: [PATCH 2/4] fix: initialize pointerType to empty string per W3C spec Change-Id: I1754ed6e71ea154f86d8e4ea75c5729f32c63b62 Co-Authored-By: Claude Fable 5 --- src/event/createEvent.ts | 6 +----- tests/event/behavior/keypress.ts | 1 + tests/event/createEvent.ts | 10 ++++++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/event/createEvent.ts b/src/event/createEvent.ts index 3c54a6a9..a29cc2f8 100644 --- a/src/event/createEvent.ts +++ b/src/event/createEvent.ts @@ -268,11 +268,7 @@ function initPointerEvent( tiltX: sanitizeNumber(tiltX), tiltY: sanitizeNumber(tiltY), twist: sanitizeNumber(twist), + pointerType: pointerType === undefined ? '' : String(pointerType), isPrimary: Boolean(isPrimary), }) - // Do not String(undefined) — that yields the invalid token "undefined". - // assignProps also coalesces undefined to null, so set this property directly. - Object.defineProperty(event, 'pointerType', { - get: () => (pointerType === undefined ? undefined : String(pointerType)), - }) } diff --git a/tests/event/behavior/keypress.ts b/tests/event/behavior/keypress.ts index c4007bae..38d60e05 100644 --- a/tests/event/behavior/keypress.ts +++ b/tests/event/behavior/keypress.ts @@ -101,6 +101,7 @@ cases( expect(eventWasFired('click')).toBe(hasClick) if (hasClick) { expect(getEvents('click')[0]).toHaveProperty('detail', 0) + expect(getEvents('click')[0]).toHaveProperty('pointerType', '') } }, { diff --git a/tests/event/createEvent.ts b/tests/event/createEvent.ts index 25e1486c..b81d50a4 100644 --- a/tests/event/createEvent.ts +++ b/tests/event/createEvent.ts @@ -1,8 +1,14 @@ import {createEvent} from '#src/event/createEvent' import {render} from '#testHelpers' -test('it does not stringify click pointerType', () => { +test('it initializes pointerType to empty string by default', () => { const {element} = render(``) const event = createEvent('click', element) - expect(event).toHaveProperty('pointerType', undefined) + expect(event).toHaveProperty('pointerType', '') +}) + +test('it preserves explicitly provided pointerType', () => { + const {element} = render(``) + const event = createEvent('pointerdown', element, {pointerType: 'mouse'}) + expect(event).toHaveProperty('pointerType', 'mouse') }) From b5665564196f5e31ff9dbabe54db5e6daaa239d4 Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Sat, 22 Aug 2026 11:21:42 +1000 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Rob Snow --- src/event/createEvent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/createEvent.ts b/src/event/createEvent.ts index a29cc2f8..bc3f0ff0 100644 --- a/src/event/createEvent.ts +++ b/src/event/createEvent.ts @@ -268,7 +268,7 @@ function initPointerEvent( tiltX: sanitizeNumber(tiltX), tiltY: sanitizeNumber(tiltY), twist: sanitizeNumber(twist), - pointerType: pointerType === undefined ? '' : String(pointerType), + pointerType: String(pointerType ?? ''), isPrimary: Boolean(isPrimary), }) } From 9d7649e7809b098bcd21e2500629d1eba1f6cd7e Mon Sep 17 00:00:00 2001 From: Rob Snow Date: Sat, 22 Aug 2026 11:22:25 +1000 Subject: [PATCH 4/4] Apply suggestions from code review reduce whitespace changes Co-authored-by: Rob Snow --- src/event/createEvent.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/event/createEvent.ts b/src/event/createEvent.ts index bc3f0ff0..72f754e6 100644 --- a/src/event/createEvent.ts +++ b/src/event/createEvent.ts @@ -222,9 +222,9 @@ function initMouseEvent( pageX, pageY, }: MouseEventInit & - Partial< - Pick - >, + Partial< + Pick + >, ) { assignProps(event, { screenX: sanitizeNumber(screenX),