Browse Source

feat: warn if deprecated property is already set

Charles Kerr 6 years ago
parent
commit
2275625e1a
2 changed files with 32 additions and 10 deletions
  1. 16 10
      lib/common/api/deprecate.js
  2. 16 0
      spec/api-deprecations-spec.js

+ 16 - 10
lib/common/api/deprecate.js

@@ -90,21 +90,27 @@ deprecate.getHandler = () => deprecationHandler
 
 // Deprecate the old name of a property
 deprecate.property = (object, deprecatedName, newName) => {
+  let warned = false
+  let warn = () => {
+    if (!(warned || process.noDeprecation)) {
+      warned = true
+      deprecate.warn(deprecatedName, newName)
+    }
+  }
+
+  if ((typeof object[newName] === 'undefined') &&
+      (typeof object[deprecatedName] !== 'undefined')) {
+    warn()
+    object[newName] = object[deprecatedName]
+  }
+
   return Object.defineProperty(object, deprecatedName, {
     get: function () {
-      let warned = false
-      if (!(warned || process.noDeprecation)) {
-        warned = true
-        deprecate.warn(deprecatedName, newName)
-      }
+      warn()
       return this[newName]
     },
     set: function (value) {
-      let warned = false
-      if (!(warned || process.noDeprecation)) {
-        warned = true
-        deprecate.warn(deprecatedName, newName)
-      }
+      warn()
       this[newName] = value
     }
   })

+ 16 - 0
spec/api-deprecations-spec.js

@@ -73,6 +73,22 @@ describe('deprecations', () => {
     assert.strictEqual(o[oldPropertyName], value)
   })
 
+  it('warns if deprecated property is already set', () => {
+    let msg
+    deprecations.setHandler((m) => { msg = m })
+
+    const oldPropertyName = 'dingyOldName'
+    const newPropertyName = 'shinyNewName'
+    const value = 0
+
+    let o = { [oldPropertyName]: value }
+    deprecate.property(o, oldPropertyName, newPropertyName)
+
+    assert.strictEqual(typeof msg, 'string')
+    assert.ok(msg.includes(oldPropertyName))
+    assert.ok(msg.includes(newPropertyName))
+  })
+
   it('throws an exception if no deprecation handler is specified', () => {
     assert.throws(() => {
       deprecate.log('this is deprecated')