83 lines
2.5 KiB
JavaScript
83 lines
2.5 KiB
JavaScript
/* jshint node:true */
|
|
'use strict';
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
//const _ = require('underscore');
|
|
const Parser = require('./parser/csv');
|
|
const Stream = require('./core/stream');
|
|
const helper = require('./core/helper');
|
|
const EOL = require('./core/eol');
|
|
|
|
/**
|
|
* Main function that converts json to csv
|
|
*
|
|
* @param {Object|Array} json
|
|
* @param {Object} [options]
|
|
* @param {Function} callback(err, csv) - Callback function
|
|
* if error, returning error in call back.
|
|
* if csv is created successfully, returning csv output to callback.
|
|
*/
|
|
module.exports = function() {
|
|
const DEFAULT_OPTIONS = {
|
|
headers: [], // Array
|
|
rename: [], // Array
|
|
headerPathString: '.', // String
|
|
rowDelimiter: ',', // String
|
|
textDelimiter: '"', // String
|
|
arrayPathString: ';', // String
|
|
undefinedString: '', // String
|
|
endOfLine: EOL || '\n', // String
|
|
mainPathItem: null, // String
|
|
booleanTrueString: null, // String
|
|
booleanFalseString: null, // String
|
|
includeHeaders: true, // Boolean
|
|
fillGaps: false, // Boolean
|
|
verticalOutput: true, // Boolean
|
|
forceTextDelimiter: false, //Boolean
|
|
};
|
|
// argument parsing
|
|
let json, userOptions, callback;
|
|
if (arguments.length === 3) {
|
|
[json, userOptions, callback] = arguments;
|
|
} else if (arguments.length === 2) {
|
|
let any;
|
|
[json, any] = arguments;
|
|
if (typeof any === 'function') {
|
|
callback = any;
|
|
} else if (typeof any === 'object') {
|
|
userOptions = any;
|
|
}
|
|
} else if (arguments.length === 1) {
|
|
const [any] = arguments;
|
|
if (typeof any === 'object') {
|
|
const defaultKeys = Object.keys(DEFAULT_OPTIONS);
|
|
const objectKeys = Object.keys(any);
|
|
const isOptions = objectKeys.every((key) => defaultKeys.includes(key));
|
|
if (objectKeys.length > 0 && isOptions) {
|
|
userOptions = any;
|
|
} else {
|
|
json = any;
|
|
}
|
|
} else {
|
|
json = any;
|
|
}
|
|
} else {
|
|
return new Stream(new Parser(DEFAULT_OPTIONS));
|
|
}
|
|
const options = Object.assign({}, DEFAULT_OPTIONS, userOptions);
|
|
const parser = new Parser(options);
|
|
// if no json is provided Stream API will be used
|
|
if (!json) {
|
|
return new Stream(parser);
|
|
}
|
|
// always return an promise
|
|
return new Promise((resolve, reject) => {
|
|
parser.parse(json, (err, result) => {
|
|
if (callback) return callback(err, result);
|
|
if (err) return reject(err);
|
|
if (reject) return resolve(result);
|
|
});
|
|
});
|
|
};
|