-
Notifications
You must be signed in to change notification settings - Fork 42
/
index.js
82 lines (81 loc) · 2.48 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* 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);
});
});
};