Socket
Socket
Sign inDemoInstall

hapi-csv

Package Overview
Dependencies
Maintainers
3
Versions
41
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hapi-csv - npm Package Compare versions

Comparing version 4.2.0 to 4.3.1

184

lib/index.js

@@ -6,4 +6,6 @@ 'use strict';

const Async = require('async');
const XLSX = require('xlsx');
const ExcelJs = require('exceljs');
const FastCsv = require('fast-csv');
const internals = {

@@ -19,3 +21,5 @@ routeMap: new Map()

// Build up routeMap for all routes on all connections
/**
* Build up routeMap for all routes on all connections
*/
server.ext('onPreStart', (srv, nxt) => {

@@ -36,3 +40,5 @@

// allow .csv requests
/**
* allow .csv or .xlsx requests
*/
server.ext('onRequest', (request, reply) => {

@@ -104,14 +110,30 @@

if (internals.enableExcel && preferredType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
const fileName = request.path.substring(request.path.lastIndexOf('/') + 1 || 0, request.path.length);
const xlsx = internals.processSchema(schema, resolvedSchemasObject, request.response.source, options.resultKey, internals.headerQueryMapToExcel);
const excel = XLSX.write(xlsx, { bookType: 'xlsx', bookSST: false, type: 'buffer', compression: true, ...options.excelWriteOptions });
const response = reply(excel);
return response.encoding('base64').type(`${preferredType}; charset=${response.settings.charset}; header=present;`).header(`'content-disposition', 'attachment'; filename=${fileName}.xlsx;`).header('Content-Length', excel.length);
}
internals.processSchema(schema, resolvedSchemasObject, request.response.source, options.resultKey, (headerQueryMap, dataset) => {
const csv = internals.processSchema(schema, resolvedSchemasObject, request.response.source, options.resultKey, internals.headerQueryMapToCsv);
const res = request.raw.res;
if (internals.enableExcel && preferredType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
const wbOptions = {
stream: res, // write to server response
useStyles: false,
useSharedStrings: false
};
const response = reply(csv);
return response.type(`${preferredType}; charset=${response.settings.charset}; header=present;`).header('content-disposition', 'attachment;');
const workbook = new ExcelJs.stream.xlsx.WorkbookWriter(wbOptions);
res.setHeader('Content-disposition', 'attachment;');
res.setHeader('Content-type', `${preferredType};`);
internals.headerQueryMapToExcel(headerQueryMap, dataset, workbook);
}
else {
const csvStream = FastCsv.createWriteStream({headers: true});
csvStream.pipe(res);
res.setHeader('Content-disposition', 'attachment;');
res.setHeader('Content-type', `${preferredType};`);
internals.headerQueryMapToCsv(headerQueryMap, dataset, csvStream);
}
});
});

@@ -128,2 +150,11 @@ });

/**
* Take header schema and dataset and prep it for use in csv/xlsx creation
* @param {} schema
* @param {} dynamicSchema
* @param {[]} dataset
* @param {} resultKey
* @param {function (headerQueryMap, dataset)} callback
* @returns {primitiveType | callback}
*/
internals.processSchema = (schema, dynamicSchemas, dataset, resultKey, callback) => {

@@ -225,3 +256,7 @@

// Utility function to convert an array to a Map
/**
* Utility function to convert an array to a Map
* @param {[]} array
* @returns {Map}
*/
internals.arrayToMap = (array) => {

@@ -243,57 +278,67 @@

internals.headerQueryMapToCsv = (headerQueryMap, dataset) => {
/**
* Push data to a csv stream
* @param {Map} headerQueryMap headers
* @param {[{}]} dataset data
* @param {Stream} csvStream
*/
internals.headerQueryMapToCsv = (headerQueryMap, dataset, csvStream) => {
let headerRow = '';
// Generate and set headers row
let headerRow = [];
for (const header of headerQueryMap.keys()) {
headerRow += `${header}${internals.separator}`;
headerRow.push(`${header}`);
}
csvStream.write(headerRow);
let csv = `${headerRow}\n`;
// Push data to stream
internals.generateDataRows(headerQueryMap, dataset, function (dataRow) {
csvStream.write(dataRow);
});
if (!Array.isArray(dataset)) {
dataset = [dataset];
}
// End stream
csvStream.end();
};
let valueFound = true;
/**
* Push data to a excel workbook stream
* @param {Map} headerQueryMap headers
* @param {[{}]} dataset data
* @param {Stream} csvStream
*/
internals.headerQueryMapToExcel = (headerQueryMap, dataset, workbook) => {
for (let i = 0; i < dataset.length; ++i) {
let dataRow = '';
const sheet = workbook.addWorksheet('sheet');
for (const query of headerQueryMap.values()) {
let temp = dataset[i];
// Generate and set headers row
const headerRow = [];
for (const header of headerQueryMap.keys()) {
headerRow.push({
name: header,
header
});
}
sheet.columns = headerRow;
for (const queryPart of query) {
if (temp[queryPart] === null || temp[queryPart] === undefined) {
valueFound = false;
// Push data to stream
internals.generateDataRows(headerQueryMap, dataset, function (dataRow) {
sheet.addRow(dataRow).commit();
});
// We break out of the for loop because there is no need to dig deeper into the object, the object is already undefined or null
break;
}
else {
temp = temp[queryPart];
}
}
if (!valueFound) {
valueFound = true;
}
else {
temp = internals.dateToISOString(temp);
dataRow += `"${internals.escapeQuotesInString(temp)}"`;
}
dataRow += internals.separator;
}
csv += `${dataRow}\n`;
}
return csv.trim();
// End stream
sheet.commit();
workbook.commit();
};
internals.headerQueryMapToExcel = (headerQueryMap, dataset) => {
/**
* Generic function that loops through data and generates rows
* These rows gets processed by the writeRowFunction
* @param {Map} headerQueryMap
* @param {[{}]} dataset
* @param {function (dataRow)} writeRowFunction
*/
internals.generateDataRows = (headerQueryMap, dataset, writeRowFunction) => {
const dataRows = [];
if (!Array.isArray(dataset)) {

@@ -304,6 +349,4 @@ dataset = [dataset];

let valueFound = true;
for (let i = 0; i < dataset.length; ++i) {
const dataRow = {};
const dataRow = [];
for (const key of headerQueryMap.keys()) {

@@ -322,2 +365,3 @@

else {
temp = temp[queryPart];

@@ -329,16 +373,17 @@ }

valueFound = true;
temp = '';
}
temp = internals.dateToISOString(temp);
dataRow[key] = internals.escapeQuotesInString(temp);
dataRow.push(internals.escapeQuotesInString(temp));
}
dataRows.push(dataRow);
writeRowFunction(dataRow);
}
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(dataRows, headerQueryMap.keys()));
return wb;
};
/**
* @param {String} str
* @returns {String}
*/
internals.escapeQuotesInString = (str) => {

@@ -353,2 +398,6 @@

/**
* @param { Date | String} str
* @returns {String}
*/
internals.dateToISOString = (str) => {

@@ -363,2 +412,7 @@

/**
* @param {} route
* @param {} method
* @returns {String}
*/
internals.createRouteMethodString = (route, method) => {

@@ -365,0 +419,0 @@

{
"name": "hapi-csv",
"version": "4.2.0",
"version": "4.3.1",
"description": "Hapi plugin for converting a Joi response schema and dataset to csv",

@@ -27,2 +27,3 @@ "main": "lib/index.js",

"async": "^2.6.1",
"exceljs": "^1.6.3",
"hoek": "^6.0.3",

@@ -29,0 +30,0 @@ "xlsx": "^0.14.1"

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc