restify
Version:
REST framework
313 lines (299 loc) • 8.71 kB
JavaScript
// Generated by CoffeeScript 1.12.7
var Stringifier, get, stream, util;
stream = require('stream');
util = require('util');
get = require('lodash.get');
module.exports = function() {
var callback, chunks, data, options, stringifier;
if (arguments.length === 3) {
data = arguments[0];
options = arguments[1];
callback = arguments[2];
} else if (arguments.length === 2) {
if (Array.isArray(arguments[0])) {
data = arguments[0];
} else {
options = arguments[0];
}
if (typeof arguments[1] === 'function') {
callback = arguments[1];
} else {
options = arguments[1];
}
} else if (arguments.length === 1) {
if (typeof arguments[0] === 'function') {
callback = arguments[0];
} else if (Array.isArray(arguments[0])) {
data = arguments[0];
} else {
options = arguments[0];
}
}
if (options == null) {
options = {};
}
stringifier = new Stringifier(options);
if (data) {
process.nextTick(function() {
var d, j, len;
for (j = 0, len = data.length; j < len; j++) {
d = data[j];
stringifier.write(d);
}
return stringifier.end();
});
}
if (callback) {
chunks = [];
stringifier.on('readable', function() {
var chunk, results;
results = [];
while (chunk = stringifier.read()) {
results.push(chunks.push(chunk));
}
return results;
});
stringifier.on('error', function(err) {
return callback(err);
});
stringifier.on('end', function() {
return callback(null, chunks.join(''));
});
}
return stringifier;
};
Stringifier = function(opts) {
var base, base1, base10, base11, base12, base13, base2, base3, base4, base5, base6, base7, base8, base9, k, options, v;
if (opts == null) {
opts = {};
}
options = {};
for (k in opts) {
v = opts[k];
options[k] = v;
}
stream.Transform.call(this, options);
this.options = options;
if ((base = this.options).delimiter == null) {
base.delimiter = ',';
}
if ((base1 = this.options).quote == null) {
base1.quote = '"';
}
if ((base2 = this.options).quoted == null) {
base2.quoted = false;
}
if ((base3 = this.options).quotedEmpty == null) {
base3.quotedEmpty = void 0;
}
if ((base4 = this.options).quotedString == null) {
base4.quotedString = false;
}
if ((base5 = this.options).eof == null) {
base5.eof = true;
}
if ((base6 = this.options).escape == null) {
base6.escape = '"';
}
if ((base7 = this.options).columns == null) {
base7.columns = null;
}
if ((base8 = this.options).header == null) {
base8.header = false;
}
if ((base9 = this.options).formatters == null) {
base9.formatters = {};
}
if ((base10 = this.options.formatters).date == null) {
base10.date = function(value) {
return '' + value.getTime();
};
}
if ((base11 = this.options.formatters).bool == null) {
base11.bool = function(value) {
if (value) {
return '1';
} else {
return '';
}
};
}
if ((base12 = this.options.formatters).object == null) {
base12.object = function(value) {
return JSON.stringify(value);
};
}
if ((base13 = this.options).rowDelimiter == null) {
base13.rowDelimiter = '\n';
}
if (this.countWriten == null) {
this.countWriten = 0;
}
switch (this.options.rowDelimiter) {
case 'auto':
this.options.rowDelimiter = null;
break;
case 'unix':
this.options.rowDelimiter = "\n";
break;
case 'mac':
this.options.rowDelimiter = "\r";
break;
case 'windows':
this.options.rowDelimiter = "\r\n";
break;
case 'unicode':
this.options.rowDelimiter = "\u2028";
}
return this;
};
util.inherits(Stringifier, stream.Transform);
module.exports.Stringifier = Stringifier;
Stringifier.prototype.headers = function() {
var k, label, labels;
if (!this.options.header) {
return;
}
if (!this.options.columns) {
return;
}
labels = this.options.columns;
if (typeof labels === 'object') {
labels = (function() {
var results;
results = [];
for (k in labels) {
label = labels[k];
results.push(label);
}
return results;
})();
}
if (this.options.eof) {
labels = this.stringify(labels) + this.options.rowDelimiter;
} else {
labels = this.stringify(labels);
}
return stream.Transform.prototype.write.call(this, labels);
};
Stringifier.prototype.end = function(chunk, encoding, callback) {
if (this.countWriten === 0) {
this.headers();
}
return stream.Transform.prototype.end.apply(this, arguments);
};
Stringifier.prototype.write = function(chunk, encoding, callback) {
var base, e, preserve;
if (chunk == null) {
return;
}
preserve = typeof chunk !== 'object';
if (!preserve) {
if (this.countWriten === 0 && !Array.isArray(chunk)) {
if ((base = this.options).columns == null) {
base.columns = Object.keys(chunk);
}
}
try {
this.emit('record', chunk, this.countWriten);
} catch (error) {
e = error;
return this.emit('error', e);
}
if (this.options.eof) {
chunk = this.stringify(chunk) + this.options.rowDelimiter;
} else {
chunk = this.stringify(chunk);
if (this.options.header || this.countWriten) {
chunk = this.options.rowDelimiter + chunk;
}
}
}
if (typeof chunk === 'number') {
chunk = "" + chunk;
}
if (this.countWriten === 0) {
this.headers();
}
if (!preserve) {
this.countWriten++;
}
return stream.Transform.prototype.write.call(this, chunk, encoding, callback);
};
Stringifier.prototype._transform = function(chunk, encoding, callback) {
this.push(chunk);
return callback();
};
Stringifier.prototype.stringify = function(line) {
var _line, column, columns, containsEscape, containsLinebreak, containsQuote, containsdelimiter, delimiter, escape, field, i, j, l, newLine, quote, ref, ref1, regexp, shouldQuote, value;
if (typeof line !== 'object') {
return line;
}
columns = this.options.columns;
if (typeof columns === 'object' && columns !== null && !Array.isArray(columns)) {
columns = Object.keys(columns);
}
delimiter = this.options.delimiter;
quote = this.options.quote;
escape = this.options.escape;
if (!Array.isArray(line)) {
_line = [];
if (columns) {
for (i = j = 0, ref = columns.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
column = columns[i];
value = get(line, column);
_line[i] = (typeof value === 'undefined' || value === null) ? '' : value;
}
} else {
for (column in line) {
_line.push(line[column]);
}
}
line = _line;
_line = null;
} else if (columns) {
line.splice(columns.length);
}
if (Array.isArray(line)) {
newLine = '';
for (i = l = 0, ref1 = line.length; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) {
field = line[i];
if (typeof field === 'string') {
} else if (typeof field === 'number') {
field = '' + field;
} else if (typeof field === 'boolean') {
field = this.options.formatters.bool(field);
} else if (field instanceof Date) {
field = this.options.formatters.date(field);
} else if (typeof field === 'object' && field !== null) {
field = this.options.formatters.object(field);
}
if (field) {
containsdelimiter = field.indexOf(delimiter) >= 0;
containsQuote = field.indexOf(quote) >= 0;
containsEscape = field.indexOf(escape) >= 0 && (escape !== quote);
containsLinebreak = field.indexOf('\r') >= 0 || field.indexOf('\n') >= 0;
shouldQuote = containsQuote || containsdelimiter || containsLinebreak || this.options.quoted || (this.options.quotedString && typeof line[i] === 'string');
if (shouldQuote && containsEscape) {
regexp = escape === '\\' ? new RegExp(escape + escape, 'g') : new RegExp(escape, 'g');
field = field.replace(regexp, escape + escape);
}
if (containsQuote) {
regexp = new RegExp(quote, 'g');
field = field.replace(regexp, escape + quote);
}
if (shouldQuote) {
field = quote + field + quote;
}
newLine += field;
} else if (this.options.quotedEmpty || ((this.options.quotedEmpty == null) && line[i] === '' && this.options.quotedString)) {
newLine += quote + quote;
}
if (i !== line.length - 1) {
newLine += delimiter;
}
}
line = newLine;
}
return line;
};