random-world
Version:
Node.js module to generate random collections of data.
125 lines (105 loc) • 3.3 kB
JavaScript
/**
* Output formatters for random-world data
*/
/**
* Format data as CSV
* @param {Array} data - Array of objects
* @param {Object} options - Options including delimiter, includeHeader
* @returns {string} CSV formatted string
*/
export function csv(data, options = {}) {
if (!Array.isArray(data) || data.length === 0) {
return '';
}
const delimiter = options.delimiter || ',';
const includeHeader = options.includeHeader !== false;
const headers = Object.keys(data[0]);
const rows = [];
if (includeHeader) {
rows.push(headers.join(delimiter));
}
for (const item of data) {
const values = headers.map(header => {
const value = item[header];
// Escape values containing delimiter, quotes, or newlines
if (typeof value === 'string' && (value.includes(delimiter) || value.includes('"') || value.includes('\n'))) {
return `"${value.replace(/"/g, '""')}"`;
}
return value;
});
rows.push(values.join(delimiter));
}
return rows.join('\n');
}
/**
* Format data as SQL INSERT statements
* @param {Array} data - Array of objects
* @param {string} tableName - Name of the table
* @param {Object} options - Options including dialect
* @returns {string} SQL formatted string
*/
export function sql(data, tableName = 'data', _options = {}) {
if (!Array.isArray(data) || data.length === 0) {
return '';
}
const statements = [];
const columns = Object.keys(data[0]);
const columnList = columns.join(', ');
for (const item of data) {
const values = columns.map(col => {
const value = item[col];
if (value === null || value === undefined) {
return 'NULL';
}
if (typeof value === 'number') {
return value;
}
if (typeof value === 'boolean') {
return value ? 1 : 0;
}
// Escape single quotes for SQL
return `'${String(value).replace(/'/g, "''")}'`;
});
statements.push(`INSERT INTO ${tableName} (${columnList}) VALUES (${values.join(', ')});`);
}
return statements.join('\n');
}
/**
* Format data as JSON
* @param {*} data - Data to format
* @param {Object} options - Options including pretty, indent
* @returns {string} JSON formatted string
*/
export function json(data, options = {}) {
const pretty = options.pretty !== false;
const indent = options.indent || 2;
if (pretty) {
return JSON.stringify(data, null, indent);
}
return JSON.stringify(data);
}
/**
* Format data as plain text
* @param {Array} data - Array of objects
* @param {Object} options - Options including separator
* @returns {string} Text formatted string
*/
export function text(data, options = {}) {
if (!Array.isArray(data)) {
return String(data);
}
const separator = options.separator || '\n';
return data.map(item => {
if (typeof item === 'object') {
return Object.values(item).join('\t');
}
return String(item);
}).join(separator);
}
export const formatters = {
csv,
sql,
json,
text
};
export default formatters;