Przeglądaj źródła

wip: test for global filter registration

Evan You 5 lat temu
rodzic
commit
324a00c85d

+ 9 - 5
packages/runtime-core/src/compat/global.ts

@@ -96,7 +96,7 @@ export type CompatVue = Pick<App, 'version' | 'component' | 'directive'> & {
   /**
    * @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.

+ 22 - 2
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: '<div>{{ msg | globalUpper }}</div>',
+      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: '<div>{{ msg | upper }}</div>',