Skip to content

Commit 2406a54

Browse files
committed
fix _convertCase issues
closes #80
1 parent 5163aed commit 2406a54

File tree

2 files changed

+89
-30
lines changed

2 files changed

+89
-30
lines changed

Diff for: lib/JSONAPISerializer.js

+43-30
Original file line numberDiff line numberDiff line change
@@ -764,38 +764,51 @@ module.exports = class JSONAPISerializer {
764764
* @returns {object} Object with it's keys converted as per the convertCaseOptions
765765
*/
766766
_convertCase(data, convertCaseOptions) {
767-
let converted;
768-
if (typeof data === 'object') {
769-
converted = transform(
770-
data,
771-
(result, value, key) => {
772-
if (value && typeof value === 'object') {
773-
result[this._convertCase(key, convertCaseOptions)] = this._convertCase(
774-
value,
775-
convertCaseOptions
776-
);
777-
} else {
778-
result[this._convertCase(key, convertCaseOptions)] = value;
779-
}
780-
return result;
781-
},
782-
{}
783-
);
784-
} else {
785-
switch (convertCaseOptions) {
786-
case 'snake_case':
787-
converted = toSnakeCase(data);
788-
break;
789-
case 'kebab-case':
790-
converted = toKebabCase(data);
791-
break;
792-
case 'camelCase':
793-
converted = toCamelCase(data);
794-
break;
795-
default: // Do nothing
767+
if (data !== undefined && data !== null) {
768+
if (Array.isArray(data)) {
769+
return data.map(item => this._convertCase(item, convertCaseOptions));
770+
}
771+
772+
if (typeof data === 'object') {
773+
return transform(
774+
data,
775+
(result, value, key) => {
776+
let converted;
777+
if (value && Array.isArray(value)) {
778+
converted = value.map(item => this._convertCase(item, convertCaseOptions));
779+
} else if (value && typeof value === 'object') {
780+
converted = this._convertCase(value, convertCaseOptions);
781+
} else {
782+
converted = value;
783+
}
784+
785+
result[this._convertCase(key, convertCaseOptions)] = converted;
786+
return result;
787+
},
788+
{}
789+
);
790+
}
791+
792+
if (typeof data === 'string') {
793+
let converted;
794+
795+
switch (convertCaseOptions) {
796+
case 'snake_case':
797+
converted = toSnakeCase(data);
798+
break;
799+
case 'kebab-case':
800+
converted = toKebabCase(data);
801+
break;
802+
case 'camelCase':
803+
converted = toCamelCase(data);
804+
break;
805+
default: // Do nothing
806+
}
807+
808+
return converted;
796809
}
797810
}
798811

799-
return converted;
812+
return data;
800813
}
801814
};

Diff for: test/unit/JSONAPISerializer.test.js

+46
Original file line numberDiff line numberDiff line change
@@ -2062,4 +2062,50 @@ describe('JSONAPISerializer', function() {
20622062
done();
20632063
});
20642064
})
2065+
2066+
describe('convertCase', function() {
2067+
it('should convert an array of object to kebab-case', function() {
2068+
const jsonapiSerializer = new JSONAPISerializer();
2069+
const converted = jsonapiSerializer._convertCase(
2070+
[{
2071+
arrayOfObject: [
2072+
{
2073+
firstProperty: 'test',
2074+
secondProperty: null,
2075+
thirdProperty: 0
2076+
}
2077+
],
2078+
arrayOfNumber: [1, 2, 3, 4, 5]
2079+
}],
2080+
'kebab-case'
2081+
);
2082+
2083+
expect(converted).to.deep.equal([{
2084+
'array-of-object': [{ 'first-property': 'test', 'second-property': null, 'third-property': 0 }],
2085+
'array-of-number': [1, 2, 3, 4, 5]
2086+
}]);
2087+
});
2088+
2089+
it('should convert an object to kebab-case', function() {
2090+
const jsonapiSerializer = new JSONAPISerializer();
2091+
const converted = jsonapiSerializer._convertCase(
2092+
{
2093+
arrayOfObject: [
2094+
{
2095+
firstProperty: 'test',
2096+
secondProperty: null,
2097+
thirdProperty: 0
2098+
}
2099+
],
2100+
arrayOfNumber: [1, 2, 3, 4, 5]
2101+
},
2102+
'kebab-case'
2103+
);
2104+
2105+
expect(converted).to.deep.equal({
2106+
'array-of-object': [{ 'first-property': 'test', 'second-property': null, 'third-property': 0 }],
2107+
'array-of-number': [1, 2, 3, 4, 5]
2108+
});
2109+
});
2110+
});
20652111
});

0 commit comments

Comments
 (0)