diff --git a/packages/@ember/-internals/metal/index.ts b/packages/@ember/-internals/metal/index.ts index e696b443dd9..2ae048403b3 100644 --- a/packages/@ember/-internals/metal/index.ts +++ b/packages/@ember/-internals/metal/index.ts @@ -2,7 +2,7 @@ export { default as computed, autoComputed, isComputed, ComputedProperty } from export { getCachedValueFor } from './lib/computed_cache'; export { default as alias } from './lib/alias'; export { deprecateProperty } from './lib/deprecate_property'; -export { PROXY_CONTENT, _getPath, get, getWithDefault, _getProp } from './lib/property_get'; +export { PROXY_CONTENT, _getPath, get, _getProp } from './lib/property_get'; export { set, _setProp, trySet } from './lib/property_set'; export { objectAt, diff --git a/packages/@ember/-internals/metal/lib/property_get.ts b/packages/@ember/-internals/metal/lib/property_get.ts index 518aa242719..e8c7862317d 100644 --- a/packages/@ember/-internals/metal/lib/property_get.ts +++ b/packages/@ember/-internals/metal/lib/property_get.ts @@ -2,7 +2,7 @@ @module @ember/object */ import { HAS_NATIVE_PROXY, isEmberArray, setProxy, symbol } from '@ember/-internals/utils'; -import { assert, deprecate } from '@ember/debug'; +import { assert } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; import { consumeTag, @@ -158,52 +158,6 @@ export function _getPath(root: T, path: string | string[]): an return obj; } -/** - Retrieves the value of a property from an Object, or a default value in the - case that the property returns `undefined`. - - ```javascript - import { getWithDefault } from '@ember/object'; - getWithDefault(person, 'lastName', 'Doe'); - ``` - - @method getWithDefault - @for @ember/object - @static - @param {Object} obj The object to retrieve from. - @param {String} keyName The name of the property to retrieve - @param {Object} defaultValue The value to return if the property value is undefined - @return {Object} The property value or the defaultValue. - @public - @deprecated -*/ -export function getWithDefault>( - root: T, - key: K, - defaultValue: T[K] -): T[K] { - deprecate( - 'Using getWithDefault has been deprecated. Instead, consider using Ember get and explicitly checking for undefined.', - false, - { - id: 'ember-metal.get-with-default', - until: '4.0.0', - url: 'https://deprecations.emberjs.com/v3.x#toc_ember-metal-get-with-default', - for: 'ember-source', - since: { - enabled: '3.21.0', - }, - } - ); - - let value = get(root, key); - - if (value === undefined) { - return defaultValue; - } - return value; -} - export default get; // Warm it up diff --git a/packages/@ember/-internals/metal/tests/accessors/get_test.js b/packages/@ember/-internals/metal/tests/accessors/get_test.js index 6e2d4ccdcc2..a9a00c87747 100644 --- a/packages/@ember/-internals/metal/tests/accessors/get_test.js +++ b/packages/@ember/-internals/metal/tests/accessors/get_test.js @@ -1,10 +1,9 @@ import { ENV } from '@ember/-internals/environment'; import { Object as EmberObject } from '@ember/-internals/runtime'; -import { get, set, getWithDefault, Mixin, observer, computed } from '../..'; +import { get, Mixin, observer } from '../..'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; import { run } from '@ember/runloop'; import { destroy } from '@glimmer/destroyable'; -import { track } from '@glimmer/validator'; function aget(x, y) { return x[y]; @@ -205,197 +204,3 @@ moduleFor( } } ); - -moduleFor( - 'getWithDefault', - class extends AbstractTestCase { - ['@test should get arbitrary properties on an object'](assert) { - expectDeprecation(() => { - let obj = { - string: 'string', - number: 23, - boolTrue: true, - boolFalse: false, - nullValue: null, - }; - - for (let key in obj) { - if (!Object.prototype.hasOwnProperty.call(obj, key)) { - continue; - } - assert.equal(getWithDefault(obj, key, 'fail'), obj[key], key); - } - - obj = { - undef: undefined, - }; - - assert.equal( - getWithDefault(obj, 'undef', 'default'), - 'default', - 'explicit undefined retrieves the default' - ); - assert.equal( - getWithDefault(obj, 'not-present', 'default'), - 'default', - 'non-present key retrieves the default' - ); - }, /Using getWithDefault has been deprecated. Instead, consider using Ember get and explicitly checking for undefined./); - } - - ['@test should call unknownProperty if defined and value is undefined'](assert) { - let obj = { - count: 0, - unknownProperty(key) { - assert.equal(key, 'foo', 'should pass key'); - this.count++; - return 'FOO'; - }, - }; - - assert.equal(get(obj, 'foo'), 'FOO', 'should return value from unknown'); - assert.equal(obj.count, 1, 'should have invoked'); - } - - ['@test if unknownProperty is present, it is called using getFromEmberMetal()/set()'](assert) { - expectDeprecation(() => { - let obj = { - unknownProperty(key) { - if (key === 'foo') { - assert.equal(key, 'foo', 'should pass key'); - return 'FOO'; - } - }, - }; - assert.equal( - getWithDefault(obj, 'foo', 'fail'), - 'FOO', - 'should return value from unknownProperty' - ); - assert.equal( - getWithDefault(obj, 'bar', 'default'), - 'default', - 'should convert undefined from unknownProperty into default' - ); - }, /Using getWithDefault has been deprecated. Instead, consider using Ember get and explicitly checking for undefined./); - } - - ['@test if unknownProperty is present, it is called using accessors'](assert) { - if (ENV.USES_ACCESSORS) { - let obj = { - unknownProperty(key) { - if (key === 'foo') { - assert.equal(key, 'foo', 'should pass key'); - return 'FOO'; - } - }, - }; - assert.equal(aget(obj, 'foo', 'fail'), 'FOO', 'should return value from unknownProperty'); - assert.equal( - aget(obj, 'bar', 'default'), - 'default', - 'should convert undefined from unknownProperty into default' - ); - } else { - assert.ok('SKIPPING ACCESSORS'); - } - } - - ['@test gives helpful deprecation when a property tracked with `get` is mutated after access within unknownProperty within an autotracking transaction']() { - class EmberObject { - foo = null; - - unknownProperty() { - get(this, 'foo'); - set(this, 'foo', 123); - } - } - - let obj = new EmberObject(); - - expectDeprecation(() => { - // TODO: this must be a bug?? - expectDeprecation( - /You attempted to update `undefined`, but it had already been used previously in the same computation/ - ); - - track(() => { - get(obj, 'bar'); - }); - }, /You attempted to update `foo` on `EmberObject`, but it had already been used previously in the same computation/); - } - - // .......................................................... - // BUGS - // - - ['@test (regression) watched properties on unmodified inherited objects should still return their original value']( - assert - ) { - expectDeprecation(() => { - let MyMixin = Mixin.create({ - someProperty: 'foo', - propertyDidChange: observer('someProperty', () => { - /* nothing to do */ - }), - }); - - let baseObject = MyMixin.apply({}); - let theRealObject = Object.create(baseObject); - - assert.equal( - getWithDefault(theRealObject, 'someProperty', 'fail'), - 'foo', - 'should return the set value, not false' - ); - - run(() => destroy(baseObject)); - }, /Using getWithDefault has been deprecated. Instead, consider using Ember get and explicitly checking for undefined./); - } - - ['@test should respect prototypical inheritance when subclasses override CPs'](assert) { - let ParentClass = EmberObject.extend({ - prop: computed({ - get() { - assert.ok(false, 'incorrect getter called'); - return 123; - }, - }), - }); - - let SubClass = ParentClass.extend({ - get prop() { - assert.ok(true, 'correct getter called'); - return 456; - }, - }); - - let instance = SubClass.create(); - - instance.prop; - } - - ['@test should respect prototypical inheritance when subclasses override CPs with native classes']( - assert - ) { - class ParentClass extends EmberObject { - @computed - get prop() { - assert.ok(false, 'incorrect getter called'); - return 123; - } - } - - class SubClass extends ParentClass { - get prop() { - assert.ok(true, 'correct getter called'); - return 456; - } - } - - let instance = SubClass.create(); - - instance.prop; - } - } -); diff --git a/packages/@ember/-internals/metal/tests/tracked/get_test.js b/packages/@ember/-internals/metal/tests/tracked/get_test.js index 7263666fb0e..024b7f1b19c 100644 --- a/packages/@ember/-internals/metal/tests/tracked/get_test.js +++ b/packages/@ember/-internals/metal/tests/tracked/get_test.js @@ -1,5 +1,5 @@ import { AbstractTestCase, moduleFor } from 'internal-test-helpers'; -import { get, getWithDefault, tracked } from '../..'; +import { get, tracked } from '../..'; let createObj = function () { class Obj { @@ -42,32 +42,5 @@ moduleFor( this.assert.equal(get(obj, 'path.key.value'), 'value for some-key'); } - - ['@test should get arbitrary properties on an object (getWithDefault DEPRECATED)']() { - expectDeprecation(() => { - let obj = createObj(); - - for (let key in obj) { - this.assert.equal(getWithDefault(obj, key, 'fail'), obj[key], key); - } - - class Obj { - @tracked undef = undefined; - } - - let obj2 = new Obj(); - - this.assert.equal( - getWithDefault(obj2, 'undef', 'default'), - 'default', - 'explicit undefined retrieves the default' - ); - this.assert.equal( - getWithDefault(obj2, 'not-present', 'default'), - 'default', - 'non-present key retrieves the default' - ); - }, /Using getWithDefault has been deprecated. Instead, consider using Ember get and explicitly checking for undefined./); - } } ); diff --git a/packages/@ember/-internals/runtime/index.d.ts b/packages/@ember/-internals/runtime/index.d.ts index af32a6e2ad2..2c18eec61cb 100644 --- a/packages/@ember/-internals/runtime/index.d.ts +++ b/packages/@ember/-internals/runtime/index.d.ts @@ -49,7 +49,6 @@ export class Object extends CoreObject implements Observable { method: ObserverMethod ): this; removeObserver(key: keyof this, method: ObserverMethod): this; - getWithDefault(key: K, defaultValue: any): unknown; incrementProperty(keyName: keyof this, increment?: number): number; decrementProperty(keyName: keyof this, decrement?: number): number; toggleProperty(keyName: keyof this): boolean; diff --git a/packages/@ember/-internals/runtime/lib/mixins/observable.js b/packages/@ember/-internals/runtime/lib/mixins/observable.js index 763a86cc0c9..c32cedc4cb1 100644 --- a/packages/@ember/-internals/runtime/lib/mixins/observable.js +++ b/packages/@ember/-internals/runtime/lib/mixins/observable.js @@ -5,7 +5,6 @@ import { peekMeta } from '@ember/-internals/meta'; import { get, - getWithDefault, set, getProperties, setProperties, @@ -404,25 +403,6 @@ export default Mixin.create({ return hasListeners(this, `${key}:change`); }, - /** - Retrieves the value of a property, or a default value in the case that the - property returns `undefined`. - - ```javascript - person.getWithDefault('lastName', 'Doe'); - ``` - - @method getWithDefault - @param {String} keyName The name of the property to retrieve - @param {Object} defaultValue The value to return if the property value is undefined - @return {Object} The property value or the defaultValue. - @public - @deprecated - */ - getWithDefault(keyName, defaultValue) { - return getWithDefault(this, keyName, defaultValue); - }, - /** Set the value of a property to the current value plus some amount. diff --git a/packages/@ember/-internals/runtime/tests/system/object/computed_test.js b/packages/@ember/-internals/runtime/tests/system/object/computed_test.js index 369dcc40261..5d4c284d519 100644 --- a/packages/@ember/-internals/runtime/tests/system/object/computed_test.js +++ b/packages/@ember/-internals/runtime/tests/system/object/computed_test.js @@ -3,7 +3,6 @@ import { computed, set, get, - getWithDefault, observer, defineProperty, notifyPropertyChange, @@ -17,12 +16,10 @@ function K() { return this; } -function testWithDefault(assert, expect, x, y, z) { +function testGet(assert, expect, x, y) { assert.equal(get(x, y), expect); - expectDeprecation(() => { - assert.equal(getWithDefault(x, y, z), expect); - assert.equal(x.getWithDefault(y, z), expect); - }, /Using getWithDefault has been deprecated. Instead, consider using Ember get and explicitly checking for undefined./); + assert.equal(get(x, y), expect); + assert.equal(x.get(y), expect); } moduleFor( @@ -35,7 +32,7 @@ moduleFor( }), }); - testWithDefault(assert, 'FOO', MyClass.create(), 'foo'); + testGet(assert, 'FOO', MyClass.create(), 'foo'); } ['@test computed property on subclass'](assert) { @@ -51,7 +48,7 @@ moduleFor( }), }); - testWithDefault(assert, 'BAR', Subclass.create(), 'foo'); + testGet(assert, 'BAR', Subclass.create(), 'foo'); } ['@test replacing computed property with regular val'](assert) { @@ -65,10 +62,10 @@ moduleFor( foo: 'BAR', }); - testWithDefault(assert, 'BAR', Subclass.create(), 'foo'); + testGet(assert, 'BAR', Subclass.create(), 'foo'); } - ['@test complex depndent keys'](assert) { + ['@test complex dependent keys'](assert) { let MyClass = EmberObject.extend({ init() { this._super(...arguments); @@ -90,18 +87,18 @@ moduleFor( let obj1 = MyClass.create(); let obj2 = Subclass.create(); - testWithDefault(assert, 'BIFF 1', obj1, 'foo'); - testWithDefault(assert, 'BIFF 21', obj2, 'foo'); + testGet(assert, 'BIFF 1', obj1, 'foo'); + testGet(assert, 'BIFF 21', obj2, 'foo'); set(get(obj1, 'bar'), 'baz', 'BLARG'); - testWithDefault(assert, 'BLARG 2', obj1, 'foo'); - testWithDefault(assert, 'BIFF 21', obj2, 'foo'); + testGet(assert, 'BLARG 2', obj1, 'foo'); + testGet(assert, 'BIFF 21', obj2, 'foo'); set(get(obj2, 'bar'), 'baz', 'BOOM'); - testWithDefault(assert, 'BLARG 2', obj1, 'foo'); - testWithDefault(assert, 'BOOM 22', obj2, 'foo'); + testGet(assert, 'BLARG 2', obj1, 'foo'); + testGet(assert, 'BOOM 22', obj2, 'foo'); } ['@test complex dependent keys changing complex dependent keys'](assert) { @@ -135,13 +132,13 @@ moduleFor( let obj2 = Subclass.create(); - testWithDefault(assert, 'BIFF2 1', obj2, 'foo'); + testGet(assert, 'BIFF2 1', obj2, 'foo'); set(get(obj2, 'bar'), 'baz', 'BLARG'); - testWithDefault(assert, 'BIFF2 1', obj2, 'foo'); // should not invalidate property + testGet(assert, 'BIFF2 1', obj2, 'foo'); // should not invalidate property set(get(obj2, 'bar2'), 'baz', 'BLARG'); - testWithDefault(assert, 'BLARG 2', obj2, 'foo'); // should not invalidate property + testGet(assert, 'BLARG 2', obj2, 'foo'); // should not invalidate property } ['@test can retrieve metadata for a computed property'](assert) { diff --git a/packages/@ember/-internals/runtime/types/observable.d.ts b/packages/@ember/-internals/runtime/types/observable.d.ts index 96b2ae03d5d..3a73546cebf 100644 --- a/packages/@ember/-internals/runtime/types/observable.d.ts +++ b/packages/@ember/-internals/runtime/types/observable.d.ts @@ -51,11 +51,6 @@ interface Observable { method: ObserverMethod ): this; removeObserver(key: keyof this, method: ObserverMethod): this; - /** - * Retrieves the value of a property, or a default value in the case that the - * property returns `undefined`. - */ - getWithDefault(key: K, defaultValue: any): unknown; /** * Set the value of a property to the current value plus some amount. */ diff --git a/packages/@ember/object/index.js b/packages/@ember/object/index.js index ba3d1bd47a3..328b0fa5f2f 100644 --- a/packages/@ember/object/index.js +++ b/packages/@ember/object/index.js @@ -12,7 +12,6 @@ export { set, getProperties, setProperties, - getWithDefault, observer, computed, trySet, diff --git a/packages/ember/index.js b/packages/ember/index.js index 5883e935c4d..835fd8ea724 100644 --- a/packages/ember/index.js +++ b/packages/ember/index.js @@ -272,7 +272,6 @@ Ember.ComputedProperty = metal.ComputedProperty; Ember._setClassicDecorator = metal.setClassicDecorator; Ember.meta = meta; Ember.get = metal.get; -Ember.getWithDefault = metal.getWithDefault; Ember._getPath = metal._getPath; Ember.set = metal.set; Ember.trySet = metal.trySet; diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js index 8e629736704..2519fd3b239 100644 --- a/packages/ember/tests/reexports_test.js +++ b/packages/ember/tests/reexports_test.js @@ -286,7 +286,6 @@ let allExports = [ ['defineProperty', '@ember/object', 'defineProperty'], ['get', '@ember/object', 'get'], ['getProperties', '@ember/object', 'getProperties'], - ['getWithDefault', '@ember/object', 'getWithDefault'], ['notifyPropertyChange', '@ember/object', 'notifyPropertyChange'], ['observer', '@ember/object', 'observer'], ['set', '@ember/object', 'set'], diff --git a/tests/docs/expected.js b/tests/docs/expected.js index 0ef66d889ba..d81cb276962 100644 --- a/tests/docs/expected.js +++ b/tests/docs/expected.js @@ -263,7 +263,6 @@ module.exports = { 'getViewElement', 'getViewId', 'getViewRange', - 'getWithDefault', 'global', 'gt', 'gte',