@woocommerce/csv-export
Version:
WooCommerce utility library to convert data to CSV files.
64 lines (63 loc) • 1.95 kB
JavaScript
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
};