Skip to content

Commit 25a531f

Browse files
authored
fix: deduplicate exports (#2083)
#2072
1 parent d213200 commit 25a531f

File tree

6 files changed

+79
-3
lines changed

6 files changed

+79
-3
lines changed

packages/svelte2tsx/src/svelte2tsx/addComponentExport.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,25 @@ function addSimpleComponentExport({
121121

122122
let statement: string;
123123
if (mode === 'dts' && isTsFile) {
124+
const addTypeExport = (type: string) => {
125+
const exportName = className + type;
126+
127+
if (!str.original.includes(exportName)) {
128+
return `export type ${exportName} = typeof __propDef.${type.toLowerCase()};\n`;
129+
}
130+
131+
let replacement = exportName + '_';
132+
while (str.original.includes(replacement)) {
133+
replacement += '_';
134+
}
135+
return `type ${replacement} = typeof __propDef.${type.toLowerCase()};\nexport { ${replacement} as ${exportName} };\n`;
136+
};
137+
124138
statement =
125139
`\nconst __propDef = ${propDef};\n` +
126-
`export type ${className}Props = typeof __propDef.props;\n` +
127-
`export type ${className}Events = typeof __propDef.events;\n` +
128-
`export type ${className}Slots = typeof __propDef.slots;\n` +
140+
addTypeExport('Props') +
141+
addTypeExport('Events') +
142+
addTypeExport('Slots') +
129143
`\n${doc}export default class${
130144
className ? ` ${className}` : ''
131145
} extends SvelteComponentTyped<${className}Props, ${className}Events, ${className}Slots> {` +
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { SvelteComponentTyped } from "svelte";
2+
import { type TestProps } from './foo';
3+
declare const __propDef: {
4+
props: {
5+
p: TestProps;
6+
x?: {
7+
x: {
8+
b: string;
9+
};
10+
};
11+
};
12+
events: {
13+
[evt: string]: CustomEvent<any>;
14+
};
15+
slots: {};
16+
};
17+
type TestProps_ = typeof __propDef.props;
18+
export { TestProps_ as TestProps };
19+
export type TestEvents = typeof __propDef.events;
20+
export type TestSlots = typeof __propDef.slots;
21+
export default class Test extends SvelteComponentTyped<TestProps, TestEvents, TestSlots> {
22+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export type TestProps = {
2+
a: true;
3+
};
4+
type EventProps = {
5+
b: string;
6+
};
7+
export declare function eventProps(): {
8+
x: EventProps;
9+
};
10+
export {};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script lang="ts">
2+
import { eventProps, type TestProps } from './foo';
3+
4+
export let p: TestProps;
5+
export let x = eventProps();
6+
</script>
7+
8+
{p}
9+
{x}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export type TestProps = { a: true };
2+
3+
type EventProps = { b: string };
4+
5+
export function eventProps(): { x: EventProps } {
6+
return { x: { b: 'b' } };
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"compilerOptions": {
3+
"moduleResolution": "node",
4+
"module": "es2020",
5+
"lib": ["es2020", "DOM"],
6+
"target": "es2019",
7+
"isolatedModules": true,
8+
"resolveJsonModule": true,
9+
"esModuleInterop": true,
10+
"allowJs": true,
11+
"checkJs": true
12+
},
13+
"include": ["./src/**/*.d.ts", "./src/**/*.js", "./src/**/*.ts", "./src/**/*.svelte"]
14+
}

0 commit comments

Comments
 (0)