Skip to content

Commit 73707aa

Browse files
authored
(fix) different action/animation/transition transformation (#767)
#754 Avoid incorrect type inference in edge cases by calling the functions directly. Also cleaned up typings - actions/animations/transitions only have one parameter, not arbitrary ones. Therefore passing a ( and ) around the params so they are interpreted as a comma-separated command instead of two parameters if user does use:action={1,2} , because it is interpreted as action(node, (1,2)) by the Svelte compiler.
1 parent 37291dc commit 73707aa

File tree

13 files changed

+45
-47
lines changed

13 files changed

+45
-47
lines changed

Diff for: packages/svelte2tsx/src/htmlxtojsx/nodes/action-directive.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@ import MagicString from 'magic-string';
22
import { Node } from 'estree-walker';
33

44
/**
5-
* use:xxx ---> {...__sveltets_ensureAction(__sveltets_mapElementTag('ParentNodeName', xxx))}
5+
* use:xxx={params} ---> {...__sveltets_ensureAction(xxx(__sveltets_mapElementTag('ParentNodeName'),(params)))}
66
*/
77
export function handleActionDirective(
88
htmlx: string,
99
str: MagicString,
1010
attr: Node,
1111
parent: Node
1212
): void {
13-
str.overwrite(
14-
attr.start,
15-
attr.start + 'use:'.length,
16-
`{...__sveltets_ensureAction(__sveltets_mapElementTag('${parent.name}'),`
17-
);
13+
str.overwrite(attr.start, attr.start + 'use:'.length, '{...__sveltets_ensureAction(');
1814

1915
if (!attr.expression) {
20-
str.appendLeft(attr.end, ')}');
16+
str.appendLeft(attr.end, `(__sveltets_mapElementTag('${parent.name}')))}`);
2117
return;
2218
}
2319

24-
str.overwrite(attr.start + `use:${attr.name}`.length, attr.expression.start, ',');
25-
str.appendLeft(attr.expression.end, ')');
20+
str.overwrite(
21+
attr.start + `use:${attr.name}`.length,
22+
attr.expression.start,
23+
`(__sveltets_mapElementTag('${parent.name}'),(`
24+
);
25+
str.appendLeft(attr.expression.end, ')))');
2626
if (htmlx[attr.end - 1] == '"') {
2727
str.remove(attr.end - 1, attr.end);
2828
}

Diff for: packages/svelte2tsx/src/htmlxtojsx/nodes/animation-directive.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import MagicString from 'magic-string';
22
import { Node } from 'estree-walker';
33

44
/**
5-
* animation:xxx(yyy) ---> {...__sveltets_ensureAnimation(xxx, yyy)}
5+
* animation:xxx(yyy) ---> {...__sveltets_ensureAnimation(xxx(__sveltets_ElementNode,__sveltets_AnimationMove,(yyy)))}
66
*/
77
export function handleAnimateDirective(htmlx: string, str: MagicString, attr: Node): void {
88
str.overwrite(
@@ -12,15 +12,15 @@ export function handleAnimateDirective(htmlx: string, str: MagicString, attr: No
1212
);
1313

1414
if (!attr.expression) {
15-
str.appendLeft(attr.end, ', {})}');
15+
str.appendLeft(attr.end, '(__sveltets_ElementNode,__sveltets_AnimationMove))}');
1616
return;
1717
}
1818
str.overwrite(
1919
htmlx.indexOf(':', attr.start) + 1 + `${attr.name}`.length,
2020
attr.expression.start,
21-
', '
21+
'(__sveltets_ElementNode,__sveltets_AnimationMove,('
2222
);
23-
str.appendLeft(attr.expression.end, ')');
23+
str.appendLeft(attr.expression.end, ')))');
2424
if (htmlx[attr.end - 1] == '"') {
2525
str.remove(attr.end - 1, attr.end);
2626
}

Diff for: packages/svelte2tsx/src/htmlxtojsx/nodes/transition-directive.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import MagicString from 'magic-string';
22
import { Node } from 'estree-walker';
33

44
/**
5-
* transition:xxx(yyy) ---> {...__sveltets_ensureTransition(xxx, yyy)}
5+
* transition:xxx(yyy) ---> {...__sveltets_ensureTransition(xxx(__sveltets_ElementNode,(yyy)))}
66
*/
77
export function handleTransitionDirective(htmlx: string, str: MagicString, attr: Node): void {
88
str.overwrite(
@@ -17,16 +17,16 @@ export function handleTransitionDirective(htmlx: string, str: MagicString, attr:
1717
}
1818

1919
if (!attr.expression) {
20-
str.appendLeft(attr.end, ', {})}');
20+
str.appendLeft(attr.end, '(__sveltets_ElementNode))}');
2121
return;
2222
}
2323

2424
str.overwrite(
2525
htmlx.indexOf(':', attr.start) + 1 + `${attr.name}`.length,
2626
attr.expression.start,
27-
', '
27+
'(__sveltets_ElementNode,('
2828
);
29-
str.appendLeft(attr.expression.end, ')');
29+
str.appendLeft(attr.expression.end, ')))');
3030
if (htmlx[attr.end - 1] == '"') {
3131
str.remove(attr.end - 1, attr.end);
3232
}

Diff for: packages/svelte2tsx/svelte-shims.d.ts

+9-11
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ interface Svelte2TsxComponentConstructorParameters<Props extends {}> {
6767
type AConstructorTypeOf<T, U extends any[] = any[]> = new (...args: U) => T;
6868
type SvelteComponentConstructor<T, U extends Svelte2TsxComponentConstructorParameters<any>> = new (options: U) => T;
6969

70-
type SvelteAction<U extends any[], El extends any> = (node: El, ...args:U) => {
71-
update?: (...args:U) => void,
70+
type SvelteActionReturnType = {
71+
update?: (args: any) => void,
7272
destroy?: () => void
7373
} | void
7474

@@ -80,9 +80,9 @@ type SvelteTransitionConfig = {
8080
tick?: (t: number, u: number) => void
8181
}
8282

83-
type SvelteTransition<U extends any[]> = (node: Element, ...args: U) => SvelteTransitionConfig | (() => SvelteTransitionConfig)
83+
type SvelteTransitionReturnType = SvelteTransitionConfig | (() => SvelteTransitionConfig)
8484

85-
type SvelteAnimation<U extends any[]> = (node: Element, move: { from: DOMRect, to: DOMRect }, ...args: U) => {
85+
type SvelteAnimationReturnType = {
8686
delay?: number,
8787
duration?: number,
8888
easing?: (t: number) => number,
@@ -98,14 +98,12 @@ type SvelteStore<T> = { subscribe: (run: (value: T) => any, invalidate?: any) =>
9898

9999

100100
declare var process: NodeJS.Process & { browser: boolean }
101+
declare var __sveltets_ElementNode: Element
102+
declare var __sveltets_AnimationMove: { from: DOMRect, to: DOMRect }
101103

102-
declare function __sveltets_ensureAnimation<U extends any[]>(animation: SvelteAnimation<U>, ...args: U): {};
103-
declare function __sveltets_ensureAction<U extends any[], El extends any>(
104-
el: El,
105-
action: SvelteAction<U, El>,
106-
...args: U
107-
): {};
108-
declare function __sveltets_ensureTransition<U extends any[]>(transition: SvelteTransition<U>, ...args: U): {};
104+
declare function __sveltets_ensureAnimation(animationCall: SvelteAnimationReturnType): {};
105+
declare function __sveltets_ensureAction(actionCall: SvelteActionReturnType): {};
106+
declare function __sveltets_ensureTransition(transitionCall: SvelteTransitionReturnType): {};
109107
declare function __sveltets_ensureFunction(expression: (e: Event & { detail?: any }) => unknown ): {};
110108
declare function __sveltets_ensureType<T>(type: AConstructorTypeOf<T>, el: T): {};
111109
declare function __sveltets_ctorOf<T>(type: T): AConstructorTypeOf<T>;
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<><h1 {...__sveltets_ensureAction(__sveltets_mapElementTag('h1'),blink)}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureAction(blink(__sveltets_mapElementTag('h1')))}>Hello</h1></>
Original file line numberDiff line numberDiff line change
@@ -1,6 +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>
1+
<><svg {...__sveltets_ensureAction(svgAction(__sveltets_mapElementTag('svg')))}></svg>
2+
<div {...__sveltets_ensureAction(divAction(__sveltets_mapElementTag('div')))}>
3+
<input {...__sveltets_ensureAction(action(__sveltets_mapElementTag('input')))} />
4+
<p {...__sveltets_ensureAction(pAction(__sveltets_mapElementTag('p')))}></p>
5+
<unknownTag {...__sveltets_ensureAction(unknownAction(__sveltets_mapElementTag('unknownTag')))}></unknownTag>
66
</div></>
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<><h1 {...__sveltets_ensureAction(__sveltets_mapElementTag('h1'),blink,500,2)}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureAction(blink(__sveltets_mapElementTag('h1'),(500,2)))}>Hello</h1></>
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<><h1 {...__sveltets_ensureAnimation(blink, {})}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureAnimation(blink(__sveltets_ElementNode,__sveltets_AnimationMove))}>Hello</h1></>
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
<><h1 {...__sveltets_ensureAnimation(blink, {y: 50, duration: 500})}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureAnimation(blink(__sveltets_ElementNode,__sveltets_AnimationMove,({y: 50, duration: 500})))}>Hello</h1></>
22

Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<><h1 onclick={()=>console.log("click")}>Hello</h1>
22
<Component />{__sveltets_instanceOf(Component).$on('click', test)}
3-
<img {...__sveltets_ensureAction(__sveltets_mapElementTag('img'),action,thing)} />
4-
<img {...__sveltets_ensureTransition(fade, params)} />
3+
<img {...__sveltets_ensureAction(action(__sveltets_mapElementTag('img'),(thing)))} />
4+
<img {...__sveltets_ensureTransition(fade(__sveltets_ElementNode,(params)))} />
55
<img {...__sveltets_ensureType(Boolean, !!(classthing))} />
6-
<img {...__sveltets_ensureAnimation(thing, params)} />
6+
<img {...__sveltets_ensureAnimation(thing(__sveltets_ElementNode,__sveltets_AnimationMove,(params)))} />
77
<img thing={binding} /></>
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
<><h1 {...__sveltets_ensureTransition(blink, {})}>Hello</h1>
2-
<h1 {...__sveltets_ensureTransition(blink, {})}>Hello</h1>
3-
<h1 {...__sveltets_ensureTransition(blink, {})}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureTransition(blink(__sveltets_ElementNode))}>Hello</h1>
2+
<h1 {...__sveltets_ensureTransition(blink(__sveltets_ElementNode))}>Hello</h1>
3+
<h1 {...__sveltets_ensureTransition(blink(__sveltets_ElementNode))}>Hello</h1></>
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
<><div {...__sveltets_ensureTransition(slide, {})}>
1+
<><div {...__sveltets_ensureTransition(slide(__sveltets_ElementNode))}>
22
{item}
33
</div></>
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
<><h1 {...__sveltets_ensureTransition(blink, {y: 50, duration: 500})}>Hello</h1>
2-
<h1 {...__sveltets_ensureTransition(blink, {y: 50, duration: 500})}>Hello</h1>
3-
<h1 {...__sveltets_ensureTransition(blink, {y: 50, duration: 500})}>Hello</h1></>
1+
<><h1 {...__sveltets_ensureTransition(blink(__sveltets_ElementNode,({y: 50, duration: 500})))}>Hello</h1>
2+
<h1 {...__sveltets_ensureTransition(blink(__sveltets_ElementNode,({y: 50, duration: 500})))}>Hello</h1>
3+
<h1 {...__sveltets_ensureTransition(blink(__sveltets_ElementNode,({y: 50, duration: 500})))}>Hello</h1></>

0 commit comments

Comments
 (0)