From 4cbafa1e8c7103f76882f6f23e6637af68017ecd Mon Sep 17 00:00:00 2001 From: Igor Terzic Date: Sat, 11 Jan 2020 14:22:23 -0800 Subject: [PATCH 1/6] [BUGFIX] fix importing from @ember-data/store Dividing Record Data into packages (https://github.com/emberjs/data/pull/6513) configured the Store class inside of the `-ember-data` metapackage. This broke importing the Store directly from `@ember-data/store`, which this commit fixes. (cherry picked from commit 3e3677f6cfb3c8715697b302aed522d07926287f) --- packages/-ember-data/addon/store.ts | 22 +----- .../integration/store/package-import-test.js | 70 +++++++++++++++++++ .../addon/-private/system/ds-model-store.ts | 33 +++++++-- 3 files changed, 99 insertions(+), 26 deletions(-) create mode 100644 packages/-ember-data/tests/integration/store/package-import-test.js diff --git a/packages/-ember-data/addon/store.ts b/packages/-ember-data/addon/store.ts index 6cbddc5f7e8..fa482881caf 100644 --- a/packages/-ember-data/addon/store.ts +++ b/packages/-ember-data/addon/store.ts @@ -1,21 +1 @@ -import { IDENTIFIERS } from '@ember-data/canary-features'; -import { RecordData } from '@ember-data/record-data/-private'; -import Store from '@ember-data/store'; -import { identifierCacheFor } from '@ember-data/store/-private'; - -type RecordDataStoreWrapper = import('@ember-data/store/-private/ts-interfaces/record-data-store-wrapper').RecordDataStoreWrapper; - -export default class DefaultStore extends Store { - createRecordDataFor(modelName: string, id: string | null, clientId: string, storeWrapper: RecordDataStoreWrapper) { - if (IDENTIFIERS) { - let identifier = identifierCacheFor(this).getOrCreateRecordIdentifier({ - type: modelName, - id, - lid: clientId, - }); - return new RecordData(identifier, storeWrapper); - } else { - return new RecordData(modelName, id, clientId, storeWrapper); - } - } -} +export { default } from '@ember-data/store'; diff --git a/packages/-ember-data/tests/integration/store/package-import-test.js b/packages/-ember-data/tests/integration/store/package-import-test.js new file mode 100644 index 00000000000..5d664f9c8df --- /dev/null +++ b/packages/-ember-data/tests/integration/store/package-import-test.js @@ -0,0 +1,70 @@ +import { get } from '@ember/object'; +import { settled } from '@ember/test-helpers'; + +import { module, test } from 'qunit'; + +import { setupTest } from 'ember-qunit'; + +import Model, { attr } from '@ember-data/model'; +import Store from '@ember-data/store'; + +class Person extends Model { + @attr() + name; +} + +class CustomStore extends Store {} + +module('integration/store/package-import', function(hooks) { + setupTest(hooks); + + let store; + + hooks.beforeEach(function() { + let { owner } = this; + + owner.register('model:person', Person); + owner.unregister('service:store'); + owner.register('service:store', CustomStore); + store = owner.lookup('service:store'); + }); + + test('Store push works with an import from @ember-data/store', async function(assert) { + store.push({ + data: [ + { + type: 'person', + id: '1', + attributes: { + name: 'Scumbag Dale', + }, + }, + { + type: 'person', + id: '2', + attributes: { + name: 'Scumbag Katz', + }, + }, + ], + }); + + let all = store.peekAll('person'); + assert.equal(get(all, 'length'), 2); + + store.push({ + data: [ + { + type: 'person', + id: '3', + attributes: { + name: 'Scumbag Bryn', + }, + }, + ], + }); + + await settled(); + assert.equal(get(all, 'length'), 3); + }); +}); diff --git a/packages/store/addon/-private/system/ds-model-store.ts b/packages/store/addon/-private/system/ds-model-store.ts index 37a326b5bd3..737c07350a8 100644 --- a/packages/store/addon/-private/system/ds-model-store.ts +++ b/packages/store/addon/-private/system/ds-model-store.ts @@ -10,14 +10,20 @@ import { assign } from '@ember/polyfills'; import { isPresent } from '@ember/utils'; import { DEBUG } from '@glimmer/env'; -import { CUSTOM_MODEL_CLASS } from '@ember-data/canary-features'; +import { CUSTOM_MODEL_CLASS, IDENTIFIERS } from '@ember-data/canary-features'; +import { HAS_RECORD_DATA_PACKAGE } from '@ember-data/private-build-infra'; +import { identifierCacheFor } from '../identifiers/cache'; import CoreStore from './core-store'; import notifyChanges from './model/notify-changes'; import { getShimClass } from './model/shim-model-class'; import normalizeModelName from './normalize-model-name'; import { DSModelSchemaDefinitionService, getModelFactory } from './schema-definition-service'; +type RecordDataStoreWrapper = import('./store/record-data-store-wrapper').default; + +const RecordData = HAS_RECORD_DATA_PACKAGE ? require('@ember-data/record-data/-private').RecordData : null; + type RelationshipsSchema = import('../ts-interfaces/record-data-schemas').RelationshipsSchema; type SchemaDefinitionService = import('../ts-interfaces/schema-definition-service').SchemaDefinitionService; type RecordDataRecordWrapper = import('../ts-interfaces/record-data-record-wrapper').RecordDataRecordWrapper; @@ -136,14 +142,31 @@ class Store extends CoreStore { record.destroy(); } + createRecordDataFor(modelName: string, id: string | null, clientId: string, storeWrapper: RecordDataStoreWrapper) { + if (HAS_RECORD_DATA_PACKAGE) { + if (IDENTIFIERS) { + let identifier = identifierCacheFor(this).getOrCreateRecordIdentifier({ + type: modelName, + id, + lid: clientId, + }); + return new RecordData(identifier, storeWrapper); + } else { + return new RecordData(modelName, id, clientId, storeWrapper); + } + } else { + throw new Error(`Expected store.createRecordDataFor to be implemented but it wasn't`); + } + } + /** Returns the model class for the particular `modelName`. - + The class of a model might be useful if you want to get a list of all the relationship names of the model, see [`relationshipNames`](/ember-data/release/classes/Model?anchor=relationshipNames) for example. - + @method modelFor @param {String} modelName @return {Model} @@ -192,10 +215,10 @@ class Store extends CoreStore { This exists for legacy support for the RESTSerializer, which due to how it must guess whether a key is a model must query for whether a match exists. - + We should investigate an RFC to make this public or removing this requirement. - + @private */ _hasModelFor(modelName) { From 6e5420ed70230a82617158097e11a452572ca0ad Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Tue, 14 Jan 2020 14:18:26 -0800 Subject: [PATCH 2/6] bump all node version ranges (cherry picked from commit 98f41fdf1e4c315ab73eba71c7725d1adc845717) --- package.json | 2 +- packages/-ember-data/package.json | 2 +- packages/adapter/node-tests/fixtures/addon/package/package.json | 2 +- packages/adapter/node-tests/fixtures/app/package/package.json | 2 +- packages/adapter/package.json | 2 +- packages/canary-features/package.json | 2 +- packages/debug/package.json | 2 +- packages/model/node-tests/fixtures/addon/package/package.json | 2 +- packages/model/node-tests/fixtures/app/package/package.json | 2 +- packages/model/package.json | 2 +- packages/private-build-infra/package.json | 2 +- packages/record-data/package.json | 2 +- .../serializer/node-tests/fixtures/addon/package/package.json | 2 +- .../serializer/node-tests/fixtures/app/package/package.json | 2 +- packages/serializer/package.json | 2 +- packages/store/package.json | 2 +- .../unpublished-adapter-encapsulation-test-app/package.json | 2 +- packages/unpublished-debug-encapsulation-test-app/package.json | 2 +- packages/unpublished-fastboot-test-app/package.json | 2 +- packages/unpublished-model-encapsulation-test-app/package.json | 2 +- .../unpublished-record-data-encapsulation-test-app/package.json | 2 +- .../unpublished-relationship-performance-test-app/package.json | 2 +- .../unpublished-serializer-encapsulation-test-app/package.json | 2 +- packages/unpublished-test-infra/package.json | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 62fc52b1804..f6b640794d0 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,6 @@ }, "dependencies": {}, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" } } diff --git a/packages/-ember-data/package.json b/packages/-ember-data/package.json index 279f7324a2b..f921d2ef4e7 100644 --- a/packages/-ember-data/package.json +++ b/packages/-ember-data/package.json @@ -87,7 +87,7 @@ "typescript": "~3.7.3" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "keywords": [ "ember-addon" diff --git a/packages/adapter/node-tests/fixtures/addon/package/package.json b/packages/adapter/node-tests/fixtures/addon/package/package.json index 0615dbed241..f2d1379819c 100644 --- a/packages/adapter/node-tests/fixtures/addon/package/package.json +++ b/packages/adapter/node-tests/fixtures/addon/package/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "description": "Addon fixture package for ember-cli-blueprint-test-helpers", "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "devDependencies": { "ember-cli": "*", diff --git a/packages/adapter/node-tests/fixtures/app/package/package.json b/packages/adapter/node-tests/fixtures/app/package/package.json index 4ccdd391a71..489518c4199 100644 --- a/packages/adapter/node-tests/fixtures/app/package/package.json +++ b/packages/adapter/node-tests/fixtures/app/package/package.json @@ -4,7 +4,7 @@ "description": "App fixture package for ember-cli-blueprint-test-helpers", "private": true, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "devDependencies": { "ember-cli": "*", diff --git a/packages/adapter/package.json b/packages/adapter/package.json index aa3430b86ca..ec801ae772b 100644 --- a/packages/adapter/package.json +++ b/packages/adapter/package.json @@ -51,7 +51,7 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/packages/canary-features/package.json b/packages/canary-features/package.json index 7dce67aebe9..2e7e9c64490 100644 --- a/packages/canary-features/package.json +++ b/packages/canary-features/package.json @@ -39,6 +39,6 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" } } diff --git a/packages/debug/package.json b/packages/debug/package.json index bf57ce4a5c2..9eccbe7eb20 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -49,7 +49,7 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/packages/model/node-tests/fixtures/addon/package/package.json b/packages/model/node-tests/fixtures/addon/package/package.json index e6e50684368..f2d1379819c 100644 --- a/packages/model/node-tests/fixtures/addon/package/package.json +++ b/packages/model/node-tests/fixtures/addon/package/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "description": "Addon fixture package for ember-cli-blueprint-test-helpers", "engines": { - "node": ">= 0.10.0" + "node": "10.* || >= 12.*" }, "devDependencies": { "ember-cli": "*", diff --git a/packages/model/node-tests/fixtures/app/package/package.json b/packages/model/node-tests/fixtures/app/package/package.json index 768bc49c219..489518c4199 100644 --- a/packages/model/node-tests/fixtures/app/package/package.json +++ b/packages/model/node-tests/fixtures/app/package/package.json @@ -4,7 +4,7 @@ "description": "App fixture package for ember-cli-blueprint-test-helpers", "private": true, "engines": { - "node": ">= 0.10.0" + "node": "10.* || >= 12.*" }, "devDependencies": { "ember-cli": "*", diff --git a/packages/model/package.json b/packages/model/package.json index 8c12ff7289c..c0a0e22320c 100644 --- a/packages/model/package.json +++ b/packages/model/package.json @@ -56,7 +56,7 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/packages/private-build-infra/package.json b/packages/private-build-infra/package.json index 0b7d3ce15fd..8de0ae67ecf 100644 --- a/packages/private-build-infra/package.json +++ b/packages/private-build-infra/package.json @@ -42,6 +42,6 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" } } diff --git a/packages/record-data/package.json b/packages/record-data/package.json index e06a4e778ed..6c2166a7528 100644 --- a/packages/record-data/package.json +++ b/packages/record-data/package.json @@ -52,7 +52,7 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/packages/serializer/node-tests/fixtures/addon/package/package.json b/packages/serializer/node-tests/fixtures/addon/package/package.json index e6e50684368..f2d1379819c 100644 --- a/packages/serializer/node-tests/fixtures/addon/package/package.json +++ b/packages/serializer/node-tests/fixtures/addon/package/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "description": "Addon fixture package for ember-cli-blueprint-test-helpers", "engines": { - "node": ">= 0.10.0" + "node": "10.* || >= 12.*" }, "devDependencies": { "ember-cli": "*", diff --git a/packages/serializer/node-tests/fixtures/app/package/package.json b/packages/serializer/node-tests/fixtures/app/package/package.json index 768bc49c219..489518c4199 100644 --- a/packages/serializer/node-tests/fixtures/app/package/package.json +++ b/packages/serializer/node-tests/fixtures/app/package/package.json @@ -4,7 +4,7 @@ "description": "App fixture package for ember-cli-blueprint-test-helpers", "private": true, "engines": { - "node": ">= 0.10.0" + "node": "10.* || >= 12.*" }, "devDependencies": { "ember-cli": "*", diff --git a/packages/serializer/package.json b/packages/serializer/package.json index 60c89c33338..aa9b8b3d8be 100644 --- a/packages/serializer/package.json +++ b/packages/serializer/package.json @@ -51,7 +51,7 @@ "silent-error": "^1.1.1" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/packages/store/package.json b/packages/store/package.json index 249992f0e12..32b46af66e6 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -51,7 +51,7 @@ "loader.js": "^4.7.0" }, "engines": { - "node": ">= 8.0.0" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/packages/unpublished-adapter-encapsulation-test-app/package.json b/packages/unpublished-adapter-encapsulation-test-app/package.json index 3ee3ca1be45..cc325a6a53b 100644 --- a/packages/unpublished-adapter-encapsulation-test-app/package.json +++ b/packages/unpublished-adapter-encapsulation-test-app/package.json @@ -49,6 +49,6 @@ "qunit-dom": "^0.9.2" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-debug-encapsulation-test-app/package.json b/packages/unpublished-debug-encapsulation-test-app/package.json index 90713d5b84c..e910d7a9971 100644 --- a/packages/unpublished-debug-encapsulation-test-app/package.json +++ b/packages/unpublished-debug-encapsulation-test-app/package.json @@ -48,6 +48,6 @@ "qunit-dom": "^0.9.2" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-fastboot-test-app/package.json b/packages/unpublished-fastboot-test-app/package.json index d1ebf20a872..292c69edc51 100644 --- a/packages/unpublished-fastboot-test-app/package.json +++ b/packages/unpublished-fastboot-test-app/package.json @@ -62,6 +62,6 @@ "crypto" ], "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-model-encapsulation-test-app/package.json b/packages/unpublished-model-encapsulation-test-app/package.json index 2224b3653fb..f22ece5d610 100644 --- a/packages/unpublished-model-encapsulation-test-app/package.json +++ b/packages/unpublished-model-encapsulation-test-app/package.json @@ -48,6 +48,6 @@ "qunit-dom": "^0.9.2" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-record-data-encapsulation-test-app/package.json b/packages/unpublished-record-data-encapsulation-test-app/package.json index ef3dec78ac9..e8a4d9a482d 100644 --- a/packages/unpublished-record-data-encapsulation-test-app/package.json +++ b/packages/unpublished-record-data-encapsulation-test-app/package.json @@ -49,6 +49,6 @@ "qunit-dom": "^0.9.2" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-relationship-performance-test-app/package.json b/packages/unpublished-relationship-performance-test-app/package.json index ec9d212f6f5..424b07e704d 100644 --- a/packages/unpublished-relationship-performance-test-app/package.json +++ b/packages/unpublished-relationship-performance-test-app/package.json @@ -44,6 +44,6 @@ "qunit-dom": "^0.9.2" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-serializer-encapsulation-test-app/package.json b/packages/unpublished-serializer-encapsulation-test-app/package.json index ca0c50ac57a..926cc1c09fb 100644 --- a/packages/unpublished-serializer-encapsulation-test-app/package.json +++ b/packages/unpublished-serializer-encapsulation-test-app/package.json @@ -48,6 +48,6 @@ "qunit-dom": "^0.9.2" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" } } diff --git a/packages/unpublished-test-infra/package.json b/packages/unpublished-test-infra/package.json index b563416474e..023c8c497e4 100644 --- a/packages/unpublished-test-infra/package.json +++ b/packages/unpublished-test-infra/package.json @@ -46,7 +46,7 @@ "rsvp": "^4.8.5" }, "engines": { - "node": "8.* || >= 10.*" + "node": "10.* || >= 12.*" }, "ember-addon": { "configPath": "tests/dummy/config" From 0b0d648608203be270e653b2fe2d0c6f4ad1fdc3 Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Tue, 21 Jan 2020 12:45:27 -0800 Subject: [PATCH 3/6] fix lint issue ignore other dist output dirs too (cherry picked from commit 2a1c1e9adfa7ad5ac5bb168a19e9919b3ac89127) --- .eslintignore | 2 ++ .../app/routes/application.js | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.eslintignore b/.eslintignore index c4898bd218b..60d7a106f35 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,6 +4,8 @@ # compiled output **/dist/ +**/dist-control/ +**/dist-experiment/ **/tmp/ /packages/-ember-data/docs/ diff --git a/packages/unpublished-relationship-performance-test-app/app/routes/application.js b/packages/unpublished-relationship-performance-test-app/app/routes/application.js index 61a1464c668..6ee2987c9ef 100644 --- a/packages/unpublished-relationship-performance-test-app/app/routes/application.js +++ b/packages/unpublished-relationship-performance-test-app/app/routes/application.js @@ -20,8 +20,21 @@ export default Route.extend({ }); }, afterModel() { - if (document.location.href.indexOf('?tracerbench=true') !== -1) { - document.location.href = 'about:blank'; + if ( + document.location.href.indexOf('?tracing') !== -1 || + document.location.href.indexOf('?tracerbench=true') !== -1 + ) { + endTrace(); } }, }); + +function endTrace() { + // just before paint + requestAnimationFrame(() => { + // after paint + requestAnimationFrame(() => { + document.location.href = 'about:blank'; + }); + }); +} From 4091511191f750b64f77717d98bfc238cbcfd11c Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Tue, 21 Jan 2020 12:31:46 -0800 Subject: [PATCH 4/6] [FIX] RecordData is not a constructor (cherry picked from commit 46085de0476a99b03160caa76f0eb5f61efd62df) --- packages/-ember-data/addon/index.js | 3 +- .../ts-interfaces/relationship-record-data.ts | 9 +-- .../store/addon/-private/system/core-store.ts | 71 +++++++++++++------ .../addon/-private/system/ds-model-store.ts | 33 ++------- 4 files changed, 59 insertions(+), 57 deletions(-) diff --git a/packages/-ember-data/addon/index.js b/packages/-ember-data/addon/index.js index 8470d5dd321..4a913b4d2e9 100644 --- a/packages/-ember-data/addon/index.js +++ b/packages/-ember-data/addon/index.js @@ -26,7 +26,7 @@ import JSONSerializer from '@ember-data/serializer/json'; import JSONAPISerializer from '@ember-data/serializer/json-api'; import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest'; import Transform from '@ember-data/serializer/transform'; -import { normalizeModelName } from '@ember-data/store'; +import Store, { normalizeModelName } from '@ember-data/store'; import { AdapterPopulatedRecordArray, @@ -45,7 +45,6 @@ import { } from './-private'; import initializeStoreService from './initialize-store-service'; import setupContainer from './setup-container'; -import Store from './store'; if (VERSION.match(/^1\.([0-9]|1[0-2])\./)) { throw new EmberError( diff --git a/packages/record-data/addon/-private/ts-interfaces/relationship-record-data.ts b/packages/record-data/addon/-private/ts-interfaces/relationship-record-data.ts index 389dddfb38e..2afb4c0a9ef 100644 --- a/packages/record-data/addon/-private/ts-interfaces/relationship-record-data.ts +++ b/packages/record-data/addon/-private/ts-interfaces/relationship-record-data.ts @@ -1,9 +1,6 @@ -import { - CollectionResourceRelationship, - SingleResourceRelationship, -} from '@ember-data/store/-private/ts-interfaces/ember-data-json-api'; -import { RecordData } from '@ember-data/store/-private/ts-interfaces/record-data'; - +type SingleResourceRelationship = import('@ember-data/store/-private/ts-interfaces/ember-data-json-api').SingleResourceRelationship; +type CollectionResourceRelationship = import('@ember-data/store/-private/ts-interfaces/ember-data-json-api').CollectionResourceRelationship; +type RecordData = import('@ember-data/store/-private/ts-interfaces/record-data').RecordData; type ConfidentDict = import('@ember-data/store/-private/ts-interfaces/utils').ConfidentDict; type HasManyRelationship = import('../relationships/state/has-many').default; type BelongsToRelationship = import('../relationships/state/belongs-to').default; diff --git a/packages/store/addon/-private/system/core-store.ts b/packages/store/addon/-private/system/core-store.ts index d75d23da789..f1fef241282 100644 --- a/packages/store/addon/-private/system/core-store.ts +++ b/packages/store/addon/-private/system/core-store.ts @@ -29,6 +29,7 @@ import { HAS_ADAPTER_PACKAGE, HAS_EMBER_DATA_PACKAGE, HAS_MODEL_PACKAGE, + HAS_RECORD_DATA_PACKAGE, HAS_SERIALIZER_PACKAGE, } from '@ember-data/private-build-infra'; import { @@ -94,7 +95,9 @@ type AttributesSchema = import('../ts-interfaces/record-data-schemas').Attribute type SchemaDefinitionService = import('../ts-interfaces/schema-definition-service').SchemaDefinitionService; type PrivateSnapshot = import('./snapshot').PrivateSnapshot; type Relationship = import('@ember-data/record-data/-private').Relationship; +type RecordDataClass = typeof import('@ember-data/record-data/-private').RecordData; +let _RecordData: RecordDataClass | undefined; const emberRun = emberRunLoop.backburner; const { ENV } = Ember; @@ -412,14 +415,16 @@ abstract class CoreStore extends Service { if (REQUEST_SERVICE) { return this._fetchManager.requestCache; } - throw new Error('RequestService is not available unless the feature flag is on and running on a canary build'); + + assertInDebug('RequestService is not available unless the feature flag is on and running on a canary build', false); } get identifierCache(): IdentifierCache { - if (!IDENTIFIERS) { - throw new Error(`Store.identifierCache is unavailable in this build of EmberData`); + if (IDENTIFIERS) { + return identifierCacheFor(this); } - return identifierCacheFor(this); + + assertInDebug(`Store.identifierCache is unavailable in this build of EmberData`, false); } _instantiateRecord( @@ -475,9 +480,9 @@ abstract class CoreStore extends Service { setRecordIdentifier(record, identifier); //recordToInternalModelMap.set(record, internalModel); return record; - } else { - throw new Error('should not be here, custom model class ff error'); } + + assertInDebug('should not be here, custom model class ff error', false); } abstract instantiateRecord( @@ -517,9 +522,9 @@ abstract class CoreStore extends Service { getSchemaDefinitionService(): SchemaDefinitionService { if (CUSTOM_MODEL_CLASS) { return this._schemaDefinitionService; - } else { - throw new Error('need to enable CUSTOM_MODEL_CLASS feature flag in order to access SchemaDefinitionService'); } + + assertInDebug('need to enable CUSTOM_MODEL_CLASS feature flag in order to access SchemaDefinitionService', false); } // TODO Double check this return value is correct @@ -3060,9 +3065,9 @@ abstract class CoreStore extends Service { let internalModel = internalModelFactoryFor(this).peek(identifier); // TODO we used to check if the record was destroyed here return internalModel!.createSnapshot(options).serialize(options); - } else { - throw new Error('serializeRecord is only available when CUSTOM_MODEL_CLASS ff is on'); } + + assertInDebug('serializeRecord is only available when CUSTOM_MODEL_CLASS ff is on', false); } saveRecord(record: RecordInstance, options?: Dict): RSVP.Promise { @@ -3073,9 +3078,9 @@ abstract class CoreStore extends Service { // Casting can be removed once REQUEST_SERVICE ff is turned on // because a `Record` is provided there will always be a matching internalModel return (internalModel!.save(options) as RSVP.Promise).then(() => record); - } else { - throw new Error('saveRecord is only available when CUSTOM_MODEL_CLASS ff is on'); } + + assertInDebug('saveRecord is only available when CUSTOM_MODEL_CLASS ff is on', false); } relationshipReferenceFor(identifier: RecordIdentifier, key: string): BelongsToReference | HasManyReference { @@ -3084,9 +3089,9 @@ abstract class CoreStore extends Service { let internalModel = internalModelFactoryFor(this).peek(stableIdentifier); // TODO we used to check if the record was destroyed here return internalModel!.referenceFor(null, key); - } else { - throw new Error('relationshipReferenceFor is only available when CUSTOM_MODEL_CLASS ff is on'); } + + assertInDebug('relationshipReferenceFor is only available when CUSTOM_MODEL_CLASS ff is on', false); } /** @@ -3111,7 +3116,26 @@ abstract class CoreStore extends Service { clientId: string, storeWrapper: RecordDataStoreWrapper ): RecordData { - throw new Error(`Expected store.createRecordDataFor to be implemented but it wasn't`); + if (HAS_RECORD_DATA_PACKAGE) { + // we can't greedily use require as this causes + // a cycle we can't easily fix (or clearly pin point) at present. + if (_RecordData === undefined) { + _RecordData = require('@ember-data/record-data/-private').RecordData as RecordDataClass; + } + + if (IDENTIFIERS) { + let identifier = identifierCacheFor(this).getOrCreateRecordIdentifier({ + type: modelName, + id, + lid: clientId, + }); + return new _RecordData(identifier, storeWrapper); + } else { + return new _RecordData(modelName, id, clientId, storeWrapper); + } + } + + assertInDebug(`Expected store.createRecordDataFor to be implemented but it wasn't`, false); } /** @@ -3179,10 +3203,11 @@ abstract class CoreStore extends Service { } newClientId() { - if (IDENTIFIERS) { - throw new Error(`Private API Removed`); + if (!IDENTIFIERS) { + return globalClientIdCounter++; } - return globalClientIdCounter++; + + assertInDebug(`Private API Removed`, false); } // ............... @@ -3732,10 +3757,14 @@ function internalModelForRelatedResource( return store._internalModelForResource(identifier); } +function assertInDebug(msg: string, cond: boolean = false): asserts cond is true { + if (DEBUG && cond) { + throw new Error(msg); + } +} + function assertIdentifierHasId( identifier: StableRecordIdentifier ): asserts identifier is StableExistingRecordIdentifier { - if (DEBUG && identifier.id === null) { - throw new Error(`Attempted to schedule a fetch for a record without an id.`); - } + assertInDebug(`Attempted to schedule a fetch for a record without an id.`, identifier.id === null); } diff --git a/packages/store/addon/-private/system/ds-model-store.ts b/packages/store/addon/-private/system/ds-model-store.ts index 737c07350a8..37a326b5bd3 100644 --- a/packages/store/addon/-private/system/ds-model-store.ts +++ b/packages/store/addon/-private/system/ds-model-store.ts @@ -10,20 +10,14 @@ import { assign } from '@ember/polyfills'; import { isPresent } from '@ember/utils'; import { DEBUG } from '@glimmer/env'; -import { CUSTOM_MODEL_CLASS, IDENTIFIERS } from '@ember-data/canary-features'; -import { HAS_RECORD_DATA_PACKAGE } from '@ember-data/private-build-infra'; +import { CUSTOM_MODEL_CLASS } from '@ember-data/canary-features'; -import { identifierCacheFor } from '../identifiers/cache'; import CoreStore from './core-store'; import notifyChanges from './model/notify-changes'; import { getShimClass } from './model/shim-model-class'; import normalizeModelName from './normalize-model-name'; import { DSModelSchemaDefinitionService, getModelFactory } from './schema-definition-service'; -type RecordDataStoreWrapper = import('./store/record-data-store-wrapper').default; - -const RecordData = HAS_RECORD_DATA_PACKAGE ? require('@ember-data/record-data/-private').RecordData : null; - type RelationshipsSchema = import('../ts-interfaces/record-data-schemas').RelationshipsSchema; type SchemaDefinitionService = import('../ts-interfaces/schema-definition-service').SchemaDefinitionService; type RecordDataRecordWrapper = import('../ts-interfaces/record-data-record-wrapper').RecordDataRecordWrapper; @@ -142,31 +136,14 @@ class Store extends CoreStore { record.destroy(); } - createRecordDataFor(modelName: string, id: string | null, clientId: string, storeWrapper: RecordDataStoreWrapper) { - if (HAS_RECORD_DATA_PACKAGE) { - if (IDENTIFIERS) { - let identifier = identifierCacheFor(this).getOrCreateRecordIdentifier({ - type: modelName, - id, - lid: clientId, - }); - return new RecordData(identifier, storeWrapper); - } else { - return new RecordData(modelName, id, clientId, storeWrapper); - } - } else { - throw new Error(`Expected store.createRecordDataFor to be implemented but it wasn't`); - } - } - /** Returns the model class for the particular `modelName`. - + The class of a model might be useful if you want to get a list of all the relationship names of the model, see [`relationshipNames`](/ember-data/release/classes/Model?anchor=relationshipNames) for example. - + @method modelFor @param {String} modelName @return {Model} @@ -215,10 +192,10 @@ class Store extends CoreStore { This exists for legacy support for the RESTSerializer, which due to how it must guess whether a key is a model must query for whether a match exists. - + We should investigate an RFC to make this public or removing this requirement. - + @private */ _hasModelFor(modelName) { From 3cfd0551324183ce825e5daaf51d67551d69165a Mon Sep 17 00:00:00 2001 From: Chris Thoburn Date: Wed, 22 Jan 2020 10:53:49 -0800 Subject: [PATCH 5/6] Update packages/store/addon/-private/system/core-store.ts Co-Authored-By: David J. Hamilton (cherry picked from commit f95c2ba0c412ce219f24b796ebb687a9fd64af94) --- packages/store/addon/-private/system/core-store.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/store/addon/-private/system/core-store.ts b/packages/store/addon/-private/system/core-store.ts index f1fef241282..bba4268a5bc 100644 --- a/packages/store/addon/-private/system/core-store.ts +++ b/packages/store/addon/-private/system/core-store.ts @@ -3119,6 +3119,9 @@ abstract class CoreStore extends Service { if (HAS_RECORD_DATA_PACKAGE) { // we can't greedily use require as this causes // a cycle we can't easily fix (or clearly pin point) at present. + // + // it can be reproduced in partner tests by running + // node ./bin/packages-for-commit.js && yarn test-external:ember-observer if (_RecordData === undefined) { _RecordData = require('@ember-data/record-data/-private').RecordData as RecordDataClass; } From e2d33ea0d65f1e7e419388856554e3df323d8216 Mon Sep 17 00:00:00 2001 From: "David J. Hamilton" Date: Thu, 23 Jan 2020 17:13:49 -0800 Subject: [PATCH 6/6] Disable known failure for 3.16.x Test is automatically re-enabled for 3.17.x. We can re-enable it once the upstream failure (glimmerjs/glimmer-vm#1010) is resolved and into ember-source. (cherry picked from commit 10ad35fa55acebdb9f64175c0d3bbcfdf8e97bf5) --- .../relationships/one-to-many-test.js | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/packages/-ember-data/tests/integration/relationships/one-to-many-test.js b/packages/-ember-data/tests/integration/relationships/one-to-many-test.js index 254947440af..92d0ab9f134 100644 --- a/packages/-ember-data/tests/integration/relationships/one-to-many-test.js +++ b/packages/-ember-data/tests/integration/relationships/one-to-many-test.js @@ -4,11 +4,13 @@ import { run } from '@ember/runloop'; import { module, test } from 'qunit'; import { resolve } from 'rsvp'; +import { gte } from 'ember-compatibility-helpers'; import { setupTest } from 'ember-qunit'; import Adapter from '@ember-data/adapter'; import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; import JSONAPISerializer from '@ember-data/serializer/json-api'; +import todo from '@ember-data/unpublished-test-infra/test-support/todo'; module('integration/relationships/one_to_many_test - OneToMany relationships', function(hooks) { setupTest(hooks); @@ -1566,39 +1568,51 @@ module('integration/relationships/one_to_many_test - OneToMany relationships', f assert.equal(account.get('user'), null, 'Account does not have the user anymore'); }); - test('createRecord updates inverse record array which has observers', function(assert) { - let store = this.owner.lookup('service:store'); - let adapter = store.adapterFor('application'); - - adapter.findAll = () => { - return { - data: [ - { - id: '2', - type: 'user', - attributes: { - name: 'Stanley', + // This is the check we actually want, but compatibility-helpers doesn't give correct results for pre-release tags + // see https://github.com/pzuraq/ember-compatibility-helpers/pull/41 + // if ((gte('3.16.0') && !gte('3.17.0')) /* 3.16.x */ || (gte('3.17.99') && !gte('3.18.0')) /* 3.18.0-canary */) { + // + if (gte('3.16.0')) { + // known failure in 3.16.x due to upstream glimmer VM issue + // https://github.com/glimmerjs/glimmer-vm/pull/1010 + todo('createRecord updates inverse record array which has observers', function(assert) { + assert.todo.ok(false, 'known failure in ember-source@^3.16.0'); + }); + } else { + test('createRecord updates inverse record array which has observers', function(assert) { + let store = this.owner.lookup('service:store'); + let adapter = store.adapterFor('application'); + + adapter.findAll = () => { + return { + data: [ + { + id: '2', + type: 'user', + attributes: { + name: 'Stanley', + }, }, - }, - ], + ], + }; }; - }; - return store.findAll('user').then(users => { - assert.equal(users.get('length'), 1, 'Exactly 1 user'); + return store.findAll('user').then(users => { + assert.equal(users.get('length'), 1, 'Exactly 1 user'); - let user = users.get('firstObject'); - assert.equal(user.get('messages.length'), 0, 'Record array is initially empty'); + let user = users.get('firstObject'); + assert.equal(user.get('messages.length'), 0, 'Record array is initially empty'); - // set up an observer - user.addObserver('messages.@each.title', () => {}); - user.get('messages.firstObject'); + // set up an observer + user.addObserver('messages.@each.title', () => {}); + user.get('messages.firstObject'); - let message = store.createRecord('message', { user, title: 'EmberFest was great' }); - assert.equal(user.get('messages.length'), 1, 'The message is added to the record array'); + let message = store.createRecord('message', { user, title: 'EmberFest was great' }); + assert.equal(user.get('messages.length'), 1, 'The message is added to the record array'); - let messageFromArray = user.get('messages.firstObject'); - assert.ok(message === messageFromArray, 'Only one message record instance should be created'); + let messageFromArray = user.get('messages.firstObject'); + assert.ok(message === messageFromArray, 'Only one message record instance should be created'); + }); }); - }); + } });