/* inspired by https://www.npmjs.com/package/react-csv-downloader now removed from Github */ const newLine = '\r\n'; const appendLine = (content, row, { separator, quoted }) => { const line = row.map(data => { if (!quoted) return data; // quote data data = typeof data === 'string' ? data.replace(/"/g, '"') : data; return `"${data}"`; }); content.push(line.join(separator)); }; const defaults = { separator: ',', quoted: false }; export default function csv(columns, datas, options, noHeader = false) { options = Object.assign({}, defaults, options); let columnOrder; const content = []; const column = []; if (columns) { columnOrder = columns.map(v => { if (typeof v === 'string') return v; if (!noHeader) { column.push(typeof v.title !== 'undefined' ? v.title : v.key); } return v.key; }); if (column.length > 0) appendLine(content, column, options); } else { columnOrder = []; datas.forEach(v => { if (!Array.isArray(v)) { columnOrder = columnOrder.concat(Object.keys(v)); } }); if (columnOrder.length > 0) { columnOrder = columnOrder.filter((value, index, self) => self.indexOf(value) === index); if (!noHeader) appendLine(content, columnOrder, options); } } if (Array.isArray(datas)) { datas.forEach(row => { if (!Array.isArray(row)) { row = columnOrder.map(k => (typeof row[k] !== 'undefined' ? row[k] : '')); } appendLine(content, row, options); }); } return content.join(newLine); }