Skip to content

Commit 73d0197

Browse files
committed
bubble svelte:window and svelte:body
1 parent b171f2b commit 73d0197

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Node } from 'estree-walker';
1+
import { Node } from "estree-walker";
22

33
export function createEventHandlerTransformer() {
44
const events = new Map<string, string>();
@@ -8,14 +8,32 @@ export function createEventHandlerTransformer() {
88

99
// pass-through
1010
if (!node.expression) {
11-
if (parent.type === "Element") {
12-
events.set(eventName, `__sveltets_mapElementEvent('${eventName}')`);
11+
if (parent.type === "InlineComponent") {
12+
// TODO: component
13+
} else {
14+
events.set(
15+
eventName,
16+
getEventDefExpressionForNonCompoent(eventName, parent)
17+
);
1318
}
1419
}
1520
};
1621

1722
return {
1823
handleEventHandler,
19-
getEvents: () => events
24+
getEvents: () => events,
2025
};
2126
}
27+
28+
function getEventDefExpressionForNonCompoent(eventName: string, ele: Node) {
29+
switch (ele.type) {
30+
case "Element":
31+
return `__sveltets_mapElementEvent('${eventName}')`;
32+
case "Body":
33+
return `__sveltets_mapBodyEvent('${eventName}')`;
34+
case "Window":
35+
return `__sveltets_mapWindowEvent('${eventName}')`;
36+
default:
37+
break;
38+
}
39+
}

packages/svelte2tsx/svelte-shims.d.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,16 @@ declare function __sveltets_any(dummy: any): any;
6262
declare function __sveltets_componentType(): AConstructorTypeOf<SvelteComponent>
6363
declare function __sveltets_invalidate<T>(getValue: () => T): T
6464
declare function __sveltets_eventDef<T extends SvelteEventRecord>(def: T): SvelteEventHandling<T>
65-
declare function __sveltets_mapGlobalEvent<K extends keyof GlobalEventHandlersEventMap>(
65+
declare function __sveltets_mapWindowEvent<K extends keyof HTMLBodyElementEventMap>(
6666
event: K
67-
): GlobalEventHandlersEventMap[K];
67+
): HTMLBodyElementEventMap[K];
68+
declare function __sveltets_mapBodyEvent<K extends keyof WindowEventMap>(
69+
event: K
70+
): WindowEventMap[K];
6871
declare function __sveltets_mapElementEvent<K extends keyof HTMLElementEventMap>(
6972
event: K
7073
): HTMLElementEventMap[K];
74+
declare function __sveltets_bubbleEventDef<
75+
T extends SvelteEventRecord,
76+
K extends keyof T
77+
>(componentDef: SvelteEventHandling<T>, event: K): T[K]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<></>;function render() {
2+
<><sveltebody onclick={undefined}></sveltebody>
3+
<sveltewindow onresize={undefined}></sveltewindow></>
4+
return { props: {}, slots: {}, events: {'click':__sveltets_mapBodyEvent('click'), 'resize':__sveltets_mapWindowEvent('resize')} }}
5+
6+
export default class Input__SvelteComponent_ {
7+
$$prop_def = __sveltets_partial(render().props)
8+
$$slot_def = render().slots
9+
$on = __sveltets_eventDef(render().events).$on
10+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<svelte:body on:click></svelte:body>
2+
<svelte:window on:resize></svelte:window>

0 commit comments

Comments
 (0)