Ghost/ghost/members-csv/lib/parse.js
Naz 5b8b18ded1
Moved csv parser utility method
refs https://github.com/TryGhost/Toolbox/issues/430

- The 'readCSV' method was only exposed to be used in the unit tests. To keep the module code to the minimum moved readCSV to the unit test itself - the only place where it's used and belongs to.
2022-10-13 09:53:16 +08:00

81 lines
2.4 KiB
JavaScript

const Promise = require('bluebird');
const pump = require('pump');
const papaparse = require('papaparse');
const fs = require('fs-extra');
module.exports = (path, mapping, defaultLabels = []) => {
return new Promise(function (resolve, reject) {
const csvFileStream = fs.createReadStream(path);
const csvParserStream = papaparse.parse(papaparse.NODE_STREAM_INPUT, {
header: true,
transformHeader(_header) {
let header = _header;
if (mapping && Reflect.has(mapping, _header)) {
header = mapping[_header];
}
if (header === 'subscribed_to_emails') {
return 'subscribed';
}
return header;
},
transform(value, header) {
if (header === 'labels') {
if (value && typeof value === 'string') {
return value.split(',').map(name => ({name}));
}
}
if (header === 'products') {
if (value && typeof value === 'string') {
return value.split(',').map(name => ({name}));
}
}
if (header === 'subscribed') {
return value.toLowerCase() !== 'false';
}
if (header === 'complimentary_plan') {
return value.toLowerCase() === 'true';
}
if (value === '') {
return null;
}
if (value === 'undefined') {
return null;
}
if (value.toLowerCase() === 'false') {
return false;
}
if (value.toLowerCase() === 'true') {
return true;
}
return value;
}
});
const rows = [];
const parsedCSVStream = pump(csvFileStream, csvParserStream, (err) => {
if (err) {
return reject(err);
}
resolve(rows);
});
parsedCSVStream.on('data', (row) => {
if (row.labels) {
row.labels = row.labels.concat(defaultLabels);
} else {
row.labels = defaultLabels;
}
rows.push(row);
});
});
};