diff --git a/packages/-ember-data/tests/unit/model/rollback-attributes-test.js b/packages/-ember-data/tests/unit/model/rollback-attributes-test.js index c670fac01d7..748b6e268f8 100644 --- a/packages/-ember-data/tests/unit/model/rollback-attributes-test.js +++ b/packages/-ember-data/tests/unit/model/rollback-attributes-test.js @@ -8,6 +8,7 @@ import RESTAdapter from '@ember-data/adapter/rest'; import RESTSerializer from '@ember-data/serializer/rest'; import JSONAPISerializer from '@ember-data/serializer/json-api'; import { InvalidError } from '@ember-data/adapter/error'; +import { DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS } from '@ember-data/private-build-infra/deprecations'; import { module, test } from 'qunit'; @@ -65,13 +66,17 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho }); assert.equal(person.get('firstName'), 'Thomas'); - assert.equal(person.get('rolledBackCount'), 0); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 0); + } run(() => person.rollbackAttributes()); assert.equal(person.get('firstName'), 'Tom'); assert.equal(person.get('hasDirtyAttributes'), false); - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }); test('changes to unassigned attributes can be rolled back', function(assert) { @@ -95,13 +100,18 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho }); assert.equal(person.get('firstName'), 'Thomas'); - assert.equal(person.get('rolledBackCount'), 0); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 0); + } run(() => person.rollbackAttributes()); assert.strictEqual(person.get('firstName'), undefined); assert.equal(person.get('hasDirtyAttributes'), false); - assert.equal(person.get('rolledBackCount'), 1); + + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }); test('changes to attributes made after a record is in-flight only rolls back the local changes', function(assert) { @@ -139,7 +149,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho person.set('lastName', 'Dolly'); assert.equal(person.get('lastName'), 'Dolly'); - assert.equal(person.get('rolledBackCount'), 0); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 0); + } person.rollbackAttributes(); @@ -148,7 +160,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho assert.equal(person.get('isSaving'), true); return saving.then(() => { - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } assert.equal(person.get('hasDirtyAttributes'), false, 'The person is now clean'); }); }); @@ -186,8 +200,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho person.save().then(null, function() { assert.equal(person.get('isError'), true); assert.deepEqual(person.changedAttributes().firstName, ['Tom', 'Thomas']); - assert.equal(person.get('rolledBackCount'), 0); - + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 0); + } run(function() { person.rollbackAttributes(); }); @@ -195,7 +210,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho assert.equal(person.get('firstName'), 'Tom'); assert.equal(person.get('isError'), false); assert.equal(Object.keys(person.changedAttributes()).length, 0); - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }); }); }); @@ -236,14 +253,18 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho .catch(() => { assert.equal(person.get('isError'), true); assert.equal(person.get('isDeleted'), true); - assert.equal(person.get('rolledBackCount'), 0); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 0); + } run(() => person.rollbackAttributes()); assert.equal(person.get('isDeleted'), false); assert.equal(person.get('isError'), false); assert.equal(person.get('hasDirtyAttributes'), false, 'must be not dirty'); - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }) .then(() => { assert.equal( @@ -261,14 +282,18 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho assert.equal(person.get('isNew'), true, 'must be new'); assert.equal(person.get('hasDirtyAttributes'), true, 'must be dirty'); - assert.equal(person.get('rolledBackCount'), 0); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 0); + } run(person, 'rollbackAttributes'); assert.equal(person.get('isNew'), false, 'must not be new'); assert.equal(person.get('hasDirtyAttributes'), false, 'must not be dirty'); assert.equal(person.get('isDeleted'), true, 'must be deleted'); - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }); test(`invalid new record's attributes can be rollbacked`, function(assert) { @@ -304,7 +329,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho assert.equal(person.get('isNew'), false, 'must not be new'); assert.equal(person.get('hasDirtyAttributes'), false, 'must not be dirty'); assert.equal(person.get('isDeleted'), true, 'must be deleted'); - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }); }); }); @@ -357,7 +384,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho 'original name', 'after rollbackAttributes() firstName has the original value' ); - assert.equal(person.get('rolledBackCount'), 1); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(person.get('rolledBackCount'), 1); + } }); }); }); @@ -394,10 +423,12 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho test("invalid record's attributes can be rollbacked", async function(assert) { class Dog extends Model { @attr() name; - rolledBackCount = 0; - rolledBack() { + } + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + Dog.prototype.rolledBackCount = 0; + Dog.prototype.rolledBack = function() { this.incrementProperty('rolledBackCount'); - } + }; } const thrownAdapterError = new InvalidError([ { @@ -457,7 +488,9 @@ module('unit/model/rollbackAttributes - model.rollbackAttributes()', function(ho assert.equal(dog.get('name'), 'Pluto', 'Name is rolled back'); assert.notOk(dog.get('errors.name'), 'We have no errors for name anymore'); assert.ok(dog.get('isValid'), 'We are now in a valid state'); - assert.equal(dog.get('rolledBackCount'), 1, 'we only rolled back once'); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + assert.equal(dog.get('rolledBackCount'), 1, 'we only rolled back once'); + } } }); }); diff --git a/packages/-ember-data/tests/unit/record-arrays/adapter-populated-record-array-test.js b/packages/-ember-data/tests/unit/record-arrays/adapter-populated-record-array-test.js index a7830e2b6b1..8baab634ffc 100644 --- a/packages/-ember-data/tests/unit/record-arrays/adapter-populated-record-array-test.js +++ b/packages/-ember-data/tests/unit/record-arrays/adapter-populated-record-array-test.js @@ -4,6 +4,8 @@ import { run } from '@ember/runloop'; import DS from 'ember-data'; import { module, test } from 'qunit'; const { AdapterPopulatedRecordArray, RecordArrayManager } = DS; +import Evented from '@ember/object/evented'; +import { DEPRECATE_EVENTED_API_USAGE } from '@ember-data/private-build-infra/deprecations'; module('unit/record-arrays/adapter-populated-record-array - DS.AdapterPopulatedRecordArray', function() { function internalModelFor(record) { @@ -125,9 +127,11 @@ module('unit/record-arrays/adapter-populated-record-array - DS.AdapterPopulatedR assert.equal(didAddRecord, 0, 'no records should have been added yet'); let didLoad = 0; - recordArray.on('didLoad', function() { - didLoad++; - }); + if (DEPRECATE_EVENTED_API_USAGE) { + recordArray.on('didLoad', function() { + didLoad++; + }); + } let links = { foo: 1 }; let meta = { bar: 2 }; @@ -150,11 +154,15 @@ module('unit/record-arrays/adapter-populated-record-array - DS.AdapterPopulatedR 'should now contain the loaded records' ); - assert.equal(didLoad, 0, 'didLoad event should not have fired'); + if (DEPRECATE_EVENTED_API_USAGE) { + assert.equal(didLoad, 0, 'didLoad event should not have fired'); + } assert.equal(recordArray.get('links').foo, 1); assert.equal(recordArray.get('meta').bar, 2); }); - assert.equal(didLoad, 1, 'didLoad event should have fired once'); + if (DEPRECATE_EVENTED_API_USAGE) { + assert.equal(didLoad, 1, 'didLoad event should have fired once'); + } assert.expectDeprecation({ id: 'ember-data:evented-api-usage', }); @@ -176,7 +184,8 @@ module('unit/record-arrays/adapter-populated-record-array - DS.AdapterPopulatedR assert.equal(array, recordArray); } - let recordArray = AdapterPopulatedRecordArray.create({ + // we need Evented to gain access to the @array:change event + let recordArray = AdapterPopulatedRecordArray.extend(Evented).create({ query: 'some-query', manager: new RecordArrayManager({}), }); diff --git a/packages/-ember-data/tests/unit/store/push-test.js b/packages/-ember-data/tests/unit/store/push-test.js index 4ebbac4cc43..ea64c905f32 100644 --- a/packages/-ember-data/tests/unit/store/push-test.js +++ b/packages/-ember-data/tests/unit/store/push-test.js @@ -8,6 +8,7 @@ import testInDebug from '@ember-data/unpublished-test-infra/test-support/test-in import { module, test } from 'qunit'; import DS from 'ember-data'; +import { deprecatedTest } from '@ember-data/unpublished-test-infra/test-support/deprecated-test'; let store, Person, PhoneNumber, Post; const { attr, hasMany, belongsTo } = DS; @@ -147,40 +148,47 @@ module('unit/store/push - DS.Store#push', function(hooks) { }); }); - test(`Calling push triggers 'didLoad' even if the record hasn't been requested from the adapter`, async function(assert) { - assert.expect(2); - - let didLoad = new EmberPromise((resolve, reject) => { - Person.reopen({ - didLoad() { - try { - assert.ok(true, 'The didLoad callback was called'); - resolve(); - } catch (e) { - reject(e); - } - }, + deprecatedTest( + `Calling push triggers 'didLoad' even if the record hasn't been requested from the adapter`, + { + id: 'ember-data:evented-api-usage', + until: '4.0', + }, + async function(assert) { + assert.expect(2); + + let didLoad = new EmberPromise((resolve, reject) => { + Person.reopen({ + didLoad() { + try { + assert.ok(true, 'The didLoad callback was called'); + resolve(); + } catch (e) { + reject(e); + } + }, + }); }); - }); - run(() => { - store.push({ - data: { - type: 'person', - id: 'wat', - attributes: { - firstName: 'Yehuda', - lastName: 'Katz', + run(() => { + store.push({ + data: { + type: 'person', + id: 'wat', + attributes: { + firstName: 'Yehuda', + lastName: 'Katz', + }, }, - }, + }); }); - }); - await didLoad; - assert.expectDeprecation({ - id: 'ember-data:record-lifecycle-event-methods', - }); - }); + await didLoad; + assert.expectDeprecation({ + id: 'ember-data:record-lifecycle-event-methods', + }); + } + ); test('Calling push with partial records updates just those attributes', function(assert) { assert.expect(2); diff --git a/packages/model/addon/-private/model.js b/packages/model/addon/-private/model.js index d5102483fb2..98ce5d60503 100644 --- a/packages/model/addon/-private/model.js +++ b/packages/model/addon/-private/model.js @@ -5,6 +5,12 @@ import { DEBUG } from '@glimmer/env'; import { assert, warn, deprecate } from '@ember/debug'; import Ember from 'ember'; import { RECORD_DATA_ERRORS, RECORD_DATA_STATE, REQUEST_SERVICE } from '@ember-data/canary-features'; +import { + DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS, + DEPRECATE_MODEL_DATA, + DEPRECATE_MODEL_TOJSON, + DEPRECATE_EVENTED_API_USAGE, +} from '@ember-data/private-build-infra/deprecations'; import { coerceId, DeprecatedEvented, @@ -604,37 +610,6 @@ const Model = EmberObject.extend(DeprecatedEvented, { return this._internalModel.createSnapshot().serialize(options); }, - /** - Use [JSONSerializer](JSONSerializer.html) to - get the JSON representation of a record. - - `toJSON` takes an optional hash as a parameter, currently - supported options are: - - - `includeId`: `true` if the record's ID should be included in the - JSON representation. - - @method toJSON - @param {Object} options - @return {Object} A JSON representation of the object. - */ - toJSON(options) { - // container is for lazy transform lookups - deprecate( - `Called the built-in \`toJSON\` on the record "${this.constructor.modelName}:${this.id}". The built-in \`toJSON\` method on instances of classes extending \`Model\` is deprecated. For more information see the link below.`, - false, - { - id: 'ember-data:model.toJSON', - until: '4.0', - url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_record-toJSON', - } - ); - let serializer = this._internalModel.store.serializerFor('-default'); - let snapshot = this._internalModel.createSnapshot(); - - return serializer.serialize(snapshot, options); - }, - /** Fired when the record is ready to be interacted with, that is either loaded from the server or created locally. @@ -1001,33 +976,6 @@ const Model = EmberObject.extend(DeprecatedEvented, { }); }, - /** - Override the default event firing from Ember.Evented to - also call methods with the given name. - - @method trigger - @private - @param {String} name - */ - trigger(name) { - let fn = this[name]; - - if (typeof fn === 'function') { - let length = arguments.length; - let args = new Array(length - 1); - - for (let i = 1; i < length; i++) { - args[i - 1] = arguments[i]; - } - fn.apply(this, args); - } - - const _hasEvent = DEBUG ? this._has(name) : this.has(name); - if (_hasEvent) { - this._super(...arguments); - } - }, - attr() { assert( 'The `attr` method is not available on Model, a Snapshot was probably expected. Are you passing a Model instead of a Snapshot to your serializer?', @@ -1305,26 +1253,95 @@ const Model = EmberObject.extend(DeprecatedEvented, { }, }); -/** +if (DEPRECATE_EVENTED_API_USAGE) { + /** + Override the default event firing from Ember.Evented to + also call methods with the given name. + + @method trigger + @private + @param {String} name +*/ + Model.reopen({ + trigger(name) { + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + let fn = this[name]; + if (typeof fn === 'function') { + let length = arguments.length; + let args = new Array(length - 1); + + for (let i = 1; i < length; i++) { + args[i - 1] = arguments[i]; + } + fn.apply(this, args); + } + } + + const _hasEvent = DEBUG ? this._has(name) : this.has(name); + if (_hasEvent) { + this._super(...arguments); + } + }, + }); +} + +if (DEPRECATE_MODEL_DATA) { + /** @property data @private @deprecated @type {Object} */ -Object.defineProperty(Model.prototype, 'data', { - configurable: false, - get() { - deprecate( - `Model.data was private and it's use has been deprecated. For public access, use the RecordData API or iterate attributes`, - false, - { - id: 'ember-data:Model.data', - until: '3.9', - } - ); - return recordDataFor(this)._data; - }, -}); + Object.defineProperty(Model.prototype, 'data', { + configurable: false, + get() { + deprecate( + `Model.data was private and it's use has been deprecated. For public access, use the RecordData API or iterate attributes`, + false, + { + id: 'ember-data:Model.data', + until: '3.9', + } + ); + return recordDataFor(this)._data; + }, + }); +} + +if (DEPRECATE_MODEL_TOJSON) { + /** + Use [JSONSerializer](JSONSerializer.html) to + get the JSON representation of a record. + + `toJSON` takes an optional hash as a parameter, currently + supported options are: + + - `includeId`: `true` if the record's ID should be included in the + JSON representation. + + @method toJSON + @param {Object} options + @return {Object} A JSON representation of the object. + */ + Model.reopen({ + toJSON(options) { + // container is for lazy transform lookups + deprecate( + `Called the built-in \`toJSON\` on the record "${this.constructor.modelName}:${this.id}". The built-in \`toJSON\` method on instances of classes extending \`Model\` is deprecated. For more information see the link below.`, + false, + { + id: 'ember-data:model.toJSON', + until: '4.0', + url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_record-toJSON', + } + ); + let serializer = this._internalModel.store.serializerFor('-default'); + let snapshot = this._internalModel.createSnapshot(); + + return serializer.serialize(snapshot, options); + }, + }); +} const ID_DESCRIPTOR = { configurable: false, @@ -1369,34 +1386,41 @@ if (DEBUG) { return isBasicDesc(instanceDesc) && lookupDescriptor(obj.constructor, keyName) === null; }; - const INSTANCE_DEPRECATIONS = new WeakMap(); - const DEPRECATED_LIFECYCLE_EVENT_METHODS = [ - 'becameError', - 'becameInvalid', - 'didCreate', - 'didDelete', - 'didLoad', - 'didUpdate', - 'ready', - 'rolledBack', - ]; - - let lookupDeprecations = function lookupInstanceDeprecations(instance) { - let deprecations = INSTANCE_DEPRECATIONS.get(instance); - - if (!deprecations) { - deprecations = new Set(); - INSTANCE_DEPRECATIONS.set(instance, deprecations); - } + let lookupDeprecations; + let DEPRECATED_LIFECYCLE_EVENT_METHODS; + + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + const INSTANCE_DEPRECATIONS = new WeakMap(); + DEPRECATED_LIFECYCLE_EVENT_METHODS = [ + 'becameError', + 'becameInvalid', + 'didCreate', + 'didDelete', + 'didLoad', + 'didUpdate', + 'ready', + 'rolledBack', + ]; - return deprecations; - }; + lookupDeprecations = function lookupInstanceDeprecations(instance) { + let deprecations = INSTANCE_DEPRECATIONS.get(instance); + + if (!deprecations) { + deprecations = new Set(); + INSTANCE_DEPRECATIONS.set(instance, deprecations); + } + + return deprecations; + }; + } Model.reopen({ init() { this._super(...arguments); - this._getDeprecatedEventedInfo = () => `${this._internalModel.modelName}#${this.id}`; + if (DEPRECATE_EVENTED_API_USAGE) { + this._getDeprecatedEventedInfo = () => `${this._internalModel.modelName}#${this.id}`; + } if (!isDefaultEmptyDescriptor(this, '_internalModel') || !(this._internalModel instanceof InternalModel)) { throw new Error( @@ -1421,23 +1445,25 @@ if (DEBUG) { ); } - let lifecycleDeprecations = lookupDeprecations(this.constructor); - - DEPRECATED_LIFECYCLE_EVENT_METHODS.forEach(methodName => { - if (typeof this[methodName] === 'function' && !lifecycleDeprecations.has(methodName)) { - deprecate( - `You defined a \`${methodName}\` method for ${this.constructor.toString()} but lifecycle events for models have been deprecated.`, - false, - { - id: 'ember-data:record-lifecycle-event-methods', - until: '4.0', - url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_record-lifecycle-event-methods', - } - ); - - lifecycleDeprecations.add(methodName); - } - }); + if (DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS) { + let lifecycleDeprecations = lookupDeprecations(this.constructor); + + DEPRECATED_LIFECYCLE_EVENT_METHODS.forEach(methodName => { + if (typeof this[methodName] === 'function' && !lifecycleDeprecations.has(methodName)) { + deprecate( + `You defined a \`${methodName}\` method for ${this.constructor.toString()} but lifecycle events for models have been deprecated.`, + false, + { + id: 'ember-data:record-lifecycle-event-methods', + until: '4.0', + url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_record-lifecycle-event-methods', + } + ); + + lifecycleDeprecations.add(methodName); + } + }); + } }, }); } diff --git a/packages/store/addon/-private/system/core-store.ts b/packages/store/addon/-private/system/core-store.ts index d5b0ea3aa19..14e094bbb47 100644 --- a/packages/store/addon/-private/system/core-store.ts +++ b/packages/store/addon/-private/system/core-store.ts @@ -84,6 +84,11 @@ import { Dict } from '../ts-interfaces/utils'; import constructResource from '../utils/construct-resource'; import { errorsArrayToHash } from './errors-utils'; +import { + DEPRECATE_DEFAULT_ADAPTER, + DEPRECATE_DEFAULT_SERIALIZER, + DEPRECATE_LEGACY_TEST_REGISTRATIONS, +} from '@ember-data/private-build-infra/deprecations'; type Relationship = import('@ember-data/record-data/-private').Relationship; type RelationshipRecordData = import('@ember-data/record-data/-private/ts-interfaces/relationship-record-data').RelationshipRecordData; @@ -129,7 +134,6 @@ function deprecateTestRegistration( } ); } - /** The store contains all of the data for records loaded from the server. It is also responsible for creating instances of `Model` that wrap @@ -3327,23 +3331,25 @@ abstract class CoreStore extends Service { serializer = owner.lookup(`serializer:${normalizedModelName}`); - // in production this is handled by the re-export - if (DEBUG && HAS_EMBER_DATA_PACKAGE && HAS_SERIALIZER_PACKAGE && serializer === undefined) { - if (normalizedModelName === '-json-api') { - const Serializer = require('@ember-data/serializer/json-api').default; - owner.register(`serializer:-json-api`, Serializer); - serializer = owner.lookup(`serializer:-json-api`); - deprecateTestRegistration('serializer', '-json-api'); - } else if (normalizedModelName === '-rest') { - const Serializer = require('@ember-data/serializer/rest').default; - owner.register(`serializer:-rest`, Serializer); - serializer = owner.lookup(`serializer:-rest`); - deprecateTestRegistration('serializer', '-rest'); - } else if (normalizedModelName === '-default') { - const Serializer = require('@ember-data/serializer/json').default; - owner.register(`serializer:-default`, Serializer); - serializer = owner.lookup(`serializer:-default`); - serializer && deprecateTestRegistration('serializer', '-default'); + if (DEPRECATE_LEGACY_TEST_REGISTRATIONS) { + // in production this is handled by the re-export + if (DEBUG && HAS_EMBER_DATA_PACKAGE && HAS_SERIALIZER_PACKAGE && serializer === undefined) { + if (normalizedModelName === '-json-api') { + const Serializer = require('@ember-data/serializer/json-api').default; + owner.register(`serializer:-json-api`, Serializer); + serializer = owner.lookup(`serializer:-json-api`); + deprecateTestRegistration('serializer', '-json-api'); + } else if (normalizedModelName === '-rest') { + const Serializer = require('@ember-data/serializer/rest').default; + owner.register(`serializer:-rest`, Serializer); + serializer = owner.lookup(`serializer:-rest`); + deprecateTestRegistration('serializer', '-rest'); + } else if (normalizedModelName === '-default') { + const Serializer = require('@ember-data/serializer/json').default; + owner.register(`serializer:-default`, Serializer); + serializer = owner.lookup(`serializer:-default`); + serializer && deprecateTestRegistration('serializer', '-default'); + } } } @@ -3362,83 +3368,95 @@ abstract class CoreStore extends Service { return serializer; } - // no model specific serializer or application serializer, check for the `defaultSerializer` - // property defined on the adapter - let adapter = this.adapterFor(modelName); - let serializerName = get(adapter, 'defaultSerializer'); - - deprecate( - `store.serializerFor("${modelName}") resolved the "${serializerName}" serializer via the deprecated \`adapter.defaultSerializer\` property.\n\n\tPreviously, if no application or type-specific serializer was specified, the store would attempt to lookup a serializer via the \`defaultSerializer\` property on the type's adapter. This behavior is deprecated in favor of explicitly defining a type-specific serializer or application serializer`, - !serializerName, - { - id: 'ember-data:default-serializer', - until: '4.0', - url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data:default-serializers', - } - ); + let serializerName; + if (DEPRECATE_DEFAULT_SERIALIZER) { + // no model specific serializer or application serializer, check for the `defaultSerializer` + // property defined on the adapter + let adapter = this.adapterFor(modelName); + serializerName = get(adapter, 'defaultSerializer'); - serializer = serializerName - ? _serializerCache[serializerName] || owner.lookup(`serializer:${serializerName}`) - : undefined; + deprecate( + `store.serializerFor("${modelName}") resolved the "${serializerName}" serializer via the deprecated \`adapter.defaultSerializer\` property.\n\n\tPreviously, if no application or type-specific serializer was specified, the store would attempt to lookup a serializer via the \`defaultSerializer\` property on the type's adapter. This behavior is deprecated in favor of explicitly defining a type-specific serializer or application serializer`, + !serializerName, + { + id: 'ember-data:default-serializer', + until: '4.0', + url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data:default-serializers', + } + ); - // in production this is handled by the re-export - if (DEBUG && HAS_EMBER_DATA_PACKAGE && HAS_SERIALIZER_PACKAGE && serializer === undefined) { - if (serializerName === '-json-api') { - const Serializer = require('@ember-data/serializer/json-api').default; - owner.register(`serializer:-json-api`, Serializer); - serializer = owner.lookup(`serializer:-json-api`); - deprecateTestRegistration('serializer', '-json-api'); - } else if (serializerName === '-rest') { - const Serializer = require('@ember-data/serializer/rest').default; - owner.register(`serializer:-rest`, Serializer); - serializer = owner.lookup(`serializer:-rest`); - deprecateTestRegistration('serializer', '-rest'); - } else if (serializerName === '-default') { - const Serializer = require('@ember-data/serializer/json').default; - owner.register(`serializer:-default`, Serializer); - serializer = owner.lookup(`serializer:-default`); - serializer && deprecateTestRegistration('serializer', '-default'); + serializer = serializerName + ? _serializerCache[serializerName] || owner.lookup(`serializer:${serializerName}`) + : undefined; + } + + if (DEPRECATE_LEGACY_TEST_REGISTRATIONS) { + // in production this is handled by the re-export + if (DEBUG && HAS_EMBER_DATA_PACKAGE && HAS_SERIALIZER_PACKAGE && serializer === undefined) { + if (serializerName === '-json-api') { + const Serializer = require('@ember-data/serializer/json-api').default; + owner.register(`serializer:-json-api`, Serializer); + serializer = owner.lookup(`serializer:-json-api`); + deprecateTestRegistration('serializer', '-json-api'); + } else if (serializerName === '-rest') { + const Serializer = require('@ember-data/serializer/rest').default; + owner.register(`serializer:-rest`, Serializer); + serializer = owner.lookup(`serializer:-rest`); + deprecateTestRegistration('serializer', '-rest'); + } else if (serializerName === '-default') { + const Serializer = require('@ember-data/serializer/json').default; + owner.register(`serializer:-default`, Serializer); + serializer = owner.lookup(`serializer:-default`); + serializer && deprecateTestRegistration('serializer', '-default'); + } } - } - if (serializer !== undefined) { - set(serializer, 'store', this); - _serializerCache[normalizedModelName] = serializer; - _serializerCache[serializerName] = serializer; - return serializer; + if (serializer !== undefined) { + set(serializer, 'store', this); + _serializerCache[normalizedModelName] = serializer; + _serializerCache[serializerName] = serializer; + return serializer; + } } - // final fallback, no model specific serializer, no application serializer, no - // `serializer` property on store: use the convenience JSONSerializer - serializer = _serializerCache['-default'] || owner.lookup('serializer:-default'); - if (DEBUG && HAS_EMBER_DATA_PACKAGE && HAS_SERIALIZER_PACKAGE && serializer === undefined) { - const JSONSerializer = require('@ember-data/serializer/json').default; - owner.register('serializer:-default', JSONSerializer); - serializer = owner.lookup('serializer:-default'); - - serializer && deprecateTestRegistration('serializer', '-default'); - } + if (DEPRECATE_DEFAULT_SERIALIZER) { + // final fallback, no model specific serializer, no application serializer, no + // `serializer` property on store: use the convenience JSONSerializer + serializer = _serializerCache['-default'] || owner.lookup('serializer:-default'); + if (DEBUG && HAS_EMBER_DATA_PACKAGE && HAS_SERIALIZER_PACKAGE && serializer === undefined) { + const JSONSerializer = require('@ember-data/serializer/json').default; + owner.register('serializer:-default', JSONSerializer); + serializer = owner.lookup('serializer:-default'); - deprecate( - `store.serializerFor("${modelName}") resolved the "-default" serializer via the deprecated "-default" lookup fallback.\n\n\tPreviously, when no type-specific serializer, application serializer, or adapter.defaultSerializer had been defined by the app, the "-default" serializer would be used which defaulted to the \`JSONSerializer\`. This behavior is deprecated in favor of explicitly defining an application or type-specific serializer`, - !serializer, - { - id: 'ember-data:default-serializer', - until: '4.0', - url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data:default-serializers', + serializer && deprecateTestRegistration('serializer', '-default'); } - ); - assert( - `No serializer was found for '${modelName}' and no 'application' serializer was found as a fallback`, - serializer !== undefined - ); + deprecate( + `store.serializerFor("${modelName}") resolved the "-default" serializer via the deprecated "-default" lookup fallback.\n\n\tPreviously, when no type-specific serializer, application serializer, or adapter.defaultSerializer had been defined by the app, the "-default" serializer would be used which defaulted to the \`JSONSerializer\`. This behavior is deprecated in favor of explicitly defining an application or type-specific serializer`, + !serializer, + { + id: 'ember-data:default-serializer', + until: '4.0', + url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data:default-serializers', + } + ); + + assert( + `No serializer was found for '${modelName}' and no 'application' serializer was found as a fallback`, + serializer !== undefined + ); - set(serializer, 'store', this); - _serializerCache[normalizedModelName] = serializer; - _serializerCache['-default'] = serializer; + set(serializer, 'store', this); + _serializerCache[normalizedModelName] = serializer; + _serializerCache['-default'] = serializer; - return serializer; + return serializer; + } else { + assert( + `No serializer was found for '${modelName}' and no 'application' serializer was found as a fallback`, + serializer !== undefined + ); + } } willDestroy() { @@ -3518,30 +3536,32 @@ abstract class CoreStore extends Service { } } -defineProperty( - CoreStore.prototype, - 'defaultAdapter', - computed('adapter', function() { - deprecate( - `store.adapterFor(modelName) resolved the ("${this.adapter || - '-json-api'}") adapter via the deprecated \`store.defaultAdapter\` property.\n\n\tPreviously, applications could define the store's \`adapter\` property which would be used by \`defaultAdapter\` and \`adapterFor\` as a fallback for when an adapter was not found by an exact name match. This behavior is deprecated in favor of explicitly defining an application or type-specific adapter.`, - false, - { - id: 'ember-data:default-adapter', - until: '4.0', - url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data:default-adapter', - } - ); - let adapter = this.adapter || '-json-api'; +if (DEPRECATE_DEFAULT_ADAPTER) { + defineProperty( + CoreStore.prototype, + 'defaultAdapter', + computed('adapter', function() { + deprecate( + `store.adapterFor(modelName) resolved the ("${this.adapter || + '-json-api'}") adapter via the deprecated \`store.defaultAdapter\` property.\n\n\tPreviously, applications could define the store's \`adapter\` property which would be used by \`defaultAdapter\` and \`adapterFor\` as a fallback for when an adapter was not found by an exact name match. This behavior is deprecated in favor of explicitly defining an application or type-specific adapter.`, + false, + { + id: 'ember-data:default-adapter', + until: '4.0', + url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_ember-data:default-adapter', + } + ); + let adapter = this.adapter || '-json-api'; - assert( - 'You tried to set `adapter` property to an instance of `Adapter`, where it should be a name', - typeof adapter === 'string' - ); + assert( + 'You tried to set `adapter` property to an instance of `Adapter`, where it should be a name', + typeof adapter === 'string' + ); - return this.adapterFor(adapter); - }) -); + return this.adapterFor(adapter); + }) + ); +} export default CoreStore; diff --git a/packages/store/addon/-private/system/deprecated-evented.js b/packages/store/addon/-private/system/deprecated-evented.js index 157b7fc7580..99a45f9e5fd 100644 --- a/packages/store/addon/-private/system/deprecated-evented.js +++ b/packages/store/addon/-private/system/deprecated-evented.js @@ -1,3 +1,4 @@ +import { DEPRECATE_EVENTED_API_USAGE } from '@ember-data/private-build-infra/deprecations'; import Evented from '@ember/object/evented'; import Mixin from '@ember/object/mixin'; import { deprecate } from '@ember/debug'; @@ -77,4 +78,4 @@ if (DEBUG) { }); } -export default DEBUG ? DeprecatedEvented : Evented; +export default DEPRECATE_EVENTED_API_USAGE ? (DEBUG ? DeprecatedEvented : Evented) : {}; diff --git a/packages/store/addon/-private/system/record-arrays/adapter-populated-record-array.js b/packages/store/addon/-private/system/record-arrays/adapter-populated-record-array.js index af6f79d7c93..799c45f7936 100644 --- a/packages/store/addon/-private/system/record-arrays/adapter-populated-record-array.js +++ b/packages/store/addon/-private/system/record-arrays/adapter-populated-record-array.js @@ -4,6 +4,7 @@ import { get } from '@ember/object'; import { assign } from '@ember/polyfills'; import RecordArray from './record-array'; import { DEBUG } from '@glimmer/env'; +import { DEPRECATE_EVENTED_API_USAGE } from '@ember-data/private-build-infra/deprecations'; /** @module @ember-data/store @@ -93,10 +94,12 @@ export default RecordArray.extend({ this.manager._associateWithRecordArray(internalModels, this); - const _hasDidLoad = DEBUG ? this._has('didLoad') : this.has('didLoad'); - if (_hasDidLoad) { - // TODO: should triggering didLoad event be the last action of the runLoop? - once(this, 'trigger', 'didLoad'); + if (DEPRECATE_EVENTED_API_USAGE) { + const _hasDidLoad = DEBUG ? this._has('didLoad') : this.has('didLoad'); + if (_hasDidLoad) { + // TODO: should triggering didLoad event be the last action of the runLoop? + once(this, 'trigger', 'didLoad'); + } } }, }); diff --git a/packages/store/addon/-private/system/store/finders.js b/packages/store/addon/-private/system/store/finders.js index f5cb10d4e78..a1c1cc83bb4 100644 --- a/packages/store/addon/-private/system/store/finders.js +++ b/packages/store/addon/-private/system/store/finders.js @@ -2,7 +2,6 @@ import { A } from '@ember/array'; import { Promise } from 'rsvp'; import { assert, warn, deprecate } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; -import Ember from 'ember'; import coerceId from '../coerce-id'; import { _bind, _guard, _objectIsAlive, guardDestroyedStore } from './common'; @@ -169,20 +168,21 @@ function ensureRelationshipIsSetToParent(payload, parentInternalModel, store, pa typeof relationshipData !== 'undefined' && !relationshipDataPointsToParent(relationshipData, parentInternalModel) ) { - let quotedType = Ember.inspect(type); - let quotedInverse = Ember.inspect(inverseKey); - let expected = Ember.inspect({ + let inspect = function inspect(thing) { + return `'${JSON.stringify(thing)}'`; + }; + let quotedType = inspect(type); + let quotedInverse = inspect(inverseKey); + let expected = inspect({ id: parentInternalModel.id, type: parentInternalModel.modelName, }); - let expectedModel = Ember.inspect(parentInternalModel); - let got = Ember.inspect(relationshipData); + let expectedModel = `${parentInternalModel.modelName}:${parentInternalModel.id}`; + let got = inspect(relationshipData); let prefix = typeof index === 'number' ? `data[${index}]` : `data`; let path = `${prefix}.relationships.${inverseKey}.data`; let other = relationshipData ? `<${relationshipData.type}:${relationshipData.id}>` : null; - let relationshipFetched = `${Ember.inspect(parentInternalModel)}.${parentRelationship.kind}("${ - parentRelationship.name - }")`; + let relationshipFetched = `${expectedModel}.${parentRelationship.kind}("${parentRelationship.name}")`; let includedRecord = `<${type}:${id}>`; let message = [ `Encountered mismatched relationship: Ember Data expected ${path} in the payload from ${relationshipFetched} to include ${expected} but got ${got} instead.\n`,