@ember-data/model 4.1.0-alpha.9 → 4.2.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/addon/-private/attr.js
CHANGED
|
@@ -2,7 +2,6 @@ import { assert } from '@ember/debug';
|
|
|
2
2
|
import { computed } from '@ember/object';
|
|
3
3
|
import { DEBUG } from '@glimmer/env';
|
|
4
4
|
|
|
5
|
-
import { RECORD_DATA_ERRORS } from '@ember-data/canary-features';
|
|
6
5
|
import { recordDataFor } from '@ember-data/store/-private';
|
|
7
6
|
|
|
8
7
|
import { computedMacroWithOptionalParams } from './util';
|
|
@@ -151,15 +150,13 @@ function attr(type, options) {
|
|
|
151
150
|
);
|
|
152
151
|
}
|
|
153
152
|
}
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.___recordState.cleanErrorRequests();
|
|
162
|
-
}
|
|
153
|
+
if (!this.isValid) {
|
|
154
|
+
let oldValue = this._internalModel._recordData.getAttr(key);
|
|
155
|
+
if (oldValue !== value) {
|
|
156
|
+
const { errors } = this;
|
|
157
|
+
if (errors.get(key)) {
|
|
158
|
+
errors.remove(key);
|
|
159
|
+
this.___recordState.cleanErrorRequests();
|
|
163
160
|
}
|
|
164
161
|
}
|
|
165
162
|
}
|
|
@@ -24,17 +24,17 @@ import { computedMacroWithOptionalParams } from './util';
|
|
|
24
24
|
|
|
25
25
|
```app/models/post.js
|
|
26
26
|
import Model, { hasMany } from '@ember-data/model';
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
export default class PostModel extends Model {
|
|
29
|
-
@hasMany('comment') comments;
|
|
29
|
+
@hasMany('comment') comments;
|
|
30
30
|
}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
```app/models/comment.js
|
|
34
34
|
import Model, { belongsTo } from '@ember-data/model';
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
export default class CommentModel extends Model {
|
|
37
|
-
@belongsTo('post') post;
|
|
37
|
+
@belongsTo('post') post;
|
|
38
38
|
}
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -54,7 +54,7 @@ import { computedMacroWithOptionalParams } from './util';
|
|
|
54
54
|
import Model, { hasMany } from '@ember-data/model';
|
|
55
55
|
|
|
56
56
|
export default class TagModel extends Model {
|
|
57
|
-
@hasMany('post') posts;
|
|
57
|
+
@hasMany('post') posts;
|
|
58
58
|
}
|
|
59
59
|
```
|
|
60
60
|
|
package/addon/-private/model.js
CHANGED
|
@@ -12,11 +12,9 @@ import { DEBUG } from '@glimmer/env';
|
|
|
12
12
|
import { tracked } from '@glimmer/tracking';
|
|
13
13
|
import Ember from 'ember';
|
|
14
14
|
|
|
15
|
-
import { CUSTOM_MODEL_CLASS, RECORD_DATA_ERRORS, REQUEST_SERVICE } from '@ember-data/canary-features';
|
|
16
15
|
import { HAS_DEBUG_PACKAGE } from '@ember-data/private-build-infra';
|
|
17
16
|
import {
|
|
18
17
|
DEPRECATE_EVENTED_API_USAGE,
|
|
19
|
-
DEPRECATE_MODEL_TOJSON,
|
|
20
18
|
DEPRECATE_RECORD_LIFECYCLE_EVENT_METHODS,
|
|
21
19
|
} from '@ember-data/private-build-infra/deprecations';
|
|
22
20
|
import {
|
|
@@ -34,15 +32,6 @@ import { relationshipFromMeta } from './system/relationships/relationship-meta';
|
|
|
34
32
|
|
|
35
33
|
const { changeProperties } = Ember;
|
|
36
34
|
|
|
37
|
-
/*
|
|
38
|
-
In the non-CUSTOM_MODEL_CLASS world things decorated with flagToggledDecorator
|
|
39
|
-
have logic that requires a cache and caching key (which tagged provides), but
|
|
40
|
-
in the CUSTOM_MODEL_CLASS branch it only requires dependentKeyCompat which
|
|
41
|
-
ensures computeds/observers on the field will fire when anything it accesses
|
|
42
|
-
that is tracked changes
|
|
43
|
-
*/
|
|
44
|
-
const flagToggledDecorator = CUSTOM_MODEL_CLASS ? dependentKeyCompat : tagged;
|
|
45
|
-
|
|
46
35
|
function findPossibleInverses(type, inverseType, name, relationshipsSoFar) {
|
|
47
36
|
let possibleRelationships = relationshipsSoFar || [];
|
|
48
37
|
|
|
@@ -119,8 +108,10 @@ function computeOnce(target, key, desc) {
|
|
|
119
108
|
@uses DeprecatedEvented
|
|
120
109
|
*/
|
|
121
110
|
class Model extends EmberObject {
|
|
122
|
-
init(
|
|
123
|
-
|
|
111
|
+
init(options = {}) {
|
|
112
|
+
const createProps = options._createProps;
|
|
113
|
+
delete options._createProps;
|
|
114
|
+
super.init(options);
|
|
124
115
|
|
|
125
116
|
if (DEBUG) {
|
|
126
117
|
if (!this._internalModel) {
|
|
@@ -130,9 +121,8 @@ class Model extends EmberObject {
|
|
|
130
121
|
}
|
|
131
122
|
}
|
|
132
123
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
124
|
+
this.___recordState = new RecordState(this);
|
|
125
|
+
this.setProperties(createProps);
|
|
136
126
|
}
|
|
137
127
|
|
|
138
128
|
/**
|
|
@@ -387,21 +377,13 @@ class Model extends EmberObject {
|
|
|
387
377
|
@type {Boolean}
|
|
388
378
|
@readOnly
|
|
389
379
|
*/
|
|
390
|
-
@
|
|
380
|
+
@dependentKeyCompat
|
|
391
381
|
get isError() {
|
|
392
|
-
|
|
393
|
-
return this.currentState.isError;
|
|
394
|
-
}
|
|
395
|
-
let tag = peekTag(this, 'isError');
|
|
396
|
-
tag.value = tag.value || false;
|
|
397
|
-
return tag.value;
|
|
382
|
+
return this.currentState.isError;
|
|
398
383
|
}
|
|
399
384
|
set isError(v) {
|
|
400
|
-
if (
|
|
401
|
-
throw new Error(`isError is not directly settable
|
|
402
|
-
} else {
|
|
403
|
-
let tag = peekTag(this, 'isError');
|
|
404
|
-
tag.value = v;
|
|
385
|
+
if (DEBUG) {
|
|
386
|
+
throw new Error(`isError is not directly settable`);
|
|
405
387
|
}
|
|
406
388
|
}
|
|
407
389
|
|
|
@@ -470,19 +452,10 @@ class Model extends EmberObject {
|
|
|
470
452
|
*/
|
|
471
453
|
@tagged
|
|
472
454
|
get currentState() {
|
|
473
|
-
|
|
474
|
-
return this.___recordState;
|
|
475
|
-
}
|
|
476
|
-
if (this.isDestroyed || this.isDestroying) {
|
|
477
|
-
return this._internalModel._previousState;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
return this._internalModel && this._internalModel.currentState;
|
|
455
|
+
return this.___recordState;
|
|
481
456
|
}
|
|
482
|
-
set currentState(
|
|
483
|
-
|
|
484
|
-
this.notifyPropertyChange('currentState');
|
|
485
|
-
}
|
|
457
|
+
set currentState(_v) {
|
|
458
|
+
throw new Error('cannot set currentState');
|
|
486
459
|
}
|
|
487
460
|
|
|
488
461
|
/**
|
|
@@ -562,21 +535,19 @@ class Model extends EmberObject {
|
|
|
562
535
|
this._internalModel.send('becameValid');
|
|
563
536
|
}
|
|
564
537
|
);
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
errors._add(errorKeys[i], errorsHash[errorKeys[i]]);
|
|
579
|
-
}
|
|
538
|
+
// TODO we should unify how errors gets populated
|
|
539
|
+
// with the code managing the update. Probably a
|
|
540
|
+
// lazy flush similar to retrieveLatest in ManyArray
|
|
541
|
+
let recordData = recordDataFor(this);
|
|
542
|
+
let jsonApiErrors;
|
|
543
|
+
if (recordData.getErrors) {
|
|
544
|
+
jsonApiErrors = recordData.getErrors();
|
|
545
|
+
if (jsonApiErrors) {
|
|
546
|
+
let errorsHash = errorsArrayToHash(jsonApiErrors);
|
|
547
|
+
let errorKeys = Object.keys(errorsHash);
|
|
548
|
+
|
|
549
|
+
for (let i = 0; i < errorKeys.length; i++) {
|
|
550
|
+
errors._add(errorKeys[i], errorsHash[errorKeys[i]]);
|
|
580
551
|
}
|
|
581
552
|
}
|
|
582
553
|
}
|
|
@@ -591,22 +562,12 @@ class Model extends EmberObject {
|
|
|
591
562
|
@public
|
|
592
563
|
@type {AdapterError}
|
|
593
564
|
*/
|
|
594
|
-
@
|
|
565
|
+
@dependentKeyCompat
|
|
595
566
|
get adapterError() {
|
|
596
|
-
|
|
597
|
-
return this.currentState.adapterError;
|
|
598
|
-
}
|
|
599
|
-
let tag = peekTag(this, 'adapterError');
|
|
600
|
-
tag.value = tag.value || null;
|
|
601
|
-
return tag.value;
|
|
567
|
+
return this.currentState.adapterError;
|
|
602
568
|
}
|
|
603
569
|
set adapterError(v) {
|
|
604
|
-
|
|
605
|
-
throw new Error(`adapterError is not directly settable when REQUEST_SERVICE is enabled`);
|
|
606
|
-
} else {
|
|
607
|
-
let tag = peekTag(this, 'adapterError');
|
|
608
|
-
tag.value = v;
|
|
609
|
-
}
|
|
570
|
+
throw new Error(`adapterError is not directly settable`);
|
|
610
571
|
}
|
|
611
572
|
|
|
612
573
|
/**
|
|
@@ -764,11 +725,7 @@ class Model extends EmberObject {
|
|
|
764
725
|
@public
|
|
765
726
|
*/
|
|
766
727
|
deleteRecord() {
|
|
767
|
-
|
|
768
|
-
this.store.deleteRecord(this);
|
|
769
|
-
} else {
|
|
770
|
-
this._internalModel.deleteRecord();
|
|
771
|
-
}
|
|
728
|
+
this.store.deleteRecord(this);
|
|
772
729
|
}
|
|
773
730
|
|
|
774
731
|
/**
|
|
@@ -837,11 +794,7 @@ class Model extends EmberObject {
|
|
|
837
794
|
if (this.isDestroyed) {
|
|
838
795
|
return;
|
|
839
796
|
}
|
|
840
|
-
|
|
841
|
-
this.store.unloadRecord(this);
|
|
842
|
-
} else {
|
|
843
|
-
this._internalModel.unloadRecord();
|
|
844
|
-
}
|
|
797
|
+
this.store.unloadRecord(this);
|
|
845
798
|
}
|
|
846
799
|
|
|
847
800
|
/**
|
|
@@ -931,9 +884,7 @@ class Model extends EmberObject {
|
|
|
931
884
|
*/
|
|
932
885
|
rollbackAttributes() {
|
|
933
886
|
this._internalModel.rollbackAttributes();
|
|
934
|
-
|
|
935
|
-
this.currentState.cleanErrorRequests();
|
|
936
|
-
}
|
|
887
|
+
this.currentState.cleanErrorRequests();
|
|
937
888
|
}
|
|
938
889
|
|
|
939
890
|
/**
|
|
@@ -2076,6 +2027,7 @@ class Model extends EmberObject {
|
|
|
2076
2027
|
// the values initialized during create to `setUnknownProperty`
|
|
2077
2028
|
Model.prototype._internalModel = null;
|
|
2078
2029
|
Model.prototype.store = null;
|
|
2030
|
+
Model.prototype._createProps = null;
|
|
2079
2031
|
|
|
2080
2032
|
if (HAS_DEBUG_PACKAGE) {
|
|
2081
2033
|
/**
|
|
@@ -2173,47 +2125,6 @@ if (DEPRECATE_EVENTED_API_USAGE) {
|
|
|
2173
2125
|
});
|
|
2174
2126
|
}
|
|
2175
2127
|
|
|
2176
|
-
if (DEPRECATE_MODEL_TOJSON) {
|
|
2177
|
-
/**
|
|
2178
|
-
Use [JSONSerializer](JSONSerializer.html) to
|
|
2179
|
-
get the JSON representation of a record.
|
|
2180
|
-
|
|
2181
|
-
`toJSON` takes an optional hash as a parameter, currently
|
|
2182
|
-
supported options are:
|
|
2183
|
-
|
|
2184
|
-
- `includeId`: `true` if the record's ID should be included in the
|
|
2185
|
-
JSON representation.
|
|
2186
|
-
|
|
2187
|
-
@method toJSON
|
|
2188
|
-
@public
|
|
2189
|
-
@param {Object} options
|
|
2190
|
-
@return {Object} A JSON representation of the object.
|
|
2191
|
-
*/
|
|
2192
|
-
Model.reopen({
|
|
2193
|
-
toJSON(options) {
|
|
2194
|
-
// container is for lazy transform lookups
|
|
2195
|
-
deprecate(
|
|
2196
|
-
`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.`,
|
|
2197
|
-
false,
|
|
2198
|
-
{
|
|
2199
|
-
id: 'ember-data:model.toJSON',
|
|
2200
|
-
until: '4.0',
|
|
2201
|
-
url: 'https://deprecations.emberjs.com/ember-data/v3.x#toc_record-toJSON',
|
|
2202
|
-
for: '@ember-data/model',
|
|
2203
|
-
since: {
|
|
2204
|
-
available: '3.15',
|
|
2205
|
-
enabled: '3.15',
|
|
2206
|
-
},
|
|
2207
|
-
}
|
|
2208
|
-
);
|
|
2209
|
-
let serializer = this._internalModel.store.serializerFor('-default');
|
|
2210
|
-
let snapshot = this._internalModel.createSnapshot();
|
|
2211
|
-
|
|
2212
|
-
return serializer.serialize(snapshot, options);
|
|
2213
|
-
},
|
|
2214
|
-
});
|
|
2215
|
-
}
|
|
2216
|
-
|
|
2217
2128
|
if (DEBUG) {
|
|
2218
2129
|
let lookupDescriptor = function lookupDescriptor(obj, keyName) {
|
|
2219
2130
|
let current = obj;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import ArrayMixin from '@ember/array';
|
|
1
2
|
import { assert } from '@ember/debug';
|
|
2
3
|
import { dependentKeyCompat } from '@ember/object/compat';
|
|
3
4
|
import { tracked } from '@glimmer/tracking';
|
|
@@ -16,7 +17,7 @@ import { DEPRECATE_EVENTED_API_USAGE } from '@ember-data/private-build-infra/dep
|
|
|
16
17
|
|
|
17
18
|
A PromiseManyArray is an array-like proxy that also proxies certain method calls
|
|
18
19
|
to the underlying ManyArray in addition to being "promisified".
|
|
19
|
-
|
|
20
|
+
|
|
20
21
|
Right now we proxy:
|
|
21
22
|
|
|
22
23
|
* `reload()`
|
|
@@ -41,6 +42,14 @@ export default class PromiseManyArray {
|
|
|
41
42
|
this._update(promise, content);
|
|
42
43
|
this.isDestroyed = false;
|
|
43
44
|
this.isDestroying = false;
|
|
45
|
+
|
|
46
|
+
const meta = Ember.meta(this);
|
|
47
|
+
meta.hasMixin = (mixin: Object) => {
|
|
48
|
+
if (mixin === ArrayMixin) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
};
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
//---- Methods/Properties on ArrayProxy that we will keep as our API
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ember-data/model",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0-alpha.2",
|
|
4
4
|
"description": "The default blueprint for ember-cli addons.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ember-addon"
|
|
@@ -18,11 +18,12 @@
|
|
|
18
18
|
"test:node": "mocha"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@ember-data/canary-features": "4.
|
|
22
|
-
"@ember-data/private-build-infra": "4.
|
|
23
|
-
"@ember-data/store": "4.
|
|
21
|
+
"@ember-data/canary-features": "4.2.0-alpha.2",
|
|
22
|
+
"@ember-data/private-build-infra": "4.2.0-alpha.2",
|
|
23
|
+
"@ember-data/store": "4.2.0-alpha.2",
|
|
24
24
|
"@ember/edition-utils": "^1.2.0",
|
|
25
25
|
"@ember/string": "^3.0.0",
|
|
26
|
+
"ember-auto-import": "^2.2.4",
|
|
26
27
|
"ember-cached-decorator-polyfill": "^0.1.4",
|
|
27
28
|
"ember-cli-babel": "^7.26.6",
|
|
28
29
|
"ember-cli-string-utils": "^1.1.0",
|
|
@@ -32,25 +33,24 @@
|
|
|
32
33
|
"inflection": "~1.13.1"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
|
-
"@ember-data/unpublished-test-infra": "4.
|
|
36
|
+
"@ember-data/unpublished-test-infra": "4.2.0-alpha.2",
|
|
36
37
|
"@ember/optional-features": "^2.0.0",
|
|
37
|
-
"@ember/test-helpers": "^2.
|
|
38
|
+
"@ember/test-helpers": "^2.6.0",
|
|
38
39
|
"broccoli-asset-rev": "^3.0.0",
|
|
39
|
-
"ember-
|
|
40
|
-
"ember-cli": "~3.26.1",
|
|
40
|
+
"ember-cli": "~4.0.1",
|
|
41
41
|
"ember-cli-blueprint-test-helpers": "^0.19.1",
|
|
42
42
|
"ember-cli-dependency-checker": "^3.2.0",
|
|
43
|
-
"ember-cli-htmlbars": "^
|
|
43
|
+
"ember-cli-htmlbars": "^6.0.1",
|
|
44
44
|
"ember-cli-inject-live-reload": "^2.0.2",
|
|
45
45
|
"ember-cli-sri": "^2.1.1",
|
|
46
46
|
"ember-cli-terser": "~4.0.1",
|
|
47
47
|
"ember-disable-prototype-extensions": "^1.1.3",
|
|
48
48
|
"ember-export-application-global": "^2.0.1",
|
|
49
49
|
"ember-load-initializers": "^2.1.1",
|
|
50
|
-
"ember-maybe-import-regenerator": "^0.
|
|
51
|
-
"ember-qunit": "^5.1.
|
|
52
|
-
"ember-resolver": "^8.0.
|
|
53
|
-
"ember-source": "~
|
|
50
|
+
"ember-maybe-import-regenerator": "^1.0.0",
|
|
51
|
+
"ember-qunit": "^5.1.5",
|
|
52
|
+
"ember-resolver": "^8.0.3",
|
|
53
|
+
"ember-source": "~4.0.0",
|
|
54
54
|
"ember-source-channel-url": "^3.0.0",
|
|
55
55
|
"ember-try": "^1.4.0",
|
|
56
56
|
"loader.js": "^4.7.0",
|