Skip to content

Commit 946d6c7

Browse files
authored
(feat) better typings for actions (#421)
#416
1 parent e737daf commit 946d6c7

File tree

7 files changed

+42
-17
lines changed

7 files changed

+42
-17
lines changed

packages/svelte2tsx/src/htmlxtojsx.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,11 @@ export function convertHtmlxToJsx(
7474
const on = 'on';
7575
//for handler assignment, we changeIt to call to our __sveltets_ensureFunction
7676
str.appendRight(
77-
attr.start, `{__sveltets_instanceOf(${getTypeForComponent(parent)}).$`
77+
attr.start,
78+
`{__sveltets_instanceOf(${getTypeForComponent(parent)}).$`,
7879
);
7980
const eventNameIndex = htmlx.indexOf(':', attr.start) + 1;
80-
str.overwrite(
81-
htmlx.indexOf(on, attr.start) + on.length,
82-
eventNameIndex,
83-
`('`
84-
);
81+
str.overwrite(htmlx.indexOf(on, attr.start) + on.length, eventNameIndex, `('`);
8582
const eventEnd = htmlx.lastIndexOf('=', attr.expression.start);
8683
str.overwrite(eventEnd, attr.expression.start, `', `);
8784
str.overwrite(attr.expression.end, attr.end, ')}');
@@ -103,8 +100,12 @@ export function convertHtmlxToJsx(
103100
}
104101
};
105102

106-
const handleActionDirective = (attr: Node) => {
107-
str.overwrite(attr.start, attr.start + 'use:'.length, '{...__sveltets_ensureAction(');
103+
const handleActionDirective = (attr: Node, parent: Node) => {
104+
str.overwrite(
105+
attr.start,
106+
attr.start + 'use:'.length,
107+
`{...__sveltets_ensureAction(__sveltets_mapElementTag('${parent.name}'),`,
108+
);
108109

109110
if (!attr.expression) {
110111
str.appendLeft(attr.end, ')}');
@@ -173,7 +174,6 @@ export function convertHtmlxToJsx(
173174
};
174175

175176
const handleBinding = (attr: Node, el: Node) => {
176-
177177
const getThisType = (node: Node) => {
178178
switch (node.type) {
179179
case 'InlineComponent':
@@ -224,7 +224,7 @@ export function convertHtmlxToJsx(
224224
str.appendLeft(
225225
attr.end,
226226
`=__sveltets_instanceOf(${oneWayBindingAttributes.get(attr.name)}).${
227-
attr.name
227+
attr.name
228228
})}`,
229229
);
230230
} else {
@@ -233,7 +233,7 @@ export function convertHtmlxToJsx(
233233
attr.expression.end,
234234
attr.end,
235235
`=__sveltets_instanceOf(${oneWayBindingAttributes.get(attr.name)}).${
236-
attr.name
236+
attr.name
237237
})}`,
238238
);
239239
}
@@ -611,7 +611,7 @@ export function convertHtmlxToJsx(
611611
handleClassDirective(node);
612612
break;
613613
case 'Action':
614-
handleActionDirective(node);
614+
handleActionDirective(node, parent);
615615
break;
616616
case 'Transition':
617617
handleTransitionDirective(node);

packages/svelte2tsx/svelte-shims.d.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ declare module '*.svelte' {
99

1010
type AConstructorTypeOf<T> = new (...args: any[]) => T;
1111

12-
type SvelteAction<U extends any[]> = (node: HTMLElement, ...args:U) => {
12+
type SvelteAction<U extends any[], El extends any> = (node: El, ...args:U) => {
1313
update?: (...args:U) => void,
1414
destroy?: () => void
1515
} | void
@@ -48,7 +48,11 @@ type SvelteOnAllEvent<T> = SvelteOnEvent<T, keyof T> & SvelteRestEvent
4848
declare var process: NodeJS.Process & { browser: boolean }
4949

5050
declare function __sveltets_ensureAnimation<U extends any[]>(animation: SvelteAnimation<U>, ...args: U): {};
51-
declare function __sveltets_ensureAction<U extends any[]>(action: SvelteAction<U>, ...args: U): {};
51+
declare function __sveltets_ensureAction<U extends any[], El extends any>(
52+
el: El,
53+
action: SvelteAction<U, El>,
54+
...args: U
55+
): {};
5256
declare function __sveltets_ensureTransition<U extends any[]>(transition: SvelteTransition<U>, ...args: U): {};
5357
declare function __sveltets_ensureFunction(expression: (e: Event & { detail?: any }) => unknown ): {};
5458
declare function __sveltets_ensureType<T>(type: AConstructorTypeOf<T>, el: T): {};
@@ -73,6 +77,15 @@ declare function __sveltets_mapBodyEvent<K extends keyof WindowEventMap>(
7377
declare function __sveltets_mapElementEvent<K extends keyof HTMLElementEventMap>(
7478
event: K
7579
): HTMLElementEventMap[K];
80+
declare function __sveltets_mapElementTag<K extends keyof ElementTagNameMap>(
81+
tag: K
82+
): ElementTagNameMap[K];
83+
declare function __sveltets_mapElementTag<K extends keyof SVGElementTagNameMap>(
84+
tag: K
85+
): SVGElementTagNameMap[K];
86+
declare function __sveltets_mapElementTag(
87+
tag: any
88+
): HTMLElement;
7689
declare function __sveltets_bubbleEventDef<
7790
T extends SvelteEventRecord,
7891
TEvent,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<><h1 {...__sveltets_ensureAction(blink)}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureAction(__sveltets_mapElementTag('h1'),blink)}>Hello</h1></>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<><svg {...__sveltets_ensureAction(__sveltets_mapElementTag('svg'),svgAction)}></svg>
2+
<div {...__sveltets_ensureAction(__sveltets_mapElementTag('div'),divAction)}>
3+
<input {...__sveltets_ensureAction(__sveltets_mapElementTag('input'),action)} />
4+
<p {...__sveltets_ensureAction(__sveltets_mapElementTag('p'),pAction)}></p>
5+
<unknownTag {...__sveltets_ensureAction(__sveltets_mapElementTag('unknownTag'),unknownAction)}></unknownTag>
6+
</div></>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<svg use:svgAction></svg>
2+
<div use:divAction>
3+
<input use:action />
4+
<p use:pAction></p>
5+
<unknownTag use:unknownAction></unknownTag>
6+
</div>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<><h1 {...__sveltets_ensureAction(blink,500,2)}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureAction(__sveltets_mapElementTag('h1'),blink,500,2)}>Hello</h1></>

packages/svelte2tsx/test/htmlx2jsx/samples/directive-quoted/expected.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<><h1 onclick={()=>console.log("click")}>Hello</h1>
22
<Component />{__sveltets_instanceOf(Component).$on('click', test)}
3-
<img {...__sveltets_ensureAction(action,thing)} />
3+
<img {...__sveltets_ensureAction(__sveltets_mapElementTag('img'),action,thing)} />
44
<img {...__sveltets_ensureTransition(fade, params)} />
55
<img {...__sveltets_ensureType(Boolean, !!(classthing))} />
66
<img {...__sveltets_ensureAnimation(thing, params)} />

0 commit comments

Comments
 (0)