@@ -67,6 +67,7 @@ const DEFINE_EMITS = 'defineEmits'
6767const DEFINE_EXPOSE = 'defineExpose'
6868const WITH_DEFAULTS = 'withDefaults'
6969const DEFINE_OPTIONS = 'defineOptions'
70+ const DEFINE_SLOTS = 'defineSlots'
7071
7172const isBuiltInDir = makeMap (
7273 `once,memo,if,for,else,else-if,slot,text,html,on,bind,model,show,cloak,is`
@@ -312,6 +313,7 @@ export function compileScript(
312313 let hasDefaultExportName = false
313314 let hasDefaultExportRender = false
314315 let hasDefineOptionsCall = false
316+ let hasDefineSlotsCall = false
315317 let propsRuntimeDecl : Node | undefined
316318 let propsRuntimeDefaults : Node | undefined
317319 let propsDestructureDecl : Node | undefined
@@ -590,6 +592,30 @@ export function compileScript(
590592 return true
591593 }
592594
595+ function processDefineSlots ( node : Node , declId ?: LVal ) : boolean {
596+ if ( ! isCallOf ( node , DEFINE_SLOTS ) ) {
597+ return false
598+ }
599+ if ( hasDefineSlotsCall ) {
600+ error ( `duplicate ${ DEFINE_SLOTS } () call` , node )
601+ }
602+ hasDefineSlotsCall = true
603+
604+ if ( node . arguments . length > 0 ) {
605+ error ( `${ DEFINE_SLOTS } () cannot accept arguments` , node )
606+ }
607+
608+ if ( declId ) {
609+ s . overwrite (
610+ startOffset + node . start ! ,
611+ startOffset + node . end ! ,
612+ `${ helper ( 'useSlots' ) } ()`
613+ )
614+ }
615+
616+ return true
617+ }
618+
593619 function getAstBody ( ) : Statement [ ] {
594620 return scriptAst
595621 ? [ ...scriptSetupAst . body , ...scriptAst . body ]
@@ -683,6 +709,7 @@ export function compileScript(
683709 let propsOption = undefined
684710 let emitsOption = undefined
685711 let exposeOption = undefined
712+ let slotsOption = undefined
686713 if ( optionsRuntimeDecl . type === 'ObjectExpression' ) {
687714 for ( const prop of optionsRuntimeDecl . properties ) {
688715 if (
@@ -692,6 +719,7 @@ export function compileScript(
692719 if ( prop . key . name === 'props' ) propsOption = prop
693720 if ( prop . key . name === 'emits' ) emitsOption = prop
694721 if ( prop . key . name === 'expose' ) exposeOption = prop
722+ if ( prop . key . name === 'slots' ) slotsOption = prop
695723 }
696724 }
697725 }
@@ -714,6 +742,12 @@ export function compileScript(
714742 exposeOption
715743 )
716744 }
745+ if ( slotsOption ) {
746+ error (
747+ `${ DEFINE_OPTIONS } () cannot be used to declare slots. Use ${ DEFINE_SLOTS } () instead.` ,
748+ slotsOption
749+ )
750+ }
717751
718752 return true
719753 }
@@ -1286,7 +1320,8 @@ export function compileScript(
12861320 processDefineProps ( expr ) ||
12871321 processDefineEmits ( expr ) ||
12881322 processDefineOptions ( expr ) ||
1289- processWithDefaults ( expr )
1323+ processWithDefaults ( expr ) ||
1324+ processDefineSlots ( expr )
12901325 ) {
12911326 s . remove ( node . start ! + startOffset , node . end ! + startOffset )
12921327 } else if ( processDefineExpose ( expr ) ) {
@@ -1320,7 +1355,10 @@ export function compileScript(
13201355 const isDefineProps =
13211356 processDefineProps ( init , decl . id ) ||
13221357 processWithDefaults ( init , decl . id )
1323- const isDefineEmits = processDefineEmits ( init , decl . id )
1358+ const isDefineEmits =
1359+ ! isDefineProps && processDefineEmits ( init , decl . id )
1360+ ! isDefineEmits && processDefineSlots ( init , decl . id )
1361+
13241362 if ( isDefineProps || isDefineEmits ) {
13251363 if ( left === 1 ) {
13261364 s . remove ( node . start ! + startOffset , node . end ! + startOffset )
0 commit comments