UNPKG

file-streamer

Version:

A TypeScript package for streaming data as files (Excel, CSV, JSON, Base64) and streaming files from file system through HTTP responses

110 lines 3.75 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.pipeJsonAsJson = exports.pipeJsonAsCsv = exports.pipeJsonAsExcel = exports.jsonToExcelBuffer = void 0; const exceljs_1 = __importDefault(require("exceljs")); const jsonToExcelBuffer = async (data, sheetName = 'Sheet1') => { const workbook = new exceljs_1.default.Workbook(); const worksheet = workbook.addWorksheet(sheetName); if (data.length === 0) { worksheet.addRow(['No data']); } else { worksheet.columns = Object.keys(data[0]).map((key) => ({ header: key, key: key, width: 20 })); data.forEach((item) => { worksheet.addRow(item); }); } return workbook; }; exports.jsonToExcelBuffer = jsonToExcelBuffer; const pipeJsonAsExcel = async (res, data, fileName) => { try { let responseFileName = !fileName ? 'data.xlsx' : fileName.endsWith('.xlsx') ? fileName : `${fileName}.xlsx`; res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); res.setHeader('Content-Disposition', `attachment; filename=${responseFileName}`); const workbook = await (0, exports.jsonToExcelBuffer)(data); workbook.xlsx.write(res); } catch (err) { console.error(err); throw err; } }; exports.pipeJsonAsExcel = pipeJsonAsExcel; const pipeJsonAsCsv = async (res, data, fileName) => { try { let responseFileName = !fileName ? 'data.csv' : fileName.endsWith('.csv') ? fileName : `${fileName}.csv`; res.setHeader('Content-Type', 'text/csv'); res.setHeader('Content-Disposition', `attachment; filename=${responseFileName}`); if (data.length === 0) { res.write('No data'); res.end(); return; } const headers = Object.keys(data[0]); const headerRow = headers.join(','); res.write(headerRow + '\n'); data.forEach((item) => { const row = headers.map((header) => { const value = item[header]; if (typeof value === 'string' && (value.includes(',') || value.includes('"') || value.includes('\n'))) { return `"${value.replace(/"/g, '""')}"`; } return value ?? ''; }); res.write(row.join(',') + '\n'); }); res.end(); } catch (err) { console.error(err); throw err; } }; exports.pipeJsonAsCsv = pipeJsonAsCsv; const pipeJsonAsJson = async (res, data, fileName) => { try { let responseFileName = !fileName ? 'data.json' : fileName.endsWith('.json') ? fileName : `${fileName}.json`; res.setHeader('Content-Type', 'application/json'); res.setHeader('Content-Disposition', `attachment; filename=${responseFileName}`); res.write('[\n'); data.forEach((item, index) => { const isLast = index === data.length - 1; res.write(JSON.stringify(item, null, 2)); if (!isLast) { res.write(',\n'); } else { res.write('\n'); } }); res.write(']\n'); res.end(); } catch (err) { console.error(err); throw err; } }; exports.pipeJsonAsJson = pipeJsonAsJson; //# sourceMappingURL=stream-json.js.map