From 324a00c85d87f6849800490d9749a7013ba40990 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 30 Apr 2021 17:15:36 -0400 Subject: [PATCH] wip: test for global filter registration --- packages/runtime-core/src/compat/global.ts | 14 +++++++---- packages/vue-compat/__tests__/filters.spec.ts | 24 +++++++++++++++++-- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index dbb52173..4cf57743 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -96,7 +96,7 @@ export type CompatVue = Pick & { /** * @deprecated filters have been removed from Vue 3. */ - filter(name: string, arg: any): null + filter(name: string, arg?: any): null /** * @internal */ @@ -138,7 +138,7 @@ export function createCompatVue( const app = createApp(options) // copy over asset registries and deopt flag - ;['mixins', 'components', 'directives', 'deopt'].forEach(key => { + ;['mixins', 'components', 'directives', 'filters', 'deopt'].forEach(key => { // @ts-ignore app._context[key] = singletonApp._context[key] }) @@ -312,9 +312,13 @@ export function createCompatVue( } }) as any - Vue.filter = ((name: string, filter: any) => { - // TODO deprecation warning - // TODO compiler warning for filters (maybe behavior compat?) + Vue.filter = ((name: string, filter?: any) => { + if (filter) { + singletonApp.filter!(name, filter) + return Vue + } else { + return singletonApp.filter!(name) + } }) as any // internal utils - these are technically internal but some plugins use it. diff --git a/packages/vue-compat/__tests__/filters.spec.ts b/packages/vue-compat/__tests__/filters.spec.ts index 6730db14..350e1aeb 100644 --- a/packages/vue-compat/__tests__/filters.spec.ts +++ b/packages/vue-compat/__tests__/filters.spec.ts @@ -1,10 +1,14 @@ import Vue from '@vue/compat' import { CompilerDeprecationTypes } from '../../compiler-core/src' -import { toggleDeprecationWarning } from '../../runtime-core/src/compat/compatConfig' +import { + deprecationData, + DeprecationTypes, + toggleDeprecationWarning +} from '../../runtime-core/src/compat/compatConfig' beforeEach(() => { toggleDeprecationWarning(false) - Vue.configureCompat({ MODE: 2 }) + Vue.configureCompat({ MODE: 2, GLOBAL_MOUNT: 'suppress-warning' }) }) afterEach(() => { @@ -32,6 +36,22 @@ describe('FILTERS', () => { return v * 2 } + it('global registration', () => { + toggleDeprecationWarning(true) + Vue.filter('globalUpper', upper) + expect(Vue.filter('globalUpper')).toBe(upper) + const vm = new Vue({ + template: '
{{ msg | globalUpper }}
', + data: () => ({ + msg: 'hi' + }) + }).$mount() + expect(vm.$el.textContent).toBe('HI') + expect(deprecationData[DeprecationTypes.FILTERS].message).toHaveBeenWarned() + expect(CompilerDeprecationTypes.COMPILER_FILTERS).toHaveBeenWarned() + Vue.filter('globalUpper', undefined) + }) + it('basic usage', () => { const vm = new Vue({ template: '
{{ msg | upper }}
',