const deprecationData: Record<CompilerDeprecationTypes, DeprecationData> = {
[CompilerDeprecationTypes.IS_ON_ELEMENT]: {
- message: ``,
+ message:
+ `Platform-native elements with "is" prop will no longer be ` +
+ `treated as components in Vue 3 unless the "is" value is explicitly ` +
+ `prefixed with "vue:".`,
link: `https://v3.vuejs.org/guide/migration/custom-elements-interop.html`
},
createRoot,
ConstantTypes
} from './ast'
-import { CompilerCompatOptions } from './compat/compatConfig'
+import {
+ checkCompatEnabled,
+ CompilerCompatOptions,
+ CompilerDeprecationTypes
+} from './compat/compatConfig'
type OptionalOptions =
| 'isNativeTag'
let tagType = ElementTypes.ELEMENT
const options = context.options
if (!context.inVPre && !options.isCustomElement(tag)) {
- const hasVIs = props.some(
- p =>
- p.name === 'is' &&
- // v-is="xxx" (TODO: deprecate)
- (p.type === NodeTypes.DIRECTIVE ||
- // is="vue:xxx"
- (p.value && p.value.content.startsWith('vue:')))
- )
+ const hasVIs = props.some(p => {
+ if (p.name !== 'is') return
+ // v-is="xxx" (TODO: deprecate)
+ if (p.type === NodeTypes.DIRECTIVE) {
+ return true
+ }
+ // is="vue:xxx"
+ if (p.value && p.value.content.startsWith('vue:')) {
+ return true
+ }
+ // in compat mode, any is usage is considered a component
+ if (
+ __COMPAT__ &&
+ checkCompatEnabled(
+ CompilerDeprecationTypes.IS_ON_ELEMENT,
+ context,
+ p.loc
+ )
+ ) {
+ return true
+ }
+ })
if (options.isNativeTag && !hasVIs) {
if (!options.isNativeTag(tag)) tagType = ElementTypes.COMPONENT
} else if (
if (!isExplicitDynamic && isProp.type === NodeTypes.ATTRIBUTE) {
// <button is="vue:xxx">
// if not <component>, only is value that starts with "vue:" will be
- // treated as component by the parse phase and reach here.
- tag = isProp.value!.content.slice(4)
+ // treated as component by the parse phase and reach here, unless it's
+ // compat mode where all is values are considered components
+ tag = __COMPAT__
+ ? isProp.value!.content.replace(/^vue:/, '')
+ : isProp.value!.content.slice(4)
} else {
const exp =
isProp.type === NodeTypes.ATTRIBUTE