UNPKG

@ctrl/ngx-csv

Version:

Easily generate a CSV download in the browser with Angular

53 lines 10.9 kB
export const isJsons = (array) => Array.isArray(array) && array.every(row => typeof row === 'object' && !(row instanceof Array)); export const isArrays = (array) => Array.isArray(array) && array.every(row => Array.isArray(row)); export function jsonsHeaders(array) { return Array.from(new Set(array.map(item => Object.keys(item)).reduce((a, b) => [...a, ...b], []))); } export function jsons2arrays(jsons, headers) { headers = headers || jsonsHeaders(jsons); // allow headers to have custom labels, defaulting to having the header data key be the label let headerLabels = headers; let headerKeys = headers; if (isJsons(headers)) { headerLabels = headers.map(header => header.label); headerKeys = headers.map(header => header.key); } const data = jsons.map(object => headerKeys.map(header => (header in object ? object[header] : ''))); return [headerLabels, ...data]; } export const elementOrEmpty = (element) => element || element === 0 ? element : ''; export function joiner(data, delimiter = ',') { return data .map((row, index) => row.map((element) => '"' + elementOrEmpty(element) + '"').join(delimiter)) .join(`\n`); } export function arrays2csv(data, headers, delimiter) { return joiner(headers ? [headers, ...data] : data, delimiter); } export function jsons2csv(data, headers, delimiter) { return joiner(jsons2arrays(data, headers), delimiter); } export function string2csv(data, headers, delimiter) { return headers ? `${headers.join(delimiter)}\n${data}` : data; } export function toCSV(data, headers, delimiter) { if (isJsons(data)) { return jsons2csv(data, headers, delimiter); } if (isArrays(data)) { return arrays2csv(data, headers, delimiter); } if (typeof data === 'string') { return string2csv(data, headers, delimiter); } throw new TypeError(`Data should be a "String", "Array of arrays" OR "Array of objects" `); } export function blob(data, uFEFF = true, headers, delimiter) { const csv = toCSV(data, headers, delimiter); return new Blob([uFEFF ? '\uFEFF' : '', csv], { type: 'text/csv' }); } export function buildURI(data, uFEFF = true, headers, delimiter) { return URL.createObjectURL(blob(data, uFEFF, headers, delimiter)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFlO0lBQzFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixJQUFJLEdBQUcsQ0FDTCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDeEUsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQWtDLEVBQ2xDLE9BQWdDO0lBRWhDLE9BQU8sR0FBRyxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpDLDZGQUE2RjtJQUM3RixJQUFJLFlBQVksR0FBYSxPQUFtQixDQUFDO0lBQ2pELElB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LENBQ2xCLElBQStELEVBQy9ELEtBQUssR0FBRyxJQUFJLEVBQ1osT0FBZ0MsRUFDaEMsU0FBa0I7SUFFbEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsSUFBK0QsRUFDL0QsS0FBSyxHQUFHLElBQUksRUFDWixPQUFnQyxFQUNoQyxTQUFrQjtJQUVsQixPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHByZWZlci1hcnJvdy9wcmVmZXItYXJyb3ctZnVuY3Rpb25zICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlck9iaiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgaXNKc29ucyA9IChhcnJheTogYW55W10pID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmXG4gIGFycmF5LmV2ZXJ5KHJvdyA9PiB0eXBlb2Ygcm93ID09PSAnb2JqZWN0JyAmJiAhKHJvdyBpbnN0YW5jZW9mIEFycmF5KSk7XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5cyA9IChhcnJheTogYW55W10pID0+XG4gIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5LmV2ZXJ5KHJvdyA9PiBBcnJheS5pc0FycmF5KHJvdykpO1xuXG5leHBvcnQgZnVuY3Rpb24ganNvbnNIZWFkZXJzKGFycmF5OiBvYmplY3RbXSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFxuICAgICAgYXJyYXkubWFwKGl0ZW0gPT4gT2JqZWN0LmtleXMoaXRlbSkpLnJlZHVjZSgoYSwgYikgPT4gWy4uLmEsIC4uLmJdLCBbXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpzb25zMmFycmF5cyhcbiAganNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4pIHtcbiAgaGVhZGVycyA9IGhlYWRlcnMgfHwganNvbnNIZWFkZXJzKGpzb25zKTtcblxuICAvLyBhbGxvdyBoZWFkZXJzIHRvIGhhdmUgY3VzdG9tIGxhYmVscywgZGVmYXVsdGluZyB0byBoYXZpbmcgdGhlIGhlYWRlciBkYXRhIGtleSBiZSB0aGUgbGFiZWxcbiAgbGV0IGhlYWRlckxhYmVsczogc3RyaW5nW10gPSBoZWFkZXJzIGFzIHN0cmluZ1tdO1xuICBsZXQgaGVhZGVyS2V5czogc3RyaW5nW10gPSBoZWFkZXJzIGFzIHN0cmluZ1tdO1xuICBpZiAoaXNKc29ucyhoZWFkZXJzKSkge1xuICAgIGhlYWRlckxhYmVscyA9IChoZWFkZXJzIGFzIEhlYWRlck9ialtdKS5tYXAoaGVhZGVyID0+IGhlYWRlci5sYWJlbCk7XG4gICAgaGVhZGVyS2V5cyA9IChoZWFkZXJzIGFzIEhlYWRlck9ialtdKS5tYXAoaGVhZGVyID0+IGhlYWRlci5rZXkpO1xuICB9XG5cbiAgY29uc3QgZGF0YSA9IGpzb25zLm1hcChvYmplY3QgPT5cbiAgICBoZWFkZXJLZXlzLm1hcChoZWFkZXIgPT4gKGhlYWRlciBpbiBvYmplY3QgPyBvYmplY3RbaGVhZGVyXSA6ICcnKSksXG4gICk7XG4gIHJldHVybiBbaGVhZGVyTGFiZWxzLCAuLi5kYXRhXTtcbn1cblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRPckVtcHR5ID0gKGVsZW1lbnQ6IGFueSkgPT5cbiAgZWxlbWVudCB8fCBlbGVtZW50ID09PSAwID8gZWxlbWVudCA6ICcnO1xuXG5leHBvcnQgZnVuY3Rpb24gam9pbmVyKGRhdGE6IGFueSwgZGVsaW1pdGVyID0gJywnKSB7XG4gIHJldHVybiBkYXRhXG4gICAgLm1hcCgocm93OiBhbnksIGluZGV4OiBudW1iZXIpID0+XG4gICAgICByb3cubWFwKChlbGVtZW50OiBhbnkpID0+ICdcIicgKyBlbGVtZW50T3JFbXB0eShlbGVtZW50KSArICdcIicpLmpvaW4oZGVsaW1pdGVyKSxcbiAgICApXG4gICAgLmpvaW4oYFxcbmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzMmNzdihcbiAgZGF0YTogc3RyaW5nW11bXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICByZXR1cm4gam9pbmVyKGhlYWRlcnMgPyBbaGVhZGVycywgLi4uZGF0YV0gOiBkYXRhLCBkZWxpbWl0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbnMyY3N2KFxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10sXG4gIGhlYWRlcnM/OiBzdHJpbmdbXSB8IEhlYWRlck9ialtdLFxuICBkZWxpbWl0ZXI/OiBzdHJpbmcsXG4pIHtcbiAgcmV0dXJuIGpvaW5lcihqc29uczJhcnJheXMoZGF0YSwgaGVhZGVycyksIGRlbGltaXRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcyY3N2KFxuICBkYXRhOiBzdHJpbmcsXG4gIGhlYWRlcnM/OiBzdHJpbmdbXSxcbiAgZGVsaW1pdGVyPzogc3RyaW5nLFxuKSB7XG4gIHJldHVybiBoZWFkZXJzID8gYCR7aGVhZGVycy5qb2luKGRlbGltaXRlcil9XFxuJHtkYXRhfWAgOiBkYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DU1YoXG4gIGRhdGE6IHN0cmluZyB8IHN0cmluZ1tdW10gfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9W10gfCBhbnlbXSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICBpZiAoaXNKc29ucyhkYXRhIGFzIGFueSkpIHtcbiAgICByZXR1cm4ganNvbnMyY3N2KGRhdGEgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdLCBoZWFkZXJzLCBkZWxpbWl0ZXIpO1xuICB9XG4gIGlmIChpc0FycmF5cyhkYXRhIGFzIGFueSkpIHtcbiAgICByZXR1cm4gYXJyYXlzMmNzdihkYXRhIGFzIHN0cmluZ1tdW10sIGhlYWRlcnMsIGRlbGltaXRlcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmcyY3N2KGRhdGEsIGhlYWRlcnMgYXMgc3RyaW5nW10sIGRlbGltaXRlcik7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgRGF0YSBzaG91bGQgYmUgYSBcIlN0cmluZ1wiLCBcIkFycmF5IG9mIGFycmF5c1wiIE9SIFwiQXJyYXkgb2Ygb2JqZWN0c1wiIGAsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBibG9iKFxuICBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10sXG4gIHVGRUZGID0gdHJ1ZSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICBjb25zdCBjc3YgPSB0b0NTVihkYXRhLCBoZWFkZXJzLCBkZWxpbWl0ZXIpO1xuICByZXR1cm4gbmV3IEJsb2IoW3VGRUZGID8gJ1xcdUZFRkYnIDogJycsIGNzdl0sIHsgdHlwZTogJ3RleHQvY3N2JyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVVJJKFxuICBkYXRhOiBzdHJpbmcgfCBzdHJpbmdbXVtdIHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdIHwgYW55W10sXG4gIHVGRUZGID0gdHJ1ZSxcbiAgaGVhZGVycz86IHN0cmluZ1tdIHwgSGVhZGVyT2JqW10sXG4gIGRlbGltaXRlcj86IHN0cmluZyxcbikge1xuICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKGRhdGEsIHVGRUZGLCBoZWFkZXJzLCBkZWxpbWl0ZXIpKTtcbn1cbiJdfQ==