Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Component event buble
  • Loading branch information
jasonlyu123 committed Jul 12, 2020
commit 8d7dc29a797069af307bd9b678fd1a223d10bba9
14 changes: 11 additions & 3 deletions packages/svelte2tsx/src/nodes/event-handler.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
import { Node } from "estree-walker";

export function createEventHandlerTransformer() {
const events = new Map<string, string>();
const events = new Map<string, string | string[]>();

const handleEventHandler = (node: Node, parent: Node) => {
const eventName = node.name;

// pass-through
const handleEventHandlerBubble = () => {
const componentEventDef = `__sveltets_instanceOf(${parent.name})`;
const exp = `__sveltets_bubbleEventDef(${componentEventDef}, '${eventName}')`;

const exist = events.get(eventName);
events.set(eventName, exist ? [].concat(exist, exp) : exp);
};

// pass-through/ bubble
if (!node.expression) {
if (parent.type === "InlineComponent") {
// TODO: component
handleEventHandlerBubble();
} else {
events.set(
eventName,
Expand Down
25 changes: 17 additions & 8 deletions packages/svelte2tsx/src/svelte2tsx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ type TemplateProcessResult = {
moduleScriptTag: Node;
/** To be added later as a comment on the default class export */
componentDocumentation: string | null;
events: Map<string, string>;
events: Map<string, string | string[]>;
};

class Scope {
Expand Down Expand Up @@ -542,7 +542,7 @@ function processInstanceScriptContent(str: MagicString, script: Node): InstanceS
if (
(ts.isPrefixUnaryExpression(parent) || ts.isPostfixUnaryExpression(parent)) &&
parent.operator !==
ts.SyntaxKind.ExclamationToken /* `!$store` does not need processing */
ts.SyntaxKind.ExclamationToken /* `!$store` does not need processing */
) {
let simpleOperator: string;
if (parent.operator === ts.SyntaxKind.PlusPlusToken) {
Expand Down Expand Up @@ -844,8 +844,8 @@ function addComponentExport(

const statement = `\n\n${doc}export default class ${
className ? `${className} ` : ''
}{\n $$prop_def = ${propDef}\n $$slot_def = render().slots` +
`\n $on = __sveltets_eventDef(render().events).$on\n}`;
}{\n $$prop_def = ${propDef}\n $$slot_def = render().slots` +
`\n $on = __sveltets_eventDef(render().events).$on\n}`;

str.append(statement);
}
Expand Down Expand Up @@ -905,7 +905,7 @@ function createRenderFunction(
scriptTag: Node,
scriptDestination: number,
slots: Map<string, Map<string, string>>,
events: Map<string, string>,
events: Map<string, string | string[]>,
exportedNames: ExportedNames,
uses$$props: boolean,
uses$$restProps: boolean,
Expand Down Expand Up @@ -945,9 +945,18 @@ function createRenderFunction(
})
.join(', ') +
'}';
const eventsDef = '{' + Array.from(events.entries())
.map(([evnetName, expression]) => `'${evnetName}':${expression}`)
.join(', ') + '}';

const eventMapEntryToString = ([evnetName, expression]: [
string,
string | string[]
]) =>
`'${evnetName}':${
Array.isArray(expression) ? `[${expression}]` : expression
}`;
const eventsDef =
"{" +
Array.from(events.entries()).map(eventMapEntryToString).join(", ") +
"}";

const returnString = `\nreturn { props: ${createPropsStr(
exportedNames,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<></>;function render() {
<><Button ></Button>
<Radio ></Radio></>
return { props: {}, slots: {}, events: {'click':[__sveltets_bubbleEventDef(__sveltets_instanceOf(Button), 'click'),__sveltets_bubbleEventDef(__sveltets_instanceOf(Radio), 'click')]} }}

export default class Input__SvelteComponent_ {
$$prop_def = __sveltets_partial(render().props)
$$slot_def = render().slots
$on = __sveltets_eventDef(render().events).$on
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<Button on:click></Button>
<Radio on:click></Radio>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<></>;function render() {
<><Button ></Button></>
return { props: {}, slots: {}, events: {'click':__sveltets_bubbleEventDef(__sveltets_instanceOf(Button), 'click')} }}

export default class Input__SvelteComponent_ {
$$prop_def = __sveltets_partial(render().props)
$$slot_def = render().slots
$on = __sveltets_eventDef(render().events).$on
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<Button on:click></Button>