Skip to content

Commit b8b4a80

Browse files
committed
fix convertCase function
closes #93
1 parent 888d013 commit b8b4a80

File tree

2 files changed

+72
-52
lines changed

2 files changed

+72
-52
lines changed

lib/JSONAPISerializer.js

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -795,61 +795,62 @@ module.exports = class JSONAPISerializer {
795795
* @returns {object} Object with it's keys converted as per the convertCaseOptions
796796
*/
797797
_convertCase(data, convertCaseOptions) {
798-
if (data !== undefined && data !== null) {
799-
if (Array.isArray(data)) {
800-
return data.map(item => this._convertCase(item, convertCaseOptions));
801-
}
802-
803-
if (isPlainObject(data)) {
804-
return transform(
805-
data,
806-
(result, value, key) => {
807-
let converted;
808-
if (value && Array.isArray(value)) {
809-
converted = value.map(item => this._convertCase(item, convertCaseOptions));
810-
} else if (value && isPlainObject(value)) {
811-
converted = this._convertCase(value, convertCaseOptions);
812-
} else {
813-
converted = value;
814-
}
798+
if (Array.isArray(data)) {
799+
return data.map(item => {
800+
if (item && (Array.isArray(item) || isPlainObject(item))) {
801+
return this._convertCase(item, convertCaseOptions);
802+
}
803+
return item;
804+
});
805+
}
815806

816-
result[this._convertCase(key, convertCaseOptions)] = converted;
817-
return result;
818-
},
819-
{}
820-
);
821-
}
807+
if (isPlainObject(data)) {
808+
return transform(
809+
data,
810+
(result, value, key) => {
811+
let converted;
812+
if (value && (Array.isArray(value) || isPlainObject(value))) {
813+
converted = this._convertCase(value, convertCaseOptions);
814+
} else {
815+
converted = value;
816+
}
822817

823-
if (typeof data === 'string') {
824-
let converted;
818+
result[this._convertCase(key, convertCaseOptions)] = converted;
819+
return result;
820+
},
821+
{}
822+
);
823+
}
825824

826-
switch (convertCaseOptions) {
827-
case 'snake_case':
828-
converted = this.convertCaseMap.snakeCase.get(data);
829-
if (!converted) {
830-
converted = toSnakeCase(data);
831-
this.convertCaseMap.snakeCase.set(data, converted);
832-
}
833-
break;
834-
case 'kebab-case':
835-
converted = this.convertCaseMap.kebabCase.get(data);
836-
if (!converted) {
837-
converted = toKebabCase(data);
838-
this.convertCaseMap.kebabCase.set(data, converted);
839-
}
840-
break;
841-
case 'camelCase':
842-
converted = this.convertCaseMap.camelCase.get(data);
843-
if (!converted) {
844-
converted = toCamelCase(data);
845-
this.convertCaseMap.camelCase.set(data, converted);
846-
}
847-
break;
848-
default: // Do nothing
849-
}
825+
if (typeof data === 'string') {
826+
let converted;
850827

851-
return converted;
828+
switch (convertCaseOptions) {
829+
case 'snake_case':
830+
converted = this.convertCaseMap.snakeCase.get(data);
831+
if (!converted) {
832+
converted = toSnakeCase(data);
833+
this.convertCaseMap.snakeCase.set(data, converted);
834+
}
835+
break;
836+
case 'kebab-case':
837+
converted = this.convertCaseMap.kebabCase.get(data);
838+
if (!converted) {
839+
converted = toKebabCase(data);
840+
this.convertCaseMap.kebabCase.set(data, converted);
841+
}
842+
break;
843+
case 'camelCase':
844+
converted = this.convertCaseMap.camelCase.get(data);
845+
if (!converted) {
846+
converted = toCamelCase(data);
847+
this.convertCaseMap.camelCase.set(data, converted);
848+
}
849+
break;
850+
default: // Do nothing
852851
}
852+
853+
return converted;
853854
}
854855

855856
return data;

test/unit/JSONAPISerializer.test.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2254,6 +2254,13 @@ describe('JSONAPISerializer', function() {
22542254
})
22552255

22562256
describe('convertCase', function() {
2257+
it('should return null', function() {
2258+
const jsonapiSerializer = new JSONAPISerializer();
2259+
const converted = jsonapiSerializer._convertCase(null, 'kebab-case');
2260+
2261+
expect(converted).to.equal(null);
2262+
});
2263+
22572264
it('should convert an array of object to kebab-case', function() {
22582265
const jsonapiSerializer = new JSONAPISerializer();
22592266
const converted = jsonapiSerializer._convertCase(
@@ -2265,14 +2272,20 @@ describe('JSONAPISerializer', function() {
22652272
thirdProperty: 0
22662273
}
22672274
],
2268-
arrayOfNumber: [1, 2, 3, 4, 5]
2275+
arrayOfNumber: [1, 2, 3, 4, 5],
2276+
arrayOfString: ['firstString', 'secondString'],
2277+
normalProperty: 'normalProperty',
2278+
nullProperty: null,
22692279
}],
22702280
'kebab-case'
22712281
);
22722282

22732283
expect(converted).to.deep.equal([{
22742284
'array-of-object': [{ 'first-property': 'test', 'second-property': null, 'third-property': 0 }],
2275-
'array-of-number': [1, 2, 3, 4, 5]
2285+
'array-of-number': [1, 2, 3, 4, 5],
2286+
'array-of-string': ['firstString', 'secondString'],
2287+
'normal-property': 'normalProperty',
2288+
'null-property': null
22762289
}]);
22772290
});
22782291

@@ -2288,13 +2301,19 @@ describe('JSONAPISerializer', function() {
22882301
}
22892302
],
22902303
arrayOfNumber: [1, 2, 3, 4, 5],
2304+
arrayOfString: ['firstString', 'secondString'],
2305+
normalProperty: 'normalProperty',
2306+
nullProperty: null,
22912307
date: new Date()
22922308
},
22932309
'kebab-case'
22942310
);
22952311

22962312
expect(converted['array-of-object']).to.deep.equal([{ 'first-property': 'test', 'second-property': null, 'third-property': 0 }]);
22972313
expect(converted['array-of-number']).to.deep.equal([1, 2, 3, 4, 5]);
2314+
expect(converted['array-of-string']).to.deep.equal(['firstString', 'secondString']);
2315+
expect(converted['normal-property']).to.equal('normalProperty');
2316+
expect(converted['null-property']).to.equal(null);
22982317
expect(converted.date).to.be.a('Date');
22992318
});
23002319
});

0 commit comments

Comments
 (0)