@@ -25,6 +25,7 @@ export interface AddComponentExportPara {
25
25
generics : Generics ;
26
26
usesSlots : boolean ;
27
27
isSvelte5 : boolean ;
28
+ hasTopLevelAwait : boolean ;
28
29
noSvelteComponentTyped ?: boolean ;
29
30
}
30
31
@@ -50,12 +51,12 @@ function addGenericsComponentExport({
50
51
fileName,
51
52
mode,
52
53
usesAccessors,
53
- isTsFile,
54
54
str,
55
55
generics,
56
56
usesSlots,
57
57
isSvelte5,
58
- noSvelteComponentTyped
58
+ noSvelteComponentTyped,
59
+ hasTopLevelAwait
59
60
} : AddComponentExportPara ) {
60
61
const genericsDef = generics . toDefinitionString ( ) ;
61
62
const genericsRef = generics . toReferencesString ( ) ;
@@ -67,34 +68,41 @@ function addGenericsComponentExport({
67
68
return `ReturnType<__sveltets_Render${ genericsRef } ['${ forPart } ']>` ;
68
69
}
69
70
71
+ const renderCall = hasTopLevelAwait
72
+ ? `(await ${ internalHelpers . renderName } ${ genericsRef } ())`
73
+ : `${ internalHelpers . renderName } ${ genericsRef } ()` ;
74
+
70
75
// TODO once Svelte 4 compatibility is dropped, we can simplify this, because since TS 4.7 it is possible to use generics
71
76
// like this: `typeof render<T>` - which wasn't possibly before, hence the class + methods workaround.
72
77
let statement = `
73
78
class __sveltets_Render${ genericsDef } {
74
79
props() {
75
- return ${ props ( true , canHaveAnyProp , exportedNames , ` ${ internalHelpers . renderName } ${ genericsRef } ()` ) } .props;
80
+ return ${ props ( true , canHaveAnyProp , exportedNames , renderCall ) } .props;
76
81
}
77
82
events() {
78
- return ${ _events ( events . hasStrictEvents ( ) || exportedNames . usesRunes ( ) , ` ${ internalHelpers . renderName } ${ genericsRef } ()` ) } .events;
83
+ return ${ _events ( events . hasStrictEvents ( ) || exportedNames . isRunesMode ( ) , renderCall ) } .events;
79
84
}
80
85
slots() {
81
- return ${ internalHelpers . renderName } ${ genericsRef } () .slots;
86
+ return ${ renderCall } .slots;
82
87
}
83
88
` ;
84
89
85
90
// For Svelte 5+ we assume TS > 4.7
86
- if ( isSvelte5 && ! isTsFile && exportedNames . usesRunes ( ) ) {
91
+ if ( isSvelte5 && exportedNames . isRunesMode ( ) ) {
92
+ const renderType = hasTopLevelAwait
93
+ ? `Awaited<ReturnType<typeof ${ internalHelpers . renderName } ${ genericsRef } >>`
94
+ : `ReturnType<typeof ${ internalHelpers . renderName } ${ genericsRef } >` ;
87
95
statement = `
88
96
class __sveltets_Render${ genericsDef } {
89
- props(): ReturnType<typeof ${ internalHelpers . renderName } ${ genericsRef } > ['props'] { return null as any; }
90
- events(): ReturnType<typeof ${ internalHelpers . renderName } ${ genericsRef } > ['events'] { return null as any; }
91
- slots(): ReturnType<typeof ${ internalHelpers . renderName } ${ genericsRef } > ['slots'] { return null as any; }
97
+ props(): ${ renderType } ['props'] { return null as any; }
98
+ events(): ${ renderType } ['events'] { return null as any; }
99
+ slots(): ${ renderType } ['slots'] { return null as any; }
92
100
` ;
93
101
}
94
102
95
103
statement += isSvelte5
96
104
? ` bindings() { return ${ exportedNames . createBindingsStr ( ) } ; }
97
- exports() { return ${ exportedNames . hasExports ( ) ? `${ internalHelpers . renderName } ${ genericsRef } () .exports` : '{}' } ; }
105
+ ${ hasTopLevelAwait ? 'async ' : '' } exports() { return ${ exportedNames . hasExports ( ) ? `${ renderCall } .exports` : '{}' } ; }
98
106
}\n`
99
107
: '}\n' ;
100
108
@@ -109,7 +117,7 @@ class __sveltets_Render${genericsDef} {
109
117
// Don't add props/events/slots type exports in dts mode for now, maybe someone asks for it to be back,
110
118
// but it's safer to not do it for now to have more flexibility in the future.
111
119
let eventsSlotsType = [ ] ;
112
- if ( events . hasEvents ( ) || ! exportedNames . usesRunes ( ) ) {
120
+ if ( events . hasEvents ( ) || ! exportedNames . isRunesMode ( ) ) {
113
121
eventsSlotsType . push ( `$$events?: ${ returnType ( 'events' ) } ` ) ;
114
122
}
115
123
if ( usesSlots ) {
@@ -176,13 +184,24 @@ function addSimpleComponentExport({
176
184
str,
177
185
usesSlots,
178
186
noSvelteComponentTyped,
179
- isSvelte5
187
+ isSvelte5,
188
+ hasTopLevelAwait
180
189
} : AddComponentExportPara ) {
190
+ const renderCall = hasTopLevelAwait
191
+ ? `$${ internalHelpers . renderName } `
192
+ : `${ internalHelpers . renderName } ()` ;
193
+ const awaitDeclaration = hasTopLevelAwait
194
+ ? // tsconfig could disallow top-level await, so we need to wrap it in ignore
195
+ surroundWithIgnoreComments (
196
+ `const $${ internalHelpers . renderName } = await ${ internalHelpers . renderName } ();`
197
+ ) + '\n'
198
+ : '' ;
199
+
181
200
const propDef = props (
182
201
isTsFile ,
183
202
canHaveAnyProp ,
184
203
exportedNames ,
185
- _events ( events . hasStrictEvents ( ) , ` ${ internalHelpers . renderName } ()` )
204
+ _events ( events . hasStrictEvents ( ) , renderCall )
186
205
) ;
187
206
188
207
const doc = componentDocumentation . getFormatted ( ) ;
@@ -191,9 +210,9 @@ function addSimpleComponentExport({
191
210
192
211
let statement : string ;
193
212
if ( mode === 'dts' ) {
194
- if ( isSvelte5 && exportedNames . usesRunes ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
213
+ if ( isSvelte5 && exportedNames . isRunesMode ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
195
214
statement =
196
- `\n${ doc } const ${ componentName } = __sveltets_2_fn_component(${ internalHelpers . renderName } () );\n` +
215
+ `\n${ awaitDeclaration } ${ doc } const ${ componentName } = __sveltets_2_fn_component(${ renderCall } );\n` +
197
216
`type ${ componentName } = ReturnType<typeof ${ componentName } >;\n` +
198
217
`export default ${ componentName } ;` ;
199
218
} else if ( isSvelte5 ) {
@@ -218,7 +237,7 @@ function addSimpleComponentExport({
218
237
declare function $$__sveltets_2_isomorphic_component<
219
238
Props extends Record<string, any>, Events extends Record<string, any>, Slots extends Record<string, any>, Exports extends Record<string, any>, Bindings extends string
220
239
>(klass: {props: Props, events: Events, slots: Slots, exports?: Exports, bindings?: Bindings }): $$__sveltets_2_IsomorphicComponent<Props, Events, Slots, Exports, Bindings>;\n` ) +
221
- `${ doc } const ${ componentName } = $$__sveltets_2_isomorphic_component${ usesSlots ? '_slots' : '' } (${ propDef } );\n` +
240
+ `${ awaitDeclaration } ${ doc } const ${ componentName } = $$__sveltets_2_isomorphic_component${ usesSlots ? '_slots' : '' } (${ propDef } );\n` +
222
241
surroundWithIgnoreComments (
223
242
`type ${ componentName } = InstanceType<typeof ${ componentName } >;\n`
224
243
) +
@@ -257,9 +276,9 @@ declare function $$__sveltets_2_isomorphic_component<
257
276
}
258
277
} else {
259
278
if ( isSvelte5 ) {
260
- if ( exportedNames . usesRunes ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
279
+ if ( exportedNames . isRunesMode ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
261
280
statement =
262
- `\n${ doc } const ${ componentName } = __sveltets_2_fn_component(${ internalHelpers . renderName } () );\n` +
281
+ `\n${ awaitDeclaration } ${ doc } const ${ componentName } = __sveltets_2_fn_component(${ renderCall } );\n` +
263
282
// Surround the type with ignore comments so it is filtered out from go-to-definition etc,
264
283
// which for some editors can cause duplicates
265
284
surroundWithIgnoreComments (
@@ -268,7 +287,7 @@ declare function $$__sveltets_2_isomorphic_component<
268
287
`export default ${ componentName } ;` ;
269
288
} else {
270
289
statement =
271
- `\n${ doc } const ${ componentName } = __sveltets_2_isomorphic_component${ usesSlots ? '_slots' : '' } (${ propDef } );\n` +
290
+ `\n${ awaitDeclaration } ${ doc } const ${ componentName } = __sveltets_2_isomorphic_component${ usesSlots ? '_slots' : '' } (${ propDef } );\n` +
272
291
surroundWithIgnoreComments (
273
292
`type ${ componentName } = InstanceType<typeof ${ componentName } >;\n`
274
293
) +
@@ -336,7 +355,7 @@ function props(
336
355
exportedNames : ExportedNames ,
337
356
renderStr : string
338
357
) {
339
- if ( exportedNames . usesRunes ( ) ) {
358
+ if ( exportedNames . isRunesMode ( ) ) {
340
359
return renderStr ;
341
360
} else if ( isTsFile ) {
342
361
return canHaveAnyProp ? `__sveltets_2_with_any(${ renderStr } )` : renderStr ;
0 commit comments