@@ -25,6 +25,7 @@ export interface AddComponentExportPara {
2525 generics : Generics ;
2626 usesSlots : boolean ;
2727 isSvelte5 : boolean ;
28+ hasTopLevelAwait : boolean ;
2829 noSvelteComponentTyped ?: boolean ;
2930}
3031
@@ -50,12 +51,12 @@ function addGenericsComponentExport({
5051 fileName,
5152 mode,
5253 usesAccessors,
53- isTsFile,
5454 str,
5555 generics,
5656 usesSlots,
5757 isSvelte5,
58- noSvelteComponentTyped
58+ noSvelteComponentTyped,
59+ hasTopLevelAwait
5960} : AddComponentExportPara ) {
6061 const genericsDef = generics . toDefinitionString ( ) ;
6162 const genericsRef = generics . toReferencesString ( ) ;
@@ -67,34 +68,41 @@ function addGenericsComponentExport({
6768 return `ReturnType<__sveltets_Render${ genericsRef } ['${ forPart } ']>` ;
6869 }
6970
71+ const renderCall = hasTopLevelAwait
72+ ? `(await ${ internalHelpers . renderName } ${ genericsRef } ())`
73+ : `${ internalHelpers . renderName } ${ genericsRef } ()` ;
74+
7075 // TODO once Svelte 4 compatibility is dropped, we can simplify this, because since TS 4.7 it is possible to use generics
7176 // like this: `typeof render<T>` - which wasn't possibly before, hence the class + methods workaround.
7277 let statement = `
7378class __sveltets_Render${ genericsDef } {
7479 props() {
75- return ${ props ( true , canHaveAnyProp , exportedNames , ` ${ internalHelpers . renderName } ${ genericsRef } ()` ) } .props;
80+ return ${ props ( true , canHaveAnyProp , exportedNames , renderCall ) } .props;
7681 }
7782 events() {
78- return ${ _events ( events . hasStrictEvents ( ) || exportedNames . usesRunes ( ) , ` ${ internalHelpers . renderName } ${ genericsRef } ()` ) } .events;
83+ return ${ _events ( events . hasStrictEvents ( ) || exportedNames . isRunesMode ( ) , renderCall ) } .events;
7984 }
8085 slots() {
81- return ${ internalHelpers . renderName } ${ genericsRef } () .slots;
86+ return ${ renderCall } .slots;
8287 }
8388` ;
8489
8590 // 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 } >` ;
8795 statement = `
8896class __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; }
92100` ;
93101 }
94102
95103 statement += isSvelte5
96104 ? ` bindings() { return ${ exportedNames . createBindingsStr ( ) } ; }
97- exports() { return ${ exportedNames . hasExports ( ) ? `${ internalHelpers . renderName } ${ genericsRef } () .exports` : '{}' } ; }
105+ ${ hasTopLevelAwait ? 'async ' : '' } exports() { return ${ exportedNames . hasExports ( ) ? `${ renderCall } .exports` : '{}' } ; }
98106}\n`
99107 : '}\n' ;
100108
@@ -109,7 +117,7 @@ class __sveltets_Render${genericsDef} {
109117 // Don't add props/events/slots type exports in dts mode for now, maybe someone asks for it to be back,
110118 // but it's safer to not do it for now to have more flexibility in the future.
111119 let eventsSlotsType = [ ] ;
112- if ( events . hasEvents ( ) || ! exportedNames . usesRunes ( ) ) {
120+ if ( events . hasEvents ( ) || ! exportedNames . isRunesMode ( ) ) {
113121 eventsSlotsType . push ( `$$events?: ${ returnType ( 'events' ) } ` ) ;
114122 }
115123 if ( usesSlots ) {
@@ -176,13 +184,24 @@ function addSimpleComponentExport({
176184 str,
177185 usesSlots,
178186 noSvelteComponentTyped,
179- isSvelte5
187+ isSvelte5,
188+ hasTopLevelAwait
180189} : 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+
181200 const propDef = props (
182201 isTsFile ,
183202 canHaveAnyProp ,
184203 exportedNames ,
185- _events ( events . hasStrictEvents ( ) , ` ${ internalHelpers . renderName } ()` )
204+ _events ( events . hasStrictEvents ( ) , renderCall )
186205 ) ;
187206
188207 const doc = componentDocumentation . getFormatted ( ) ;
@@ -191,9 +210,9 @@ function addSimpleComponentExport({
191210
192211 let statement : string ;
193212 if ( mode === 'dts' ) {
194- if ( isSvelte5 && exportedNames . usesRunes ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
213+ if ( isSvelte5 && exportedNames . isRunesMode ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
195214 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` +
197216 `type ${ componentName } = ReturnType<typeof ${ componentName } >;\n` +
198217 `export default ${ componentName } ;` ;
199218 } else if ( isSvelte5 ) {
@@ -218,7 +237,7 @@ function addSimpleComponentExport({
218237declare function $$__sveltets_2_isomorphic_component<
219238 Props extends Record<string, any>, Events extends Record<string, any>, Slots extends Record<string, any>, Exports extends Record<string, any>, Bindings extends string
220239>(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` +
222241 surroundWithIgnoreComments (
223242 `type ${ componentName } = InstanceType<typeof ${ componentName } >;\n`
224243 ) +
@@ -257,9 +276,9 @@ declare function $$__sveltets_2_isomorphic_component<
257276 }
258277 } else {
259278 if ( isSvelte5 ) {
260- if ( exportedNames . usesRunes ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
279+ if ( exportedNames . isRunesMode ( ) && ! usesSlots && ! events . hasEvents ( ) ) {
261280 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` +
263282 // Surround the type with ignore comments so it is filtered out from go-to-definition etc,
264283 // which for some editors can cause duplicates
265284 surroundWithIgnoreComments (
@@ -268,7 +287,7 @@ declare function $$__sveltets_2_isomorphic_component<
268287 `export default ${ componentName } ;` ;
269288 } else {
270289 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` +
272291 surroundWithIgnoreComments (
273292 `type ${ componentName } = InstanceType<typeof ${ componentName } >;\n`
274293 ) +
@@ -336,7 +355,7 @@ function props(
336355 exportedNames : ExportedNames ,
337356 renderStr : string
338357) {
339- if ( exportedNames . usesRunes ( ) ) {
358+ if ( exportedNames . isRunesMode ( ) ) {
340359 return renderStr ;
341360 } else if ( isTsFile ) {
342361 return canHaveAnyProp ? `__sveltets_2_with_any(${ renderStr } )` : renderStr ;
0 commit comments