@@ -3,6 +3,7 @@ import { h, UI } from "@commontools/api";
33import { render , renderImpl } from "../src/render.ts" ;
44import * as assert from "./assert.ts" ;
55import { JSDOM } from "jsdom" ;
6+ import { serializableEvent } from "../src/render.ts" ;
67
78let dom : JSDOM ;
89
@@ -13,6 +14,10 @@ beforeEach(() => {
1314 globalThis . Element = dom . window . Element ;
1415 globalThis . Node = dom . window . Node ;
1516 globalThis . Text = dom . window . Text ;
17+ globalThis . InputEvent = dom . window . InputEvent ;
18+ globalThis . KeyboardEvent = dom . window . KeyboardEvent ;
19+ globalThis . MouseEvent = dom . window . MouseEvent ;
20+ globalThis . CustomEvent = dom . window . CustomEvent ;
1621} ) ;
1722
1823describe ( "render" , ( ) => {
@@ -109,3 +114,119 @@ describe("renderImpl", () => {
109114 assert . equal ( parent . children . length , 0 ) ;
110115 } ) ;
111116} ) ;
117+
118+ describe ( "serializableEvent" , ( ) => {
119+ function isPlainSerializableObject ( obj : any ) : boolean {
120+ if ( typeof obj !== "object" || obj === null ) return true ; // primitives are serializable
121+ if ( Array . isArray ( obj ) ) {
122+ return obj . every ( isPlainSerializableObject ) ;
123+ }
124+ if ( Object . getPrototypeOf ( obj ) !== Object . prototype ) return false ;
125+ for ( const key in obj ) {
126+ if ( typeof obj [ key ] === "function" ) return false ;
127+ if ( ! isPlainSerializableObject ( obj [ key ] ) ) return false ;
128+ }
129+ return true ;
130+ }
131+
132+ it ( "serializes a basic Event" , ( ) => {
133+ const event = new Event ( "test" ) ;
134+ const result = serializableEvent ( event ) ;
135+ assert . matchObject ( result , { type : "test" } ) ;
136+ assert . equal (
137+ isPlainSerializableObject ( result ) ,
138+ true ,
139+ "Result should be a plain serializable object" ,
140+ ) ;
141+ } ) ;
142+
143+ it ( "serializes a KeyboardEvent" , ( ) => {
144+ const event = new KeyboardEvent ( "keydown" , {
145+ key : "a" ,
146+ code : "KeyA" ,
147+ repeat : true ,
148+ altKey : true ,
149+ ctrlKey : false ,
150+ metaKey : true ,
151+ shiftKey : false ,
152+ } ) ;
153+ const result = serializableEvent ( event ) ;
154+ assert . matchObject ( result , {
155+ type : "keydown" ,
156+ key : "a" ,
157+ code : "KeyA" ,
158+ repeat : true ,
159+ altKey : true ,
160+ ctrlKey : false ,
161+ metaKey : true ,
162+ shiftKey : false ,
163+ } ) ;
164+ assert . equal (
165+ isPlainSerializableObject ( result ) ,
166+ true ,
167+ "Result should be a plain serializable object" ,
168+ ) ;
169+ } ) ;
170+
171+ it ( "serializes a MouseEvent" , ( ) => {
172+ const event = new MouseEvent ( "click" , {
173+ button : 0 ,
174+ buttons : 1 ,
175+ altKey : false ,
176+ ctrlKey : true ,
177+ metaKey : false ,
178+ shiftKey : true ,
179+ } ) ;
180+ const result = serializableEvent ( event ) ;
181+ assert . matchObject ( result , {
182+ type : "click" ,
183+ button : 0 ,
184+ buttons : 1 ,
185+ altKey : false ,
186+ ctrlKey : true ,
187+ metaKey : false ,
188+ shiftKey : true ,
189+ } ) ;
190+ assert . equal (
191+ isPlainSerializableObject ( result ) ,
192+ true ,
193+ "Result should be a plain serializable object" ,
194+ ) ;
195+ } ) ;
196+
197+ it ( "serializes an InputEvent with target value" , ( ) => {
198+ const input = document . createElement ( "input" ) ;
199+ input . value = "hello" ;
200+ const event = new InputEvent ( "input" , {
201+ data : "h" ,
202+ inputType : "insertText" ,
203+ } ) ;
204+ Object . defineProperty ( event , "target" , { value : input } ) ;
205+ const result = serializableEvent ( event ) ;
206+ assert . matchObject ( result , {
207+ type : "input" ,
208+ data : "h" ,
209+ inputType : "insertText" ,
210+ target : { value : "hello" } ,
211+ } ) ;
212+ assert . equal (
213+ isPlainSerializableObject ( result ) ,
214+ true ,
215+ "Result should be a plain serializable object" ,
216+ ) ;
217+ } ) ;
218+
219+ it ( "serializes a CustomEvent with detail" , ( ) => {
220+ const event = new CustomEvent ( "custom" , { detail : { foo : [ 42 , 43 ] } } ) ;
221+ const result = serializableEvent ( event ) ;
222+ assert . matchObject ( result , {
223+ type : "custom" ,
224+ detail : { foo : [ 42 , 43 ] } ,
225+ } ) ;
226+ assert . equal (
227+ isPlainSerializableObject ( result ) ,
228+ true ,
229+ "Result should be a plain serializable object" ,
230+ ) ;
231+ } ) ;
232+ } ) ;
0 commit comments