Skip to content

Commit 22f04bb

Browse files
Bashamegasaschanaz
andauthored
Enhance handleProperty function to dynamically handle additional properties (#2098)
Co-authored-by: saschanaz <[email protected]>
1 parent 9f1db18 commit 22f04bb

File tree

5 files changed

+118
-113
lines changed

5 files changed

+118
-113
lines changed

inputfiles/overridingTypes.jsonc

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,6 @@
3838
}
3939
}
4040
},
41-
"GlobalEventHandlers": {
42-
"properties": {
43-
"property": {
44-
"onerror": {
45-
"overrideType": "OnErrorEventHandler"
46-
},
47-
"ontouchcancel": {
48-
"optional": true
49-
},
50-
"ontouchend": {
51-
"optional": true
52-
},
53-
"ontouchmove": {
54-
"optional": true
55-
},
56-
"ontouchstart": {
57-
"optional": true
58-
}
59-
}
60-
}
61-
},
6241
"HTMLOrSVGElement": {
6342
"properties": {
6443
"property": {

inputfiles/patches/events.kdl

Lines changed: 85 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,99 @@
11
interface-mixin AbstractWorker {
2-
event error type=ErrorEvent
2+
event error type=ErrorEvent
33
}
44

55
interface-mixin DocumentAndElementEventHandlers {
6-
event copy type=ClipboardEvent
7-
event cut type=ClipboardEvent
8-
event paste type=ClipboardEvent
6+
event copy type=ClipboardEvent
7+
event cut type=ClipboardEvent
8+
event paste type=ClipboardEvent
99
}
1010

1111
interface-mixin GlobalEventHandlers {
12-
event abort type=UIEvent
13-
event auxclick type=PointerEvent
14-
event beforeinput type=InputEvent
15-
event beforetoggle type=ToggleEvent
16-
event blur type=FocusEvent
17-
event click type=PointerEvent
18-
event compositionend type=CompositionEvent
19-
event compositionstart type=CompositionEvent
20-
event compositionupdate type=CompositionEvent
21-
event contextmenu type=PointerEvent
22-
event dblclick type=MouseEvent
23-
event drag type=DragEvent
24-
event dragend type=DragEvent
25-
event dragenter type=DragEvent
26-
event dragleave type=DragEvent
27-
event dragover type=DragEvent
28-
event dragstart type=DragEvent
29-
event drop type=DragEvent
30-
event error type=ErrorEvent
31-
event focus type=FocusEvent
32-
event focusin type=FocusEvent
33-
event focusout type=FocusEvent
34-
event formdata type=FormDataEvent
35-
event keydown type=KeyboardEvent
36-
event keypress type=KeyboardEvent
37-
event keyup type=KeyboardEvent
38-
event mousedown type=MouseEvent
39-
event mouseenter type=MouseEvent
40-
event mouseleave type=MouseEvent
41-
event mousemove type=MouseEvent
42-
event mouseout type=MouseEvent
43-
event mouseover type=MouseEvent
44-
event mouseup type=MouseEvent
45-
event progress type=ProgressEvent
46-
event resize type=UIEvent
47-
event securitypolicyviolation type=SecurityPolicyViolationEvent
48-
event submit type=SubmitEvent
49-
event toggle type=ToggleEvent
50-
event wheel type=WheelEvent
51-
event animationcancel type=AnimationEvent
52-
event animationend type=AnimationEvent
53-
event animationiteration type=AnimationEvent
54-
event animationstart type=AnimationEvent
55-
event cut type=ClipboardEvent
56-
event copy type=ClipboardEvent
57-
event paste type=ClipboardEvent
58-
event gotpointercapture type=PointerEvent
59-
event lostpointercapture type=PointerEvent
60-
event pointercancel type=PointerEvent
61-
event pointerdown type=PointerEvent
62-
event pointerenter type=PointerEvent
63-
event pointerleave type=PointerEvent
64-
event pointermove type=PointerEvent
65-
event pointerout type=PointerEvent
66-
event pointerover type=PointerEvent
67-
event pointerup type=PointerEvent
68-
event touchcancel type=TouchEvent
69-
event touchend type=TouchEvent
70-
event touchmove type=TouchEvent
71-
event touchstart type=TouchEvent
72-
event transitionrun type=TransitionEvent
73-
event transitionstart type=TransitionEvent
74-
event transitionend type=TransitionEvent
75-
event transitioncancel type=TransitionEvent
12+
event abort type=UIEvent
13+
event auxclick type=PointerEvent
14+
event beforeinput type=InputEvent
15+
event beforetoggle type=ToggleEvent
16+
event blur type=FocusEvent
17+
event click type=PointerEvent
18+
event compositionend type=CompositionEvent
19+
event compositionstart type=CompositionEvent
20+
event compositionupdate type=CompositionEvent
21+
event contextmenu type=PointerEvent
22+
event dblclick type=MouseEvent
23+
event drag type=DragEvent
24+
event dragend type=DragEvent
25+
event dragenter type=DragEvent
26+
event dragleave type=DragEvent
27+
event dragover type=DragEvent
28+
event dragstart type=DragEvent
29+
event drop type=DragEvent
30+
event error type=ErrorEvent
31+
event focus type=FocusEvent
32+
event focusin type=FocusEvent
33+
event focusout type=FocusEvent
34+
event formdata type=FormDataEvent
35+
event keydown type=KeyboardEvent
36+
event keypress type=KeyboardEvent
37+
event keyup type=KeyboardEvent
38+
event mousedown type=MouseEvent
39+
event mouseenter type=MouseEvent
40+
event mouseleave type=MouseEvent
41+
event mousemove type=MouseEvent
42+
event mouseout type=MouseEvent
43+
event mouseover type=MouseEvent
44+
event mouseup type=MouseEvent
45+
event progress type=ProgressEvent
46+
event resize type=UIEvent
47+
event securitypolicyviolation type=SecurityPolicyViolationEvent
48+
event submit type=SubmitEvent
49+
event toggle type=ToggleEvent
50+
event wheel type=WheelEvent
51+
event animationcancel type=AnimationEvent
52+
event animationend type=AnimationEvent
53+
event animationiteration type=AnimationEvent
54+
event animationstart type=AnimationEvent
55+
event cut type=ClipboardEvent
56+
event copy type=ClipboardEvent
57+
event paste type=ClipboardEvent
58+
event gotpointercapture type=PointerEvent
59+
event lostpointercapture type=PointerEvent
60+
event pointercancel type=PointerEvent
61+
event pointerdown type=PointerEvent
62+
event pointerenter type=PointerEvent
63+
event pointerleave type=PointerEvent
64+
event pointermove type=PointerEvent
65+
event pointerout type=PointerEvent
66+
event pointerover type=PointerEvent
67+
event pointerup type=PointerEvent
68+
event touchcancel type=TouchEvent
69+
event touchend type=TouchEvent
70+
event touchmove type=TouchEvent
71+
event touchstart type=TouchEvent
72+
event transitionrun type=TransitionEvent
73+
event transitionstart type=TransitionEvent
74+
event transitionend type=TransitionEvent
75+
event transitioncancel type=TransitionEvent
76+
property onerror overrideType=OnErrorEventHandler
7677
}
7778

7879
interface-mixin MessageEventTarget {
79-
event message type=MessageEvent
80-
event messageerror type=MessageEvent
80+
event message type=MessageEvent
81+
event messageerror type=MessageEvent
8182
}
8283

8384
interface-mixin WindowEventHandlers {
84-
event beforeunload type=BeforeUnloadEvent
85-
event gamepadconnected type=GamepadEvent
86-
event gamepaddisconnected type=GamepadEvent
87-
event hashchange type=HashChangeEvent
88-
event message type=MessageEvent
89-
event messageerror type=MessageEvent
90-
event pagehide type=PageTransitionEvent
91-
event pagereveal type=PageRevealEvent
92-
event pageshow type=PageTransitionEvent
93-
event pageswap type=PageSwapEvent
94-
event popstate type=PopStateEvent
95-
event rejectionhandled type=PromiseRejectionEvent
96-
event storage type=StorageEvent
97-
event unhandledrejection type=PromiseRejectionEvent
85+
event beforeunload type=BeforeUnloadEvent
86+
event gamepadconnected type=GamepadEvent
87+
event gamepaddisconnected type=GamepadEvent
88+
event hashchange type=HashChangeEvent
89+
event message type=MessageEvent
90+
event messageerror type=MessageEvent
91+
event pagehide type=PageTransitionEvent
92+
event pagereveal type=PageRevealEvent
93+
event pageshow type=PageTransitionEvent
94+
event pageswap type=PageSwapEvent
95+
event popstate type=PopStateEvent
96+
event rejectionhandled type=PromiseRejectionEvent
97+
event storage type=StorageEvent
98+
event unhandledrejection type=PromiseRejectionEvent
9899
}

inputfiles/patches/touch-events.kdl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
interface-mixin GlobalEventHandlers {
2+
// Touch event handlers are intentionally hidden in non-mobile web browsers.
3+
// See w3c.github.io/touch-events#dfn-expose-legacy-touch-event-apis.
4+
property ontouchcancel optional=#true
5+
property ontouchend optional=#true
6+
property ontouchmove optional=#true
7+
property ontouchstart optional=#true
8+
}

inputfiles/patches/webgl.kdl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
interface-mixin WebGLRenderingContextBase {
2-
property canvas exposed=Window
2+
property canvas exposed=Window
33
}

src/build/patches.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { parse, type Node } from "kdljs";
1+
import { parse, type Value, type Node } from "kdljs";
22
import type { Enum, Event, Property, Interface, WebIdl } from "./types";
33
import { readdir, readFile } from "fs/promises";
44
import { merge } from "./helpers.js";
@@ -7,6 +7,24 @@ type DeepPartial<T> = T extends object
77
? { [K in keyof T]?: DeepPartial<T[K]> }
88
: T;
99

10+
function optionalMember<const T>(prop: string, type: T, value?: Value) {
11+
if (value === undefined) {
12+
return {};
13+
}
14+
if (typeof value !== type) {
15+
throw new Error(`Expected type ${value} for ${prop}`);
16+
}
17+
return {
18+
[prop]: value as T extends "string"
19+
? string
20+
: T extends "number"
21+
? number
22+
: T extends "boolean"
23+
? boolean
24+
: never,
25+
};
26+
}
27+
1028
/**
1129
* Converts patch files in KDL to match the [types](types.d.ts).
1230
*/
@@ -92,15 +110,12 @@ function handleMixin(node: Node): DeepPartial<Interface> {
92110
}
93111
}
94112

95-
const result = {
113+
return {
96114
name,
97115
events: { event },
98116
properties: { property },
117+
...optionalMember("extends", "string", node.properties?.extends),
99118
} as DeepPartial<Interface>;
100-
if (node.properties.extends) {
101-
result.extends = node.properties.extends as string;
102-
}
103-
return result;
104119
}
105120

106121
/**
@@ -121,7 +136,9 @@ function handleEvent(child: Node): Event {
121136
function handleProperty(child: Node): Partial<Property> {
122137
return {
123138
name: child.values[0] as string,
124-
exposed: child.properties?.exposed as string,
139+
...optionalMember("exposed", "string", child.properties?.exposed),
140+
...optionalMember("optional", "boolean", child.properties?.optional),
141+
...optionalMember("overrideType", "string", child.properties?.overrideType),
125142
};
126143
}
127144

0 commit comments

Comments
 (0)