UNPKG

@woocommerce/csv-export

Version:
64 lines (63 loc) 1.95 kB
import { saveAs } from "browser-filesaver"; function escapeCSVValue(value) { let stringValue = value.toString(); if (typeof value === "number") { return stringValue; } if ([ "=", "+", "-", // Only escape '-' if it's not part of a numeric value. "@", String.fromCharCode(9), // tab String.fromCharCode(13) // carriage return ].includes(stringValue.charAt(0))) { stringValue = `"'` + stringValue + '"'; } else if (stringValue.match(/[,"\s]/)) { stringValue = '"' + stringValue.replace(/"/g, '""') + '"'; } return stringValue; } function getCSVHeaders(headers) { return Array.isArray(headers) ? headers.map((header) => escapeCSVValue(header.label)).join(",") : []; } function getCSVRows(rows) { return Array.isArray(rows) ? rows.map( (row) => row.map((rowItem) => { if (void 0 === rowItem.value || rowItem.value === null) { return ""; } return escapeCSVValue(rowItem.value); }).join(",") ).join("\n") : []; } function generateCSVDataFromTable(headers, rows) { return [getCSVHeaders(headers), getCSVRows(rows)].filter((text) => text.length).join("\n"); } function todayDateStr() { const date = /* @__PURE__ */ new Date(); const dateStr = date.toISOString().split("T")[0]; return dateStr; } function generateCSVFileName(name = "", params = {}) { const fileNameSections = [ name.toLowerCase().replace(/[^a-z0-9]/g, "-"), todayDateStr(), Object.keys(params).map( (key) => key.toLowerCase().replace(/[^a-z0-9]/g, "-") + "-" + decodeURIComponent(params[key]).toLowerCase().replace(/[^a-z0-9]/g, "-") ).join("_") ].filter((text) => text.length); return fileNameSections.join("_") + ".csv"; } function downloadCSVFile(fileName, content) { const blob = new Blob([content], { type: "text/csv;charset=utf-8" }); saveAs(blob, fileName); } export { downloadCSVFile, generateCSVDataFromTable, generateCSVFileName };