-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathindex.js
More file actions
79 lines (60 loc) · 1.75 KB
/
index.js
File metadata and controls
79 lines (60 loc) · 1.75 KB
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
var defined = require('defined')
var through = require('through2')
var keys = require('lodash.keys')
var getValues = require('lodash.values')
var pick = require('lodash.pick')
module.exports = csvFormatter
// code inspired by https://github.com/IWSLLC/json-csv/blob/master/exporter.js
function csvFormatter (options) {
options = getOptions(options)
var headerWritten = false
var stream = through.obj(function (row, enc, cb) {
if (!headerWritten) {
this.push(formatHeaderRow(options, row))
headerWritten = true
}
cb(null, formatBodyRow(options, row))
})
stream.options = options
return stream
}
function getOptions (options) {
if (Array.isArray(options)) {
options = { headers: options }
}
options = defined(options, {})
options.separator = defined(options.separator, ',')
options.newline = defined(options.newline, '\n')
return options
}
function formatHeaderRow (options, row) {
var headers = options.headers = defined(options.headers, keys(row))
return formatRow(options, headers)
}
function formatBodyRow (options, row) {
var values = getValues(pick(row, options.headers))
return formatRow(options, values)
}
function formatRow (options, fields) {
var line = fields
.map(formatField.bind(null, options))
.join(options.separator)
return line + options.newline
}
function formatField (options, field) {
if (typeof field !== 'string') {
field = String(field)
}
var mustBeQuoted =
field.indexOf('"') !== -1 ||
field.indexOf(options.separator) !== -1 ||
field.indexOf(options.newline) !== -1
if (mustBeQuoted) {
// quote
// replace quotes with two quotes
field = field.replace(/\"/g, '""')
// enclose with quotes
field = '"' + field + '"'
}
return field
}