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
JavaScript
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
;