wip: allow compatConfig mode to be a function

This commit is contained in:
Evan You 2021-05-06 10:57:34 -04:00
parent 9db3cbbfc1
commit 37ee2959fc
2 changed files with 35 additions and 3 deletions

View File

@ -1,5 +1,6 @@
import { extend, hasOwn, isArray } from '@vue/shared' import { extend, hasOwn, isArray, isFunction } from '@vue/shared'
import { import {
Component,
ComponentInternalInstance, ComponentInternalInstance,
ComponentOptions, ComponentOptions,
formatComponentName, formatComponentName,
@ -505,7 +506,7 @@ export function warnDeprecation(
export type CompatConfig = Partial< export type CompatConfig = Partial<
Record<DeprecationTypes, boolean | 'suppress-warning'> Record<DeprecationTypes, boolean | 'suppress-warning'>
> & { > & {
MODE?: 2 | 3 MODE?: 2 | 3 | ((comp: Component | null) => 2 | 3)
} }
export const globalCompatConfig: CompatConfig = { export const globalCompatConfig: CompatConfig = {
@ -574,8 +575,13 @@ export function isCompatEnabled(
return false return false
} }
const mode = getCompatConfigForKey('MODE', instance) || 2 const rawMode = getCompatConfigForKey('MODE', instance) || 2
const val = getCompatConfigForKey(key, instance) const val = getCompatConfigForKey(key, instance)
const mode = isFunction(rawMode)
? rawMode(instance && instance.type)
: rawMode
if (mode === 2) { if (mode === 2) {
return val !== false return val !== false
} else { } else {

View File

@ -6,6 +6,7 @@ import {
toggleDeprecationWarning toggleDeprecationWarning
} from '../../runtime-core/src/compat/compatConfig' } from '../../runtime-core/src/compat/compatConfig'
import { triggerEvent } from './utils' import { triggerEvent } from './utils'
import { h } from '@vue/runtime-core'
beforeEach(() => { beforeEach(() => {
toggleDeprecationWarning(true) toggleDeprecationWarning(true)
@ -20,6 +21,31 @@ afterEach(() => {
Vue.configureCompat({ MODE: 3 }) Vue.configureCompat({ MODE: 3 })
}) })
test('mode as function', () => {
const Foo = {
name: 'Foo',
render: (h: any) => h('div', 'foo')
}
const Bar = {
name: 'Bar',
data: () => ({ msg: 'bar' }),
render: (ctx: any) => h('div', ctx.msg)
}
toggleDeprecationWarning(false)
Vue.configureCompat({
MODE: comp => (comp && comp.name === 'Bar' ? 3 : 2)
})
const vm = new Vue({
components: { Foo, Bar },
template: `<div><foo/><bar/></div>`
}).$mount()
expect(vm.$el.innerHTML).toBe(`<div>foo</div><div>bar</div>`)
})
test('WATCH_ARRAY', async () => { test('WATCH_ARRAY', async () => {
const spy = jest.fn() const spy = jest.fn()
const vm = new Vue({ const vm = new Vue({