From: Evan You Date: Thu, 6 May 2021 14:57:34 +0000 (-0400) Subject: wip: allow compatConfig mode to be a function X-Git-Tag: v3.1.0-beta.1~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=37ee2959fcf7e761e9e0c417cd0eff1002c5272f;p=thirdparty%2Fvuejs%2Fcore.git wip: allow compatConfig mode to be a function --- diff --git a/packages/runtime-core/src/compat/compatConfig.ts b/packages/runtime-core/src/compat/compatConfig.ts index cbff8c7856..e786cf0981 100644 --- a/packages/runtime-core/src/compat/compatConfig.ts +++ b/packages/runtime-core/src/compat/compatConfig.ts @@ -1,5 +1,6 @@ -import { extend, hasOwn, isArray } from '@vue/shared' +import { extend, hasOwn, isArray, isFunction } from '@vue/shared' import { + Component, ComponentInternalInstance, ComponentOptions, formatComponentName, @@ -505,7 +506,7 @@ export function warnDeprecation( export type CompatConfig = Partial< Record > & { - MODE?: 2 | 3 + MODE?: 2 | 3 | ((comp: Component | null) => 2 | 3) } export const globalCompatConfig: CompatConfig = { @@ -574,8 +575,13 @@ export function isCompatEnabled( return false } - const mode = getCompatConfigForKey('MODE', instance) || 2 + const rawMode = getCompatConfigForKey('MODE', instance) || 2 const val = getCompatConfigForKey(key, instance) + + const mode = isFunction(rawMode) + ? rawMode(instance && instance.type) + : rawMode + if (mode === 2) { return val !== false } else { diff --git a/packages/vue-compat/__tests__/misc.spec.ts b/packages/vue-compat/__tests__/misc.spec.ts index eba512d088..1986ae77db 100644 --- a/packages/vue-compat/__tests__/misc.spec.ts +++ b/packages/vue-compat/__tests__/misc.spec.ts @@ -6,6 +6,7 @@ import { toggleDeprecationWarning } from '../../runtime-core/src/compat/compatConfig' import { triggerEvent } from './utils' +import { h } from '@vue/runtime-core' beforeEach(() => { toggleDeprecationWarning(true) @@ -20,6 +21,31 @@ afterEach(() => { 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: `
` + }).$mount() + + expect(vm.$el.innerHTML).toBe(`
foo
bar
`) +}) + test('WATCH_ARRAY', async () => { const spy = jest.fn() const vm = new Vue({