Skip to content

Commit e72fa24

Browse files
authored
Validate field titles against Object.keys list (#186)
* Validate field titles against Object.keys list As reported in #185, there was a bug where header values could not have the same name as a Map method. This is because the code was naively checking for the existence of a possible title field by simply accessing the raw value of the Map. This resulted in Map.prototype.set being returned when the "set" JSON key name was used. The logic has been updated to check for header titles against an Object.keys list now since that will not include prototype methods for the underlying Map object. Fixes #185 * Add test for #185. * Add Node 16, remove Node 10 for travis test cfg.
1 parent 72688ef commit e72fa24

File tree

7 files changed

+25
-4
lines changed

7 files changed

+25
-4
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ env:
33
- CC_TEST_REPORTER_ID=90382d7264499c819f742709fe7cb4b2d2a49cc90fd98a9c8414426ac4860e62
44
language: node_js
55
node_js:
6+
- "16"
67
- "15"
78
- "14"
89
- "12"
9-
- "10"
1010
sudo: false
1111
before_script:
1212
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter

lib/json2csv.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,12 @@ const Json2Csv = function(options) {
143143
* @returns {*}
144144
*/
145145
function generateCsvHeader(params) {
146+
// #185 - generate a keys list to avoid finding native Map() methods
147+
let fieldTitleMapKeys = Object.keys(options.fieldTitleMap);
148+
146149
params.header = params.headerFields
147150
.map(function(field) {
148-
const headerKey = options.fieldTitleMap[field] ? options.fieldTitleMap[field] : field;
151+
const headerKey = fieldTitleMapKeys.includes(field) ? options.fieldTitleMap[field] : field;
149152
return wrapFieldValueIfNecessary(headerKey);
150153
})
151154
.join(options.delimiter.field);

test/config/testCsvFilesList.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ const fs = require('fs'),
3939
{key: 'firstColumnWrapCRLF', file: '../data/csv/firstColumnWrapCRLF.csv'},
4040
{key: 'emptyLastFieldValue', file: '../data/csv/emptyLastFieldValue.csv'},
4141
{key: 'emptyLastFieldValueNoEol', file: '../data/csv/emptyLastFieldValueNoEol.csv'},
42-
{key: 'lastCharFieldDelimiter', file: '../data/csv/lastCharFieldDelimiter.csv'}
42+
{key: 'lastCharFieldDelimiter', file: '../data/csv/lastCharFieldDelimiter.csv'},
43+
{key: 'nativeMapMethod', file: '../data/csv/nativeMapMethod.csv'}
4344
];
4445

4546
function readCsvFile(filePath) {

test/config/testJsonFilesList.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ module.exports = {
2929
invalidParsedValues: require('../data/json/invalidParsedValues'),
3030
firstColumnWrapCRLF: require('../data/json/firstColumnWrapCRLF.json'),
3131
emptyLastFieldValue: require('../data/json/emptyLastFieldValue.json'),
32-
emptyLastFieldValueNoEol: require('../data/json/emptyLastFieldValueNoEol.json')
32+
emptyLastFieldValueNoEol: require('../data/json/emptyLastFieldValueNoEol.json'),
33+
nativeMapMethod: require('../data/json/nativeMapMethod.json')
3334
};

test/data/csv/nativeMapMethod.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set,otherfieldname
2+
test,test2

test/data/json/nativeMapMethod.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[
2+
{
3+
"set": "test",
4+
"otherfieldname": "test2"
5+
}
6+
]

test/json2csv.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ function runTests(jsonTestData, csvTestData) {
137137
done();
138138
});
139139
});
140+
141+
it('should properly handle headers with the same name as native Map methods', (done) => {
142+
converter.json2csv(jsonTestData.nativeMapMethod, (err, csv) => {
143+
if (err) done(err);
144+
csv.should.equal(csvTestData.nativeMapMethod);
145+
done();
146+
});
147+
});
140148
});
141149

142150
describe('Error Handling', () => {

0 commit comments

Comments
 (0)