let hasDefineEmitCall = false
let hasDefineExposeCall = false
let hasDefaultExportName = false
+ let hasDefaultExportRender = false
let propsRuntimeDecl: Node | undefined
let propsRuntimeDefaults: ObjectExpression | undefined
let propsDestructureDecl: Node | undefined
// export default
defaultExport = node
- // check if user has manually specified `name` option in export default
- // if yes, skip infer later
+ // check if user has manually specified `name` or 'render` option in
+ // export default
+ // if has name, skip name inference
+ // if has render and no template, generate return object instead of
+ // empty render function (#4980)
let optionProperties
if (defaultExport.declaration.type === 'ObjectExpression') {
optionProperties = defaultExport.declaration.properties
) {
optionProperties = defaultExport.declaration.arguments[0].properties
}
- hasDefaultExportName = !!optionProperties?.some(
- s =>
- s.type === 'ObjectProperty' &&
- s.key.type === 'Identifier' &&
- s.key.name === 'name'
- )
+ if (optionProperties) {
+ for (const s of optionProperties) {
+ if (
+ s.type === 'ObjectProperty' &&
+ s.key.type === 'Identifier' &&
+ s.key.name === 'name'
+ ) {
+ hasDefaultExportName = true
+ }
+ if (
+ (s.type === 'ObjectMethod' || s.type === 'ObjectProperty') &&
+ s.key.type === 'Identifier' &&
+ s.key.name === 'render'
+ ) {
+ // TODO warn when we provide a better way to do it?
+ hasDefaultExportRender = true
+ }
+ }
+ }
// export default { ... } --> const __default__ = { ... }
const start = node.start! + scriptStartOffset!
// 10. generate return statement
let returned
- if (options.inlineTemplate) {
+ if (!options.inlineTemplate || (!sfc.template && hasDefaultExportRender)) {
+ // non-inline mode, or has manual render in normal <script>
+ // return bindings from script and script setup
+ const allBindings: Record<string, any> = {
+ ...scriptBindings,
+ ...setupBindings
+ }
+ for (const key in userImports) {
+ if (!userImports[key].isType && userImports[key].isUsedInTemplate) {
+ allBindings[key] = true
+ }
+ }
+ returned = `{ ${Object.keys(allBindings).join(', ')} }`
+ } else {
+ // inline mode
if (sfc.template && !sfc.template.src) {
if (options.templateOptions && options.templateOptions.ssr) {
hasInlinedSsrRenderFn = true
} else {
returned = `() => {}`
}
- } else {
- // return bindings from script and script setup
- const allBindings: Record<string, any> = {
- ...scriptBindings,
- ...setupBindings
- }
- for (const key in userImports) {
- if (!userImports[key].isType && userImports[key].isUsedInTemplate) {
- allBindings[key] = true
- }
- }
- returned = `{ ${Object.keys(allBindings).join(', ')} }`
}
if (!options.inlineTemplate && !__TEST__) {