]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: tweak warning dedupe logic
authorEvan You <yyx990803@gmail.com>
Thu, 8 Apr 2021 15:09:40 +0000 (11:09 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 8 Apr 2021 15:09:40 +0000 (11:09 -0400)
packages/runtime-core/src/compat/deprecations.ts

index e416a7f4b4c82b18a76a82c58888f8395d69c451..b34cd716082f1e782dd47b440e189c6edb4bf42a 100644 (file)
@@ -1,4 +1,8 @@
-import { isRuntimeOnly } from '../component'
+import {
+  formatComponentName,
+  getCurrentInstance,
+  isRuntimeOnly
+} from '../component'
 import { warn } from '../warning'
 import { getCompatConfig } from './compatConfig'
 
@@ -301,7 +305,8 @@ const deprecationData: Record<DeprecationTypes, DeprecationData> = {
   }
 }
 
-const hasWarned: Record<string, boolean> = {}
+const instanceWarned: Record<string, true> = Object.create(null)
+const warnCount: Record<string, number> = Object.create(null)
 
 /**
  * @internal
@@ -321,13 +326,28 @@ export function warnDeprecation(key: DeprecationTypes, ...args: any[]) {
     return
   }
 
-  // avoid spamming the same message
   const dupKey = key + args.join('')
-  if (hasWarned[dupKey]) {
+  const instance = getCurrentInstance()
+  const compName = instance && formatComponentName(instance, instance.type)
+
+  // skip if the same warning is emitted for the same component type
+  if (compName !== `Anonymous`) {
+    const componentDupKey = dupKey + compName
+    if (componentDupKey in instanceWarned) {
+      return
+    }
+    instanceWarned[componentDupKey] = true
+  }
+
+  // same warning, but different component. skip the long message and just
+  // log the key and count.
+  if (dupKey in warnCount) {
+    warn(`(deprecation ${key}) (${++warnCount[dupKey] + 1})`)
     return
   }
 
-  hasWarned[dupKey] = true
+  warnCount[dupKey] = 0
+
   const { message, link } = deprecationData[key]
   warn(
     `(deprecation ${key}) ${