@eristack/spreadsheet-render
Version:
Declarative workbook model and xlsx/csv render drivers — ExcelJS/SheetJS in app or adapter
60 lines (59 loc) • 1.67 kB
JavaScript
// src/core/renderer.ts
function escapeCsvCell(value) {
if (/[",\n\r]/.test(value)) {
return `"${value.replaceAll('"', '""')}"`;
}
return value;
}
function workbookToCsv(workbook) {
const sheet = workbook.sheets[0];
if (!sheet) return "";
const header = sheet.columns.map((c) => escapeCsvCell(c.header)).join(",");
const body = sheet.rows.map(
(row) => sheet.columns.map((c) => escapeCsvCell(row[c.key] ?? "")).join(",")
);
return [header, ...body].join("\n");
}
function createSpreadsheetRenderer(driver) {
return {
renderWorkbook(workbook, format) {
return driver.renderWorkbook(workbook, format);
}
};
}
function createStubSpreadsheetDriver() {
return {
async renderWorkbook(workbook, format) {
if (format === "csv") {
const text = workbookToCsv(workbook);
return {
bytes: new TextEncoder().encode(text),
contentType: "text/csv; charset=utf-8"
};
}
const marker = `PK-stub-xlsx:${workbook.sheets.length}`;
return {
bytes: new TextEncoder().encode(marker),
contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
};
}
};
}
// src/core/workbook.ts
function workbookFromRows(sheetName, columns, rows) {
const sheetRows = rows.map((cells) => {
const record = {};
columns.forEach((col, index) => {
record[col.key] = cells[index] ?? "";
});
return record;
});
const sheet = { name: sheetName, columns, rows: sheetRows };
return { sheets: [sheet] };
}
export {
createSpreadsheetRenderer,
createStubSpreadsheetDriver,
workbookFromRows
};
//# sourceMappingURL=index.js.map