Skip to content

Commit

Permalink
(fix) bubble events (#433)
Browse files Browse the repository at this point in the history
* (fix) bubble events

Added new property $$events_def to bubble events
Also removed some obsolete types

* add union type for multiple events
  • Loading branch information
dummdidumm committed Aug 8, 2020
1 parent 156b780 commit 5fe799c
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 37 deletions.
6 changes: 1 addition & 5 deletions packages/svelte2tsx/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,7 @@ function render() {
return { props: { world }, slots: {}, events: {} };
}

export default class {
$$prop_def = __sveltets_partial(render().props);
$$slot_def = render().slots
$on = __sveltets_eventDef(render().events).$on;
}
export default class _World_ extends createSvelte2TsxComponent(__sveltets_partial(render)) {}
```

with a v3 SourceMap back to the original source.
Expand Down
22 changes: 7 additions & 15 deletions packages/svelte2tsx/src/nodes/event-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ export function createEventHandlerTransformer() {

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

const exist = events.get(eventName);
events.set(eventName, exist ? [].concat(exist, exp) : exp);
Expand All @@ -19,10 +20,7 @@ export function createEventHandlerTransformer() {
if (parent.type === 'InlineComponent') {
handleEventHandlerBubble();
} else {
events.set(
eventName,
getEventDefExpressionForNonCompoent(eventName, parent)
);
events.set(eventName, getEventDefExpressionForNonCompoent(eventName, parent));
}
}
};
Expand All @@ -47,17 +45,11 @@ function getEventDefExpressionForNonCompoent(eventName: string, ele: Node) {
}

export function eventMapToString(events: Map<string, string | string[]>) {
return '{' +
Array.from(events.entries()).map(eventMapEntryToString).join(', ') +
'}';

return '{' + Array.from(events.entries()).map(eventMapEntryToString).join(', ') + '}';
}

function eventMapEntryToString([eventName, expression]: [
string,
string | string[]
]) {
function eventMapEntryToString([eventName, expression]: [string, string | string[]]) {
return `'${eventName}':${
Array.isArray(expression) ? `[${expression}]` : expression
}`;
Array.isArray(expression) ? `__sveltets_unionType(${expression.join(',')})` : expression
}`;
}
35 changes: 20 additions & 15 deletions packages/svelte2tsx/svelte-shims.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ declare class Svelte2TsxComponent<
* and does not exist at runtime. Don't use this property.
*/
$$prop_def: Props;
/**
* @internal This is for type checking capabilities only
* and does not exist at runtime. Don't use this property.
*/
$$events_def: Events;
/**
* @internal This is for type checking capabilities only
* and does not exist at runtime. Don't use this property.
Expand Down Expand Up @@ -41,7 +46,7 @@ declare class Svelte2TsxComponent<
* Causes the callback function to be called whenever the component dispatches an event.
* A function is returned that will remove the event listener when called.
*/
$on<K extends keyof Events>(event: K, handler: (e: SvelteExtractEvent<Events[K]>) => any): void;
$on<K extends keyof Events>(event: K, handler: (e: Events[K]) => any): void;
/**
* Causes the callback function to be called whenever the component dispatches an event.
* A function is returned that will remove the event listener when called.
Expand Down Expand Up @@ -87,14 +92,7 @@ type SvelteAnimation<U extends any[]> = (node: Element, move: { from: DOMRect, t
type SvelteAllProps = { [index: string]: any }
type SvelteRestProps = { [index: string]: any }
type SvelteStore<T> = { subscribe: (run: (value: T) => any, invalidate?: any) => any }
type SvelteEventRecord = Record<string, Event | Event[]>
type SvelteExtractEvent<T> = T extends any[] ? T[number] : T;
type SvelteOnEvent<T, K extends keyof T> = (
event: K,
handler: (e: SvelteExtractEvent<T[K]>) => any
) => () => void;
type SvelteRestEvent = (event: string, handler: (e: CustomEvent) => any) => () => void
type SvelteOnAllEvent<T> = SvelteOnEvent<T, keyof T> & SvelteRestEvent


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

Expand Down Expand Up @@ -124,7 +122,7 @@ declare function __sveltets_any(dummy: any): any;
declare function __sveltets_empty(dummy: any): {};
declare function __sveltets_componentType(): AConstructorTypeOf<Svelte2TsxComponent<any, any, any, false>>
declare function __sveltets_invalidate<T>(getValue: () => T): T
declare function __sveltets_eventDef<T extends SvelteEventRecord>(def: T): SvelteOnAllEvent<T>

declare function __sveltets_mapWindowEvent<K extends keyof HTMLBodyElementEventMap>(
event: K
): HTMLBodyElementEventMap[K];
Expand All @@ -143,11 +141,18 @@ declare function __sveltets_mapElementTag<K extends keyof SVGElementTagNameMap>(
declare function __sveltets_mapElementTag(
tag: any
): HTMLElement;
declare function __sveltets_bubbleEventDef<
T extends SvelteEventRecord,
TEvent,
TKey extends keyof T = TEvent extends keyof T ? TEvent : string
>(on: SvelteOnAllEvent<T>, event: TEvent): T[TKey];

declare function __sveltets_bubbleEventDef<Events, K extends keyof Events>(
events: Events, eventKey: K
): Events[K];
declare function __sveltets_bubbleEventDef(
events: any, eventKey: string
): any;

declare function __sveltets_unionType<T1, T2>(t1: T1, t2: T2): T1 | T2;
declare function __sveltets_unionType<T1, T2, T3>(t1: T1, t2: T2, t3: T3): T1 | T2 | T3;
declare function __sveltets_unionType<T1, T2, T3, T4>(t1: T1, t2: T2, t3: T3, t4: T4): T1 | T2 | T3 | T4;
declare function __sveltets_unionType(...types: any[]): any;

declare function __sveltets_awaitThen<T>(
promise: PromiseLike<T>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<></>;function render() {
<><Button ></Button>
<Radio ></Radio></>
return { props: {}, slots: {}, getters: {}, events: {'click':[__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$on, 'click'),__sveltets_bubbleEventDef(__sveltets_instanceOf(Radio).$on, 'click')]} }}
return { props: {}, slots: {}, getters: {}, events: {'click':__sveltets_unionType(__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$$events_def, 'click'),__sveltets_bubbleEventDef(__sveltets_instanceOf(Radio).$$events_def, 'click'))} }}

export default class Input__SvelteComponent_ extends createSvelte2TsxComponent(__sveltets_partial(render)) {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<></>;function render() {
<><Button ></Button></>
return { props: {}, slots: {}, getters: {}, events: {'click':__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$on, 'click')} }}
return { props: {}, slots: {}, getters: {}, events: {'click':__sveltets_bubbleEventDef(__sveltets_instanceOf(Button).$$events_def, 'click')} }}

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

0 comments on commit 5fe799c

Please sign in to comment.