]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
dx(runtime-core): warn when expose() is misused (#7221) 7491/head
authorskirtle <65301168+skirtles-code@users.noreply.github.com>
Mon, 9 Jan 2023 14:23:10 +0000 (14:23 +0000)
committerGitHub <noreply@github.com>
Mon, 9 Jan 2023 14:23:10 +0000 (15:23 +0100)
packages/runtime-core/__tests__/apiExpose.spec.ts
packages/runtime-core/src/component.ts

index 1bfd513943bb9955aa63ceae6e5cbe0b1e9c694c..b912db00521d9e48650ae582cd5eb463fb3a12b8 100644 (file)
@@ -225,4 +225,43 @@ describe('api: expose', () => {
     expect(grandChildRef.value.$parent).toBe(childRef.value)
     expect(grandChildRef.value.$parent.$parent).toBe(grandChildRef.value.$root)
   })
+
+  test('warning for ref', () => {
+    const Comp = defineComponent({
+      setup(_, { expose }) {
+        expose(ref(1))
+        return () => null
+      }
+    })
+    render(h(Comp), nodeOps.createElement('div'))
+    expect(
+      'expose() should be passed a plain object, received ref'
+    ).toHaveBeenWarned()
+  })
+
+  test('warning for array', () => {
+    const Comp = defineComponent({
+      setup(_, { expose }) {
+        expose(['focus'])
+        return () => null
+      }
+    })
+    render(h(Comp), nodeOps.createElement('div'))
+    expect(
+      'expose() should be passed a plain object, received array'
+    ).toHaveBeenWarned()
+  })
+
+  test('warning for function', () => {
+    const Comp = defineComponent({
+      setup(_, { expose }) {
+        expose(() => null)
+        return () => null
+      }
+    })
+    render(h(Comp), nodeOps.createElement('div'))
+    expect(
+      'expose() should be passed a plain object, received function'
+    ).toHaveBeenWarned()
+  })
 })
index 786e3f3a0302bac719e19d3078b7fa08b55161ac..0bc718f1b50521740270afe784271bb3790d2206 100644 (file)
@@ -1,5 +1,6 @@
 import { VNode, VNodeChild, isVNode } from './vnode'
 import {
+  isRef,
   pauseTracking,
   resetTracking,
   shallowReadonly,
@@ -47,6 +48,7 @@ import {
 } from './componentEmits'
 import {
   EMPTY_OBJ,
+  isArray,
   isFunction,
   NOOP,
   isObject,
@@ -913,8 +915,25 @@ export function createSetupContext(
   instance: ComponentInternalInstance
 ): SetupContext {
   const expose: SetupContext['expose'] = exposed => {
-    if (__DEV__ && instance.exposed) {
-      warn(`expose() should be called only once per setup().`)
+    if (__DEV__) {
+      if (instance.exposed) {
+        warn(`expose() should be called only once per setup().`)
+      }
+      if (exposed != null) {
+        let exposedType: string = typeof exposed
+        if (exposedType === 'object') {
+          if (isArray(exposed)) {
+            exposedType = 'array'
+          } else if (isRef(exposed)) {
+            exposedType = 'ref'
+          }
+        }
+        if (exposedType !== 'object') {
+          warn(
+            `expose() should be passed a plain object, received ${exposedType}.`
+          )
+        }
+      }
     }
     instance.exposed = exposed || {}
   }