Skip to content

Commit 5fe799c

Browse files
authored
(fix) bubble events (#433)
* (fix) bubble events Added new property $$events_def to bubble events Also removed some obsolete types * add union type for multiple events
1 parent 156b780 commit 5fe799c

File tree

5 files changed

+30
-37
lines changed

5 files changed

+30
-37
lines changed

packages/svelte2tsx/README.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ function render() {
3636
return { props: { world }, slots: {}, events: {} };
3737
}
3838

39-
export default class {
40-
$$prop_def = __sveltets_partial(render().props);
41-
$$slot_def = render().slots
42-
$on = __sveltets_eventDef(render().events).$on;
43-
}
39+
export default class _World_ extends createSvelte2TsxComponent(__sveltets_partial(render)) {}
4440
```
4541

4642
with a v3 SourceMap back to the original source.

packages/svelte2tsx/src/nodes/event-handler.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ export function createEventHandlerTransformer() {
88

99
const handleEventHandlerBubble = () => {
1010
const componentEventDef = `__sveltets_instanceOf(${parent.name})`;
11-
const exp = `__sveltets_bubbleEventDef(${componentEventDef}.$on, '${eventName}')`;
11+
// eslint-disable-next-line max-len
12+
const exp = `__sveltets_bubbleEventDef(${componentEventDef}.$$events_def, '${eventName}')`;
1213

1314
const exist = events.get(eventName);
1415
events.set(eventName, exist ? [].concat(exist, exp) : exp);
@@ -19,10 +20,7 @@ export function createEventHandlerTransformer() {
1920
if (parent.type === 'InlineComponent') {
2021
handleEventHandlerBubble();
2122
} else {
22-
events.set(
23-
eventName,
24-
getEventDefExpressionForNonCompoent(eventName, parent)
25-
);
23+
events.set(eventName, getEventDefExpressionForNonCompoent(eventName, parent));
2624
}
2725
}
2826
};
@@ -47,17 +45,11 @@ function getEventDefExpressionForNonCompoent(eventName: string, ele: Node) {
4745
}
4846

4947
export function eventMapToString(events: Map<string, string | string[]>) {
50-
return '{' +
51-
Array.from(events.entries()).map(eventMapEntryToString).join(', ') +
52-
'}';
53-
48+
return '{' + Array.from(events.entries()).map(eventMapEntryToString).join(', ') + '}';
5449
}
5550

56-
function eventMapEntryToString([eventName, expression]: [
57-
string,
58-
string | string[]
59-
]) {
51+
function eventMapEntryToString([eventName, expression]: [string, string | string[]]) {
6052
return `'${eventName}':${
61-
Array.isArray(expression) ? `[${expression}]` : expression
62-
}`;
53+
Array.isArray(expression) ? `__sveltets_unionType(${expression.join(',')})` : expression
54+
}`;
6355
}

packages/svelte2tsx/svelte-shims.d.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ declare class Svelte2TsxComponent<
1414
* and does not exist at runtime. Don't use this property.
1515
*/
1616
$$prop_def: Props;
17+
/**
18+
* @internal This is for type checking capabilities only
19+
* and does not exist at runtime. Don't use this property.
20+
*/
21+
$$events_def: Events;
1722
/**
1823
* @internal This is for type checking capabilities only
1924
* and does not exist at runtime. Don't use this property.
@@ -41,7 +46,7 @@ declare class Svelte2TsxComponent<
4146
* Causes the callback function to be called whenever the component dispatches an event.
4247
* A function is returned that will remove the event listener when called.
4348
*/
44-
$on<K extends keyof Events>(event: K, handler: (e: SvelteExtractEvent<Events[K]>) => any): void;
49+
$on<K extends keyof Events>(event: K, handler: (e: Events[K]) => any): void;
4550
/**
4651
* Causes the callback function to be called whenever the component dispatches an event.
4752
* A function is returned that will remove the event listener when called.
@@ -87,14 +92,7 @@ type SvelteAnimation<U extends any[]> = (node: Element, move: { from: DOMRect, t
8792
type SvelteAllProps = { [index: string]: any }
8893
type SvelteRestProps = { [index: string]: any }
8994
type SvelteStore<T> = { subscribe: (run: (value: T) => any, invalidate?: any) => any }
90-
type SvelteEventRecord = Record<string, Event | Event[]>
91-
type SvelteExtractEvent<T> = T extends any[] ? T[number] : T;
92-
type SvelteOnEvent<T, K extends keyof T> = (
93-
event: K,
94-
handler: (e: SvelteExtractEvent<T[K]>) => any
95-
) => () => void;
96-
type SvelteRestEvent = (event: string, handler: (e: CustomEvent) => any) => () => void
97-
type SvelteOnAllEvent<T> = SvelteOnEvent<T, keyof T> & SvelteRestEvent
95+
9896

9997
declare var process: NodeJS.Process & { browser: boolean }
10098

@@ -124,7 +122,7 @@ declare function __sveltets_any(dummy: any): any;
124122
declare function __sveltets_empty(dummy: any): {};
125123
declare function __sveltets_componentType(): AConstructorTypeOf<Svelte2TsxComponent<any, any, any, false>>
126124
declare function __sveltets_invalidate<T>(getValue: () => T): T
127-
declare function __sveltets_eventDef<T extends SvelteEventRecord>(def: T): SvelteOnAllEvent<T>
125+
128126
declare function __sveltets_mapWindowEvent<K extends keyof HTMLBodyElementEventMap>(
129127
event: K
130128
): HTMLBodyElementEventMap[K];
@@ -143,11 +141,18 @@ declare function __sveltets_mapElementTag<K extends keyof SVGElementTagNameMap>(
143141
declare function __sveltets_mapElementTag(
144142
tag: any
145143
): HTMLElement;
146-
declare function __sveltets_bubbleEventDef<
147-
T extends SvelteEventRecord,
148-
TEvent,
149-
TKey extends keyof T = TEvent extends keyof T ? TEvent : string
150-
>(on: SvelteOnAllEvent<T>, event: TEvent): T[TKey];
144+
145+
declare function __sveltets_bubbleEventDef<Events, K extends keyof Events>(
146+
events: Events, eventKey: K
147+
): Events[K];
148+
declare function __sveltets_bubbleEventDef(
149+
events: any, eventKey: string
150+
): any;
151+
152+
declare function __sveltets_unionType<T1, T2>(t1: T1, t2: T2): T1 | T2;
153+
declare function __sveltets_unionType<T1, T2, T3>(t1: T1, t2: T2, t3: T3): T1 | T2 | T3;
154+
declare function __sveltets_unionType<T1, T2, T3, T4>(t1: T1, t2: T2, t3: T3, t4: T4): T1 | T2 | T3 | T4;
155+
declare function __sveltets_unionType(...types: any[]): any;
151156

152157
declare function __sveltets_awaitThen<T>(
153158
promise: PromiseLike<T>,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<></>;function render() {
22
<><Button ></Button>
33
<Radio ></Radio></>
4-
return { props: {}, slots: {}, getters: {}, events: {'click':[__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$on, 'click'),__sveltets_bubbleEventDef(__sveltets_instanceOf(Radio).$on, 'click')]} }}
4+
return { props: {}, slots: {}, getters: {}, events: {'click':__sveltets_unionType(__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$$events_def, 'click'),__sveltets_bubbleEventDef(__sveltets_instanceOf(Radio).$$events_def, 'click'))} }}
55

66
export default class Input__SvelteComponent_ extends createSvelte2TsxComponent(__sveltets_partial(render)) {
77
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<></>;function render() {
22
<><Button ></Button></>
3-
return { props: {}, slots: {}, getters: {}, events: {'click':__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$on, 'click')} }}
3+
return { props: {}, slots: {}, getters: {}, events: {'click':__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$$events_def, 'click')} }}
44

55
export default class Input__SvelteComponent_ extends createSvelte2TsxComponent(__sveltets_partial(render)) {
66
}

0 commit comments

Comments
 (0)