mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-06 22:40:14 -05:00
77fc9ea265
- split out read CSV function into utility and add tests - update API response to follow JSONAPI more closely - update the UI to match the new API response
66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
var readline = require('readline'),
|
|
Promise = require('bluebird'),
|
|
lodash = require('lodash'),
|
|
errors = require('../errors'),
|
|
fs = require('fs');
|
|
|
|
function readCSV(options) {
|
|
var path = options.path,
|
|
columnsToExtract = options.columnsToExtract || [],
|
|
firstLine = true,
|
|
mapping = {},
|
|
toReturn = [],
|
|
rl;
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
rl = readline.createInterface({
|
|
input: fs.createReadStream(path),
|
|
terminal: false
|
|
});
|
|
|
|
rl.on('line', function (line) {
|
|
var values = line.split(','),
|
|
entry = {};
|
|
|
|
// CASE: column headers
|
|
if (firstLine) {
|
|
if (values.length === 1) {
|
|
mapping[columnsToExtract[0]] = 0;
|
|
} else {
|
|
try {
|
|
lodash.each(columnsToExtract, function (columnToExtract) {
|
|
mapping[columnToExtract] = lodash.findIndex(values, function (value) {
|
|
if (value.match(columnToExtract)) {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
// CASE: column does not exist
|
|
if (mapping[columnToExtract] === -1) {
|
|
throw new errors.ValidationError(
|
|
'Column header missing: "{{column}}".'.replace('{{column}}', columnToExtract)
|
|
);
|
|
}
|
|
});
|
|
} catch (err) {
|
|
reject(err);
|
|
}
|
|
}
|
|
|
|
firstLine = false;
|
|
} else {
|
|
lodash.each(mapping, function (index, columnName) {
|
|
entry[columnName] = values[index];
|
|
});
|
|
|
|
toReturn.push(entry);
|
|
}
|
|
});
|
|
|
|
rl.on('close', function () {
|
|
resolve(toReturn);
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = readCSV;
|