) => void
export interface BindingMetadata {
- [key: string]: 'data' | 'props' | 'setup' | 'options'
+ [key: string]: 'data' | 'props' | 'setup' | 'options' | 'component-import'
}
interface SharedTransformCodegenOptions {
TO_HANDLERS,
TELEPORT,
KEEP_ALIVE,
- SUSPENSE
+ SUSPENSE,
+ UNREF
} from '../runtimeHelpers'
import {
getInnerRange,
} from '../utils'
import { buildSlots } from './vSlot'
import { getStaticType } from './hoistStatic'
+import { BindingMetadata } from '../options'
// some directive transforms (e.g. v-model) may return a symbol for runtime
// import, which should be used instead of a resolveDirective call.
}
// 3. user component (from setup bindings)
- let tagFromSetup = tag
const bindings = context.bindingMetadata
- if (
- bindings !== EMPTY_OBJ &&
- (bindings[tagFromSetup] === 'setup' ||
- bindings[(tagFromSetup = camelize(tag))] === 'setup' ||
- bindings[(tagFromSetup = capitalize(camelize(tag)))] === 'setup')
- ) {
- return context.inline
- ? tagFromSetup
- : `$setup[${JSON.stringify(tagFromSetup)}]`
+ if (bindings !== EMPTY_OBJ) {
+ const checkType = (type: BindingMetadata[string]) => {
+ let resolvedTag = tag
+ if (
+ bindings[resolvedTag] === type ||
+ bindings[(resolvedTag = camelize(tag))] === type ||
+ bindings[(resolvedTag = capitalize(camelize(tag)))] === type
+ ) {
+ return resolvedTag
+ }
+ }
+ const tagFromSetup = checkType('setup')
+ if (tagFromSetup) {
+ return context.inline
+ ? // setup scope bindings may be refs so they need to be unrefed
+ `${context.helperString(UNREF)}(${tagFromSetup})`
+ : `$setup[${JSON.stringify(tagFromSetup)}]`
+ }
+ const tagFromImport = checkType('component-import')
+ if (tagFromImport) {
+ // imports can be used as-is
+ return tagFromImport
+ }
}
- // 5. user component (resolve)
+ // 4. user component (resolve)
context.helper(RESOLVE_COMPONENT)
context.components.add(tag)
return toValidAssetId(tag, `component`)
return `${inlinePropsIdentifier}.${raw}`
} else if (type === 'setup') {
return `${context.helperString(UNREF)}(${raw})`
+ } else if (type === 'component-import') {
+ return raw
}
}
// fallback to normal
`\nexport ${hasAwait ? `async ` : ``}function setup(${args}) {\n`
)
- const exposedBindings = { ...userImports, ...setupBindings }
+ const allBindings = { ...userImports, ...setupBindings }
// 9. inject `useCssVars` calls
if (hasCssVars) {
if (typeof vars === 'string') {
s.prependRight(
endOffset,
- `\n${genCssVarsCode(vars, !!style.scoped, exposedBindings)}`
+ `\n${genCssVarsCode(vars, !!style.scoped, allBindings)}`
)
}
}
if (scriptAst) {
Object.assign(bindingMetadata, analyzeScriptBindings(scriptAst))
}
- Object.keys(exposedBindings).forEach(key => {
- bindingMetadata[key] = 'setup'
- })
- Object.keys(typeDeclaredProps).forEach(key => {
+ if (options.inlineTemplate) {
+ for (const [key, value] of Object.entries(userImports)) {
+ bindingMetadata[key] = value.endsWith('.vue')
+ ? 'component-import'
+ : 'setup'
+ }
+ for (const key in setupBindings) {
+ bindingMetadata[key] = 'setup'
+ }
+ } else {
+ for (const key in allBindings) {
+ bindingMetadata[key] = 'setup'
+ }
+ }
+ for (const key in typeDeclaredProps) {
bindingMetadata[key] = 'props'
- })
+ }
Object.assign(bindingMetadata, analyzeScriptBindings(scriptSetupAst))
// 11. generate return statement
}
} else {
// return bindings from setup
- returned = `{ ${Object.keys(exposedBindings).join(', ')} }`
+ returned = `{ ${Object.keys(allBindings).join(', ')} }`
}
s.appendRight(endOffset, `\nreturn ${returned}\n}\n\n`)