Skip to content

Commit 2e7243c

Browse files
committed
Merge branch 'master' into transformJsonapiAttrs
2 parents f8065f8 + 61b77fb commit 2e7243c

25 files changed

+6838
-202
lines changed

.eslintrc.js

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
module.exports = {
2-
globals: {
3-
server: true,
4-
},
52
root: true,
63
parserOptions: {
74
ecmaVersion: 2017,
85
sourceType: 'module'
96
},
10-
plugins: [
11-
'ember'
12-
],
137
extends: [
148
'eslint:recommended',
159
'plugin:ember/recommended'
@@ -19,24 +13,7 @@ module.exports = {
1913
},
2014
rules: {
2115
},
22-
overrides: [
23-
// node files
24-
{
25-
files: [
26-
'ember-cli-build.js',
27-
'testem.js',
28-
'blueprints/*/index.js',
29-
'config/**/*.js',
30-
'lib/*/index.js'
31-
],
32-
parserOptions: {
33-
sourceType: 'script',
34-
ecmaVersion: 2015
35-
},
36-
env: {
37-
browser: false,
38-
node: true
39-
}
40-
}
41-
]
16+
globals: {
17+
module: true
18+
}
4219
};

.jshintrc

Lines changed: 0 additions & 33 deletions
This file was deleted.

addon/mixins/model.js

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import Ember from 'ember';
1+
import Mixin from '@ember/object/mixin';
2+
import { computed } from '@ember/object';
3+
import EmberObject from '@ember/object';
4+
import { A } from '@ember/array';
5+
import { defineProperty } from '@ember/object';
6+
import { guidFor } from '@ember/object/internals';
27

38
const resetRelations = function(record) {
49
Object.keys(record.get('__recordsJustSaved')).forEach((relationName) => {
@@ -23,17 +28,17 @@ const defaultOptions = function(options) {
2328
}
2429
};
2530

26-
export default Ember.Mixin.create({
27-
hasDirtyAttributes: Ember.computed('currentState.isDirty', 'markedForDestruction', 'markedForDeletion', function() {
31+
export default Mixin.create({
32+
hasDirtyAttributes: computed('currentState.isDirty', 'markedForDestruction', 'markedForDeletion', '_manyToOneDeleted.[]', function() {
2833
let original = this._super(...arguments);
29-
return original || this.get('markedForDestruction') || this.get('markedForDeletion');
34+
return original || this.get('markedForDestruction') || this.get('markedForDeletion') || this.get('_manyToOneDeleted.length') > 0;
3035
}),
3136

32-
markedForDeletion: Ember.computed('_markedForDeletion', function() {
37+
markedForDeletion: computed('_markedForDeletion', function() {
3338
return this.get('_markedForDeletion') || false;
3439
}),
3540

36-
markedForDestruction: Ember.computed('_markedForDestruction', function() {
41+
markedForDestruction: computed('_markedForDestruction', function() {
3742
return this.get('_markedForDestruction') || false;
3843
}),
3944

@@ -53,18 +58,39 @@ export default Ember.Mixin.create({
5358
this.set('_markedForDestruction', false);
5459
},
5560

61+
markManyToOneDeletion(relation) {
62+
let deletedRelations = this.get('_manyToOneDeleted');
63+
64+
if (!deletedRelations) {
65+
this.set('_manyToOneDeleted', A());
66+
deletedRelations = this.get('_manyToOneDeleted');
67+
}
68+
69+
if (!deletedRelations.includes(relation)) {
70+
deletedRelations.pushObject(relation);
71+
}
72+
},
73+
74+
unmarkManyToOneDeletion(relation) {
75+
return this.markedForManyToOneDeletion(relation) && this.get('_manyToOneDeleted').removeObject(relation);
76+
},
77+
78+
markedForManyToOneDeletion(relation) {
79+
return this.get('_manyToOneDeleted') && this.get('_manyToOneDeleted').includes(relation);
80+
},
81+
5682
markManyToManyDeletion(relation, model) {
5783
let deletedRelations = this.get('_manyToManyDeleted');
5884
if(!deletedRelations) {
59-
this.set('_manyToManyDeleted', Ember.Object.create());
85+
this.set('_manyToManyDeleted', EmberObject.create());
6086
deletedRelations = this.get('_manyToManyDeleted');
6187
}
6288

6389
if(!deletedRelations.get(relation)) {
64-
deletedRelations.set(relation, Ember.A());
65-
Ember.defineProperty(
90+
deletedRelations.set(relation, A());
91+
defineProperty(
6692
this,
67-
`manyToManyDeleted${relation}`, Ember.computed.readOnly(`_manyToManyDeleted.${relation}`)
93+
`manyToManyDeleted${relation}`, computed.readOnly(`_manyToManyDeleted.${relation}`)
6894
);
6995
}
7096

@@ -87,7 +113,7 @@ export default Ember.Mixin.create({
87113

88114
tempId() {
89115
if (!this._tempId) {
90-
this._tempId = Ember.guidFor(this);
116+
this._tempId = guidFor(this);
91117
}
92118
return this._tempId;
93119
},

addon/mixins/nested-relations.js

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import Ember from 'ember';
1+
import Mixin from '@ember/object/mixin';
2+
import { copy } from '@ember/object/internals';
3+
import { merge } from '@ember/polyfills';
24

35
// This is for reference in our post-save promise
46
// We need to unload these records after save, otherwise
@@ -15,13 +17,14 @@ const iterateRelations = function(record, relations, callback) {
1517
let kind = metadata.kind;
1618
let relatedRecord = record.get(relationName);
1719
let manyToManyDeleted = record.manyToManyMarkedForDeletionModels(relationName);
20+
let isManyToOneDelete = record.markedForManyToOneDeletion(relationName);
1821

1922
if (metadata.options.async !== false) {
2023
relatedRecord = relatedRecord.get('content');
2124
}
2225

2326
if (relatedRecord) {
24-
callback(relationName, kind, relatedRecord, subRelations, manyToManyDeleted);
27+
callback(relationName, kind, relatedRecord, subRelations, manyToManyDeleted, isManyToOneDelete);
2528
}
2629
});
2730
};
@@ -51,7 +54,7 @@ const attributesFor = function(record) {
5154
return record.transformJsonapiAttrs ? record.transformJsonapiAttrs(attrs) : attrs;
5255
};
5356

54-
const jsonapiPayload = function(record, isManyToManyDelete) {
57+
const jsonapiPayload = function(record, relationshipMarkedForDeletion) {
5558
let attributes = attributesFor(record);
5659

5760
let payload = { type: record.jsonapiType() };
@@ -67,7 +70,7 @@ const jsonapiPayload = function(record, isManyToManyDelete) {
6770
else if (record.get('markedForDestruction')) {
6871
payload['method'] = 'destroy';
6972
}
70-
else if (record.get('markedForDeletion') || isManyToManyDelete) {
73+
else if (record.get('markedForDeletion') || relationshipMarkedForDeletion) {
7174
payload['method'] = 'disassociate';
7275
}
7376
else if (record.get('currentState.isDirty')) {
@@ -82,14 +85,14 @@ const jsonapiPayload = function(record, isManyToManyDelete) {
8285
};
8386

8487
const payloadForInclude = function(payload) {
85-
let payloadCopy = Ember.copy(payload, true);
88+
let payloadCopy = copy(payload, true);
8689
delete(payloadCopy.method);
8790

8891
return payloadCopy;
8992
};
9093

9194
const payloadForRelationship = function(payload) {
92-
let payloadCopy = Ember.copy(payload, true);
95+
let payloadCopy = copy(payload, true);
9396
delete(payloadCopy.attributes);
9497
delete(payloadCopy.relationships);
9598

@@ -129,21 +132,21 @@ const hasManyData = function(relationName, relatedRecords, subRelations, manyToM
129132
return { data: payloads };
130133
};
131134

132-
const belongsToData = function(relatedRecord, subRelations, includedRecords) {
133-
let payload = jsonapiPayload(relatedRecord);
135+
const belongsToData = function(relatedRecord, subRelations, isManyToOneDelete, includedRecords) {
136+
let payload = jsonapiPayload(relatedRecord, isManyToOneDelete);
134137
processRelationships(subRelations, payload, relatedRecord, includedRecords);
135138
addToIncludes(payload, includedRecords);
136139

137140
return { data: payloadForRelationship(payload) };
138141
};
139142

140-
const processRelationship = function(name, kind, relationData, subRelations, manyToManyDeleted, includedRecords, callback) {
143+
const processRelationship = function(name, kind, relationData, subRelations, manyToManyDeleted, isManyToOneDelete, includedRecords, callback) {
141144
let payload = null;
142145

143146
if (kind === 'hasMany') {
144147
payload = hasManyData(name, relationData, subRelations, manyToManyDeleted, includedRecords);
145148
} else {
146-
payload = belongsToData(relationData, subRelations, includedRecords);
149+
payload = belongsToData(relationData, subRelations, isManyToOneDelete, includedRecords);
147150
}
148151

149152
if (payload && payload.data) {
@@ -155,8 +158,8 @@ const processRelationships = function(relationshipHash, jsonData, record, includ
155158
if (isPresentObject(relationshipHash)) {
156159
jsonData.relationships = {};
157160

158-
iterateRelations(record, relationshipHash, (name, kind, related, subRelations, manyToManyDeleted) => {
159-
processRelationship(name, kind, related, subRelations, manyToManyDeleted, includedRecords, (payload) => {
161+
iterateRelations(record, relationshipHash, (name, kind, related, subRelations, manyToManyDeleted, isManyToOneDelete) => {
162+
processRelationship(name, kind, related, subRelations, manyToManyDeleted, isManyToOneDelete, includedRecords, (payload) => {
160163
let serializer = record.store.serializerFor(record.constructor.modelName);
161164
let serializedName = serializer.keyForRelationship(name);
162165
jsonData.relationships[serializedName] = payload;
@@ -173,7 +176,7 @@ const relationshipsDirective = function(value) {
173176
directive[value] = {};
174177
} else if(Array.isArray(value)) {
175178
value.forEach((key) => {
176-
Ember.merge(directive, relationshipsDirective(key));
179+
merge(directive, relationshipsDirective(key));
177180
});
178181
} else {
179182
Object.keys(value).forEach((key) => {
@@ -187,7 +190,7 @@ const relationshipsDirective = function(value) {
187190
return directive;
188191
};
189192

190-
export default Ember.Mixin.create({
193+
export default Mixin.create({
191194
serialize(snapshot/*, options */) {
192195
savedRecords = [];
193196

package.json

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,42 @@
1111
"start": "ember server",
1212
"test": "ember try:each"
1313
},
14-
"repository": "",
14+
"repository": "https://github.com/jsonapi-suite/ember-data-extensions",
1515
"engines": {
1616
"node": ">= 0.10.0"
1717
},
1818
"author": "",
1919
"license": "MIT",
2020
"devDependencies": {
2121
"broccoli-asset-rev": "^2.4.2",
22-
"ember-ajax": "^2.0.1",
23-
"ember-cli": "2.7.0",
24-
"ember-cli-app-version": "^1.0.0",
22+
"ember-ajax": "^3.0.1",
23+
"ember-cli": "^2.7.0",
24+
"ember-cli-app-version": "^2.0.0",
2525
"ember-cli-dependency-checker": "^1.2.0",
26+
"ember-cli-eslint": "4.2.3",
2627
"ember-cli-htmlbars": "^1.0.3",
27-
"ember-cli-htmlbars-inline-precompile": "^0.3.1",
28+
"ember-cli-htmlbars-inline-precompile": "^0.4.0",
2829
"ember-cli-inject-live-reload": "^1.4.0",
29-
"ember-cli-jshint": "^1.0.0",
30-
"ember-cli-mirage": "0.2.1",
31-
"ember-cli-page-object": "1.6.0",
32-
"ember-cli-qunit": "^2.0.0",
30+
"ember-cli-mirage": "^0.2.1",
31+
"ember-cli-page-object": "^1.6.0",
32+
"ember-cli-qunit": "^3.0.0",
3333
"ember-cli-release": "^0.2.9",
3434
"ember-cli-sri": "^2.1.0",
35-
"ember-cli-test-loader": "^1.1.0",
35+
"ember-cli-test-loader": "^2.0.0",
3636
"ember-cli-uglify": "^1.2.0",
3737
"ember-disable-prototype-extensions": "^1.1.0",
38-
"ember-export-application-global": "^1.0.5",
38+
"ember-export-application-global": "^2.0.0",
3939
"ember-load-initializers": "^0.5.1",
40-
"ember-resolver": "^2.0.3",
40+
"ember-resolver": "^5.0.0",
41+
"eslint-plugin-ember": "^5.2.0",
4142
"loader.js": "^4.0.1"
4243
},
4344
"keywords": [
4445
"ember-addon"
4546
],
4647
"dependencies": {
47-
"ember-data": "^2.7.0",
48-
"ember-cli-babel": "^5.1.6"
48+
"ember-cli-babel": "^6.6.0",
49+
"ember-data": "^2.7.0"
4950
},
5051
"ember-addon": {
5152
"configPath": "tests/dummy/config"

tests/.eslintrc.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = {
2+
env: {
3+
embertest: true
4+
},
5+
globals: {
6+
server: true,
7+
QUnit: true
8+
}
9+
};

0 commit comments

Comments
 (0)