Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@atomictech/xlsx-write-stream

Package Overview
Dependencies
Maintainers
3
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@atomictech/xlsx-write-stream - npm Package Compare versions

Comparing version 1.0.3 to 1.1.0

10

dist/XLSXRowTransform.js

@@ -19,6 +19,8 @@ "use strict";

* @param {Object} [options]
* @param {Boolean} [options.format=true] - If set to false writer will not format cells with number, date, boolean and text. Default: true.
* @param {Boolean} [options.headers=false] - If set to true writer will output first row with an header style.
* @param {Boolean} [options.format=true] - If set to false writer will not format cells with number, date, boolean and text.
* @param {Styles} [options.styles=new Styles()] - If set you can overwrite default standard type styles by other standard ones or even define custom `formatCode`.
*/
constructor({
headers = false,
format = true,

@@ -31,4 +33,6 @@ styles = new _templates.Styles()

this.rowCount = 0;
this.headers = headers;
this.format = format;
this.styles = styles;
if (this.headers) throw new Error('Headers special style output not yet implemented.');
}

@@ -41,4 +45,2 @@ /**

_transform(row, encoding, callback) {
if (!Array.isArray(row)) return callback(); // TODO: Handle row as Object with column headers as keys
const xlsxRow = (0, _templates.Row)(this.rowCount, row, this.format, this.styles);

@@ -52,2 +54,2 @@ this.rowCount++;

exports.default = XLSXRowTransform;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9YTFNYUm93VHJhbnNmb3JtLmpzIl0sIm5hbWVzIjpbIlhMU1hSb3dUcmFuc2Zvcm0iLCJUcmFuc2Zvcm0iLCJjb25zdHJ1Y3RvciIsImZvcm1hdCIsInN0eWxlcyIsIlN0eWxlcyIsIm9iamVjdE1vZGUiLCJyb3dDb3VudCIsIl90cmFuc2Zvcm0iLCJyb3ciLCJlbmNvZGluZyIsImNhbGxiYWNrIiwiQXJyYXkiLCJpc0FycmF5IiwieGxzeFJvdyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUVBOzs7QUFHZSxNQUFNQSxnQkFBTixTQUErQkMsaUJBQS9CLENBQXlDO0FBQ3REOzs7Ozs7QUFNQUMsRUFBQUEsV0FBVyxDQUFDO0FBQUVDLElBQUFBLE1BQU0sR0FBRyxJQUFYO0FBQWlCQyxJQUFBQSxNQUFNLEdBQUcsSUFBSUMsaUJBQUo7QUFBMUIsR0FBRCxFQUEyQztBQUNwRCxVQUFNO0FBQUVDLE1BQUFBLFVBQVUsRUFBRTtBQUFkLEtBQU47QUFDQSxTQUFLQyxRQUFMLEdBQWdCLENBQWhCO0FBQ0EsU0FBS0osTUFBTCxHQUFjQSxNQUFkO0FBQ0EsU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBQ0Q7QUFFRDs7Ozs7QUFHQUksRUFBQUEsVUFBVSxDQUFDQyxHQUFELEVBQU1DLFFBQU4sRUFBZ0JDLFFBQWhCLEVBQTBCO0FBQ2xDLFFBQUksQ0FBQ0MsS0FBSyxDQUFDQyxPQUFOLENBQWNKLEdBQWQsQ0FBTCxFQUF5QixPQUFPRSxRQUFRLEVBQWYsQ0FEUyxDQUNVOztBQUU1QyxVQUFNRyxPQUFPLEdBQUcsb0JBQUksS0FBS1AsUUFBVCxFQUFtQkUsR0FBbkIsRUFBd0IsS0FBS04sTUFBN0IsRUFBcUMsS0FBS0MsTUFBMUMsQ0FBaEI7QUFDQSxTQUFLRyxRQUFMO0FBQ0FJLElBQUFBLFFBQVEsQ0FBQyxJQUFELEVBQU9HLE9BQVAsQ0FBUjtBQUNEOztBQXZCcUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2Zvcm0gfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUm93LCBTdHlsZXMgfSBmcm9tICcuL3RlbXBsYXRlcyc7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgWExTWCBSb3cgdHJhbnNmb3JtYXRpb24gZnJvbSBhcnJheSB0byBSb3cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFhMU1hSb3dUcmFuc2Zvcm0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogQ3JlYXRlIG5ldyB4bHN4IHJvdyB0cmFuc2Zvcm0gc3RyZWFtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mb3JtYXQ9dHJ1ZV0gLSBJZiBzZXQgdG8gZmFsc2Ugd3JpdGVyIHdpbGwgbm90IGZvcm1hdCBjZWxscyB3aXRoIG51bWJlciwgZGF0ZSwgYm9vbGVhbiBhbmQgdGV4dC4gRGVmYXVsdDogdHJ1ZS5cbiAgICogQHBhcmFtIHtTdHlsZXN9IFtvcHRpb25zLnN0eWxlcz1uZXcgU3R5bGVzKCldIC0gSWYgc2V0IHlvdSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgc3RhbmRhcmQgdHlwZSBzdHlsZXMgYnkgb3RoZXIgc3RhbmRhcmQgb25lcyBvciBldmVuIGRlZmluZSBjdXN0b20gYGZvcm1hdENvZGVgLlxuICAgKi9cbiAgY29uc3RydWN0b3IoeyBmb3JtYXQgPSB0cnVlLCBzdHlsZXMgPSBuZXcgU3R5bGVzKCkgfSkge1xuICAgIHN1cGVyKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgICB0aGlzLnJvd0NvdW50ID0gMDtcbiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gYXJyYXkgdG8gcm93IHN0cmluZ1xuICAgKi9cbiAgX3RyYW5zZm9ybShyb3csIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShyb3cpKSByZXR1cm4gY2FsbGJhY2soKTsgLy8gVE9ETzogSGFuZGxlIHJvdyBhcyBPYmplY3Qgd2l0aCBjb2x1bW4gaGVhZGVycyBhcyBrZXlzXG5cbiAgICBjb25zdCB4bHN4Um93ID0gUm93KHRoaXMucm93Q291bnQsIHJvdywgdGhpcy5mb3JtYXQsIHRoaXMuc3R5bGVzKTtcbiAgICB0aGlzLnJvd0NvdW50Kys7XG4gICAgY2FsbGJhY2sobnVsbCwgeGxzeFJvdyk7XG4gIH1cbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9YTFNYUm93VHJhbnNmb3JtLmpzIl0sIm5hbWVzIjpbIlhMU1hSb3dUcmFuc2Zvcm0iLCJUcmFuc2Zvcm0iLCJjb25zdHJ1Y3RvciIsImhlYWRlcnMiLCJmb3JtYXQiLCJzdHlsZXMiLCJTdHlsZXMiLCJvYmplY3RNb2RlIiwicm93Q291bnQiLCJFcnJvciIsIl90cmFuc2Zvcm0iLCJyb3ciLCJlbmNvZGluZyIsImNhbGxiYWNrIiwieGxzeFJvdyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUVBOzs7QUFHZSxNQUFNQSxnQkFBTixTQUErQkMsaUJBQS9CLENBQXlDO0FBQ3REOzs7Ozs7O0FBT0FDLEVBQUFBLFdBQVcsQ0FBQztBQUFFQyxJQUFBQSxPQUFPLEdBQUcsS0FBWjtBQUFtQkMsSUFBQUEsTUFBTSxHQUFHLElBQTVCO0FBQWtDQyxJQUFBQSxNQUFNLEdBQUcsSUFBSUMsaUJBQUo7QUFBM0MsR0FBRCxFQUE0RDtBQUNyRSxVQUFNO0FBQUVDLE1BQUFBLFVBQVUsRUFBRTtBQUFkLEtBQU47QUFFQSxTQUFLQyxRQUFMLEdBQWdCLENBQWhCO0FBQ0EsU0FBS0wsT0FBTCxHQUFlQSxPQUFmO0FBQ0EsU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBRUEsUUFBSSxLQUFLRixPQUFULEVBQWtCLE1BQU0sSUFBSU0sS0FBSixDQUFVLG1EQUFWLENBQU47QUFDbkI7QUFFRDs7Ozs7QUFHQUMsRUFBQUEsVUFBVSxDQUFDQyxHQUFELEVBQU1DLFFBQU4sRUFBZ0JDLFFBQWhCLEVBQTBCO0FBQ2xDLFVBQU1DLE9BQU8sR0FBRyxvQkFBSSxLQUFLTixRQUFULEVBQW1CRyxHQUFuQixFQUF3QixLQUFLUCxNQUE3QixFQUFxQyxLQUFLQyxNQUExQyxDQUFoQjtBQUNBLFNBQUtHLFFBQUw7QUFDQUssSUFBQUEsUUFBUSxDQUFDLElBQUQsRUFBT0MsT0FBUCxDQUFSO0FBQ0Q7O0FBMUJxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zZm9ybSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBSb3csIFN0eWxlcyB9IGZyb20gJy4vdGVtcGxhdGVzJztcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBYTFNYIFJvdyB0cmFuc2Zvcm1hdGlvbiBmcm9tIGFycmF5IHRvIFJvdy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgWExTWFJvd1RyYW5zZm9ybSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgbmV3IHhsc3ggcm93IHRyYW5zZm9ybSBzdHJlYW1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmhlYWRlcnM9ZmFsc2VdIC0gSWYgc2V0IHRvIHRydWUgd3JpdGVyIHdpbGwgb3V0cHV0IGZpcnN0IHJvdyB3aXRoIGFuIGhlYWRlciBzdHlsZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mb3JtYXQ9dHJ1ZV0gLSBJZiBzZXQgdG8gZmFsc2Ugd3JpdGVyIHdpbGwgbm90IGZvcm1hdCBjZWxscyB3aXRoIG51bWJlciwgZGF0ZSwgYm9vbGVhbiBhbmQgdGV4dC5cbiAgICogQHBhcmFtIHtTdHlsZXN9IFtvcHRpb25zLnN0eWxlcz1uZXcgU3R5bGVzKCldIC0gSWYgc2V0IHlvdSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgc3RhbmRhcmQgdHlwZSBzdHlsZXMgYnkgb3RoZXIgc3RhbmRhcmQgb25lcyBvciBldmVuIGRlZmluZSBjdXN0b20gYGZvcm1hdENvZGVgLlxuICAgKi9cbiAgY29uc3RydWN0b3IoeyBoZWFkZXJzID0gZmFsc2UsIGZvcm1hdCA9IHRydWUsIHN0eWxlcyA9IG5ldyBTdHlsZXMoKSB9KSB7XG4gICAgc3VwZXIoeyBvYmplY3RNb2RlOiB0cnVlIH0pO1xuXG4gICAgdGhpcy5yb3dDb3VudCA9IDA7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcblxuICAgIGlmICh0aGlzLmhlYWRlcnMpIHRocm93IG5ldyBFcnJvcignSGVhZGVycyBzcGVjaWFsIHN0eWxlIG91dHB1dCBub3QgeWV0IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBhcnJheSB0byByb3cgc3RyaW5nXG4gICAqL1xuICBfdHJhbnNmb3JtKHJvdywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgeGxzeFJvdyA9IFJvdyh0aGlzLnJvd0NvdW50LCByb3csIHRoaXMuZm9ybWF0LCB0aGlzLnN0eWxlcyk7XG4gICAgdGhpcy5yb3dDb3VudCsrO1xuICAgIGNhbGxiYWNrKG51bGwsIHhsc3hSb3cpO1xuICB9XG59XG4iXX0=

77

dist/XLSXWriteStream.js

@@ -8,2 +8,4 @@ "use strict";

var _defaultsDeep = _interopRequireDefault(require("lodash/defaultsDeep"));
var _archiver = _interopRequireDefault(require("archiver"));

@@ -23,17 +25,18 @@

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const isBoolean = value => value === !!value;
/**
* XLSX Write Stream base class
*/
class XLSXWriteStream extends _stream.Transform {
/**
* Create new Stream
* Create new stream transform that handles Array or Object as input chunks.
* Be aware that first row chunk is determinant in the transform configuration process for further row chunks.
* @class XLSXWriteStream
* @extends Transform
* @param {Object} [options]
* @param {Array|Boolean} [options.headers=false] - If set to an array they will be printed in first row, no matter what is streamed in input.
* If receiving objects from input stream, only properties given in headers will be printed following headers order.
* If set to true it only has effect when streaming objects in order to print inferred headers in first place.
* @param {Boolean} [options.format=true] - If set to false writer will not format cells with number, date, boolean and text.

@@ -47,9 +50,30 @@ * @param {Object} [options.styleDefs] - If set you can overwrite default standard type styles by other standard ones or even define custom `formatCode`.

});
this.pipelineInitialized = false;
this.initialized = false;
this.options = Object.assign({
this.arrayMode = null;
this.options = (0, _defaultsDeep.default)({}, options, {
headers: false,
format: true,
immediateInitialization: false
}, options);
});
if (this.options.immediateInitialization) this._initializePipeline();
}
_transform(chunk, encoding, callback) {
if (!this.initialized) this._initialize(chunk);
this.toXlsxRow.write(this.normalize(chunk), encoding, callback);
}
_initialize(chunk) {
this._initializePipeline();
this._initializeHeaders(chunk);
if (chunk) {
this.arrayMode = Array.isArray(chunk);
this.normalize = this.arrayMode ? chunk => this.options.headers.map((value, index) => chunk[index]) : chunk => this.options.headers.map(key => chunk[key]);
}
this.initialized = true;
}
/**

@@ -61,2 +85,3 @@ * Initialize pipeline with xlsx archive common files

_initializePipeline() {
if (this.pipelineInitialized) return;
this.zip = (0, _archiver.default)('zip', {

@@ -85,5 +110,6 @@ forceUTC: true

this.zip.on('data', data => this.push(data)).on('warning', err => this.emit('warning', err)).on('error', err => this.error('error', err));
this.toXlsxRow = new _XLSXRowTransform.default(_objectSpread({}, this.options, {
this.toXlsxRow = new _XLSXRowTransform.default({
format: this.options.format,
styles
}));
});
this.sheetStream = new _stream.PassThrough();

@@ -95,12 +121,29 @@ this.sheetStream.write(templates.SheetHeader);

});
this.initialized = true;
this.pipelineInitialized = true;
}
_transform(chunk, encoding, callback) {
if (!this.initialized) this._initializePipeline();
this.toXlsxRow.write(chunk, encoding, callback);
_initializeHeaders(chunk = []) {
const shouldPrintHeaders = !!this.options.headers;
if (Array.isArray(chunk)) {
if (isBoolean(this.options.headers)) {
// Cannot infer headers from an Array
// => Ignore `headers` option silently.
this.options.headers = chunk.map(() => undefined);
return;
}
} else {
if (isBoolean(this.options.headers)) {
// Init headers from chunk
this.options.headers = [...Object.keys(chunk)];
}
}
if (shouldPrintHeaders) {
this.toXlsxRow.write(this.options.headers);
}
}
_flush(callback) {
if (!this.initialized) this._initializePipeline();
if (!this.initialized) this._initialize();

@@ -124,2 +167,2 @@ this._finalize().then(() => {

exports.default = XLSXWriteStream;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9YTFNYV3JpdGVTdHJlYW0uanMiXSwibmFtZXMiOlsiWExTWFdyaXRlU3RyZWFtIiwiVHJhbnNmb3JtIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwib2JqZWN0TW9kZSIsImluaXRpYWxpemVkIiwiT2JqZWN0IiwiYXNzaWduIiwiZm9ybWF0IiwiaW1tZWRpYXRlSW5pdGlhbGl6YXRpb24iLCJfaW5pdGlhbGl6ZVBpcGVsaW5lIiwiemlwIiwiZm9yY2VVVEMiLCJjYXRjaEVhcmx5RXhpdEF0dGFjaGVkIiwiYXBwZW5kIiwidGVtcGxhdGVzIiwiQ29udGVudFR5cGVzIiwibmFtZSIsIlJlbHMiLCJXb3JrYm9vayIsIldvcmtib29rUmVscyIsInN0eWxlcyIsIlN0eWxlcyIsInN0eWxlRGVmcyIsInJlbmRlciIsIm9uIiwiZGF0YSIsInB1c2giLCJlcnIiLCJlbWl0IiwiZXJyb3IiLCJ0b1hsc3hSb3ciLCJYTFNYUm93VHJhbnNmb3JtIiwic2hlZXRTdHJlYW0iLCJQYXNzVGhyb3VnaCIsIndyaXRlIiwiU2hlZXRIZWFkZXIiLCJwaXBlIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZW5jb2RpbmciLCJjYWxsYmFjayIsIl9mbHVzaCIsIl9maW5hbGl6ZSIsInRoZW4iLCJlbmQiLCJTaGVldEZvb3RlciIsImZpbmFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBRUE7OztBQUdlLE1BQU1BLGVBQU4sU0FBOEJDLGlCQUE5QixDQUF3QztBQUNyRDs7Ozs7Ozs7O0FBU0FDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ25CLFVBQU07QUFBRUMsTUFBQUEsVUFBVSxFQUFFO0FBQWQsS0FBTjtBQUVBLFNBQUtDLFdBQUwsR0FBbUIsS0FBbkI7QUFFQSxTQUFLRixPQUFMLEdBQWVHLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQUVDLE1BQUFBLE1BQU0sRUFBRSxJQUFWO0FBQWdCQyxN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QUFDK0IsV0FBL0I7QUFDQSxXQUFPLEtBQUtuQyxHQUFMLENBQVNvQyxRQUFULEVBQVA7QUFDRDs7QUF2RW9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFyY2hpdmVyIGZyb20gJ2FyY2hpdmVyJztcbmltcG9ydCB7IFRyYW5zZm9ybSwgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgdGVtcGxhdGVzIGZyb20gJy4vdGVtcGxhdGVzJztcbmltcG9ydCBYTFNYUm93VHJhbnNmb3JtIGZyb20gJy4vWExTWFJvd1RyYW5zZm9ybSc7XG5cbi8qKlxuICogWExTWCBXcml0ZSBTdHJlYW0gYmFzZSBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYTFNYV3JpdGVTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogQ3JlYXRlIG5ldyBTdHJlYW1cbiAgICogQGNsYXNzIFhMU1hXcml0ZVN0cmVhbVxuICAgKiBAZXh0ZW5kcyBUcmFuc2Zvcm1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvcm1hdD10cnVlXSAtIElmIHNldCB0byBmYWxzZSB3cml0ZXIgd2lsbCBub3QgZm9ybWF0IGNlbGxzIHdpdGggbnVtYmVyLCBkYXRlLCBib29sZWFuIGFuZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc3R5bGVEZWZzXSAtIElmIHNldCB5b3UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IHN0YW5kYXJkIHR5cGUgc3R5bGVzIGJ5IG90aGVyIHN0YW5kYXJkIG9uZXMgb3IgZXZlbiBkZWZpbmUgY3VzdG9tIGBmb3JtYXRDb2RlYC5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbW1lZGlhdGVJbml0aWFsaXphdGlvbj1mYWxzZV0gLSBJZiBzZXQgdG8gdHJ1ZSB3cml0ZXIgd2lsbCBpbml0aWFsaXplIGFyY2hpdmUgYW5kIHN0YXJ0IGNvbXByZXNzaW5nIHhsc3ggY29tbW9uIHN0dWZmIGltbWVkaWF0ZWx5LCBhZGRpbmcgc3Vic2VxdWVudGx5IGEgbGl0dGxlIG1lbW9yeSBhbmQgcHJvY2Vzc29yIGZvb3RwcmludC4gSWYgbm90LCBpbml0aWFsaXphdGlvbiB3aWxsIGJlIGRlbGF5ZWQgdG8gdGhlIGZpcnN0IGRhdGEgcHJvY2Vzc2luZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcih7IG9iamVjdE1vZGU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgZm9ybWF0OiB0cnVlLCBpbW1lZGlhdGVJbml0aWFsaXphdGlvbjogZmFsc2UgfSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmltbWVkaWF0ZUluaXRpYWxpemF0aW9uKSB0aGlzLl9pbml0aWFsaXplUGlwZWxpbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHBpcGVsaW5lIHdpdGggeGxzeCBhcmNoaXZlIGNvbW1vbiBmaWxlc1xuICAgKi9cbiAgX2luaXRpYWxpemVQaXBlbGluZSgpIHtcbiAgICB0aGlzLnppcCA9IEFyY2hpdmVyKCd6aXAnLCB7IGZvcmNlVVRDOiB0cnVlIH0pO1xuICAgIHRoaXMuemlwLmNhdGNoRWFybHlFeGl0QXR0YWNoZWQgPSB0cnVlO1xuXG4gICAgLy8gQ29tbW9uIHhsc3ggYXJjaGl2ZSBmaWxlcyAobm90IGVkaXRhYmxlKVxuICAgIHRoaXMuemlwLmFwcGVuZCh0ZW1wbGF0ZXMuQ29udGVudFR5cGVzLCB7IG5hbWU6ICdbQ29udGVudF9UeXBlc10ueG1sJyB9KTtcbiAgICB0aGlzLnppcC5hcHBlbmQodGVtcGxhdGVzLlJlbHMsIHsgbmFtZTogJ19yZWxzLy5yZWxzJyB9KTtcbiAgICB0aGlzLnppcC5hcHBlbmQodGVtcGxhdGVzLldvcmtib29rLCB7IG5hbWU6ICd4bC93b3JrYm9vay54bWwnIH0pO1xuICAgIHRoaXMuemlwLmFwcGVuZCh0ZW1wbGF0ZXMuV29ya2Jvb2tSZWxzLCB7IG5hbWU6ICd4bC9fcmVscy93b3JrYm9vay54bWwucmVscycgfSk7XG5cbiAgICAvLyBTdHlsZSB4bHN4IGRlZmluaXRpb25zIChvbmUgdGltZSBnZW5lcmF0aW9uKVxuICAgIGNvbnN0IHN0eWxlcyA9IG5ldyB0ZW1wbGF0ZXMuU3R5bGVzKHRoaXMub3B0aW9ucy5zdHlsZURlZnMpO1xuICAgIHRoaXMuemlwLmFwcGVuZChzdHlsZXMucmVuZGVyKCksIHsgbmFtZTogJ3hsL3N0eWxlcy54bWwnIH0pO1xuXG4gICAgdGhpcy56aXBcbiAgICAgIC5vbignZGF0YScsIGRhdGEgPT4gdGhpcy5wdXNoKGRhdGEpKVxuICAgICAgLm9uKCd3YXJuaW5nJywgZXJyID0+IHRoaXMuZW1pdCgnd2FybmluZycsIGVycikpXG4gICAgICAub24oJ2Vycm9yJywgZXJyID0+IHRoaXMuZXJyb3IoJ2Vycm9yJywgZXJyKSk7XG5cbiAgICB0aGlzLnRvWGxzeFJvdyA9IG5ldyBYTFNYUm93VHJhbnNmb3JtKHsgLi4udGhpcy5vcHRpb25zLCBzdHlsZXMgfSk7XG4gICAgdGhpcy5zaGVldFN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgIHRoaXMuc2hlZXRTdHJlYW0ud3JpdGUodGVtcGxhdGVzLlNoZWV0SGVhZGVyKTtcbiAgICB0aGlzLnRvWGxzeFJvdy5waXBlKHRoaXMuc2hlZXRTdHJlYW0pO1xuICAgIHRoaXMuemlwLmFwcGVuZCh0aGlzLnNoZWV0U3RyZWFtLCB7XG4gICAgICBuYW1lOiAneGwvd29ya3NoZWV0cy9zaGVldDEueG1sJ1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHRoaXMuX2luaXRpYWxpemVQaXBlbGluZSgpO1xuICAgIHRoaXMudG9YbHN4Um93LndyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spO1xuICB9XG5cbiAgX2ZsdXNoKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB0aGlzLl9pbml0aWFsaXplUGlwZWxpbmUoKTtcbiAgICB0aGlzLl9maW5hbGl6ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZSB0aGUgemlwIGFyY2hpdmVcbiAgICovXG4gIF9maW5hbGl6ZSgpIHtcbiAgICB0aGlzLnNoZWV0U3RyZWFtLmVuZCh0ZW1wbGF0ZXMuU2hlZXRGb290ZXIpO1xuICAgIHJldHVybiB0aGlzLnppcC5maW5hbGl6ZSgpO1xuICB9XG59XG4iXX0=
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9YTFNYV3JpdGVTdHJlYW0uanMiXSwibmFtZXMiOlsiaXNCb29sZWFuIiwidmFsdWUiLCJYTFNYV3JpdGVTdHJlYW0iLCJUcmFuc2Zvcm0iLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJvYmplY3RNb2RlIiwicGlwZWxpbmVJbml0aWFsaXplZCIsImluaXRpYWxpemVkIiwiYXJyYXlNb2RlIiwiaGVhZGVycyIsImZvcm1hdCIsImltbWVkaWF0ZUluaXRpYWxpemF0aW9uIiwiX2luaXRpYWxpemVQaXBlbGluZSIsIl90cmFuc2Zvcm0iLCJjaHVuayIsImVuY29kaW5nIiwiY2FsbGJhY2siLCJfaW5pdGlhbGl6ZSIsInRvWGxzeFJvdyIsIndyaXRlIiwibm9ybWFsaXplIiwiX2luaXRpYWxpemVIZWFkZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiaW5kZXgiLCJrZXkiLCJ6aXAiLCJmb3JjZVVUQyIsImNhdGNoRWFybHlFeGl0QXR0YWNoZWQiLCJhcHBlbmQiLCJ0ZW1wbGF0ZXMiLCJDb250ZW50VHlwZXMiLCJuYW1lIiwiUmVscyIsIldvcmtib29rIiwiV29ya2Jvb2tSZWxzIiwic3R5bGVzIiwiU3R5bGVzIiwic3R5bGVEZWZzIiwicmVuZGVyIiwib24iLCJkYXRhIiwicHVzaCIsImVyciIsImVtaXQiLCJlcnJvciIsIlhMU1hSb3dUcmFuc2Zvcm0iLCJzaGVldFN0cmVhbSIsIlBhc3NUaHJvdWdoIiwiU2hlZXRIZWFkZXIiLCJwaXBlIiwic2hvdWxkUHJpbnRIZWFkZXJzIiwidW5kZWZpbmVkIiwiT2JqZWN0Iiwia2V5cyIsIl9mbHVzaCIsIl9maW5hbGl6ZSIsInRoZW4iLCJlbmQiLCJTaGVldEZvb3RlciIsImZpbmFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0FBRUEsTUFBTUEsU0FBUyxHQUFHQyxLQUFLLElBQUlBLEtBQUssS0FBSyxDQUFDLENBQUNBLEtBQXZD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SyxLQUFLLENBQUNVLEdBQU4sQ0FBVSxNQUFNNkIsU0FBaEIsQ0FBdkI7QUFDQTtBQUNEO0FBQ0YsS0FQRCxNQU9PO0FBQ0wsVUFBSXRELFNBQVMsQ0FBQyxLQUFLSyxPQUFMLENBQWFLLE9BQWQsQ0FBYixFQUFxQztBQUNuQztBQUNBLGFBQUtMLE9BQUwsQ0FBYUssT0FBYixHQUF1QixDQUFDLEdBQUc2QyxNQUFNLENBQUNDLElBQVAsQ0FBWXpDLEtBQVosQ0FBSixDQUF2QjtBQUNEO0FBQ0Y7O0FBRUQsUUFBSXNDLGtCQUFKLEVBQXdCO0FBQ3RCLFdBQUtsQyxTQUFMLENBQWVDLEtBQWYsQ0FBcUIsS0FBS2YsT0FBTCxDQUFhSyxPQUFsQztBQUNEO0FBQ0Y7O0FBRUQrQyxFQUFBQSxNQUFNLENBQUN4QyxRQUFELEVBQVc7QUFDZixRQUFJLENBQUMsS0FBS1QsV0FBVixFQUF1QixLQUFLVSxXQUFMOztBQUN2QixTQUFLd0MsU0FBTCxHQUFpQkMsSUFBakIsQ0FBc0IsTUFBTTtBQUMxQjFDLE1BQUFBLFFBQVE7QUFDVCxLQUZEO0FBR0Q7QUFFRDs7Ozs7QUFHQXlDLEVBQUFBLFNBQVMsR0FBRztBQUNWLFNBQUtULFdBQUwsQ0FBaUJXLEdBQWpCLENBQXFCNUIsU0FBUyxDQUFDNkIsV0FBL0I7QUFDQSxXQUFPLEtBQUtqQyxHQUFMLENBQVNrQyxRQUFULEVBQVA7QUFDRDs7QUFwSG9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlZmF1bHRzRGVlcCBmcm9tICdsb2Rhc2gvZGVmYXVsdHNEZWVwJztcbmltcG9ydCBBcmNoaXZlciBmcm9tICdhcmNoaXZlcic7XG5pbXBvcnQgeyBUcmFuc2Zvcm0sIFBhc3NUaHJvdWdoIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCAqIGFzIHRlbXBsYXRlcyBmcm9tICcuL3RlbXBsYXRlcyc7XG5pbXBvcnQgWExTWFJvd1RyYW5zZm9ybSBmcm9tICcuL1hMU1hSb3dUcmFuc2Zvcm0nO1xuXG5jb25zdCBpc0Jvb2xlYW4gPSB2YWx1ZSA9PiB2YWx1ZSA9PT0gISF2YWx1ZTtcblxuLyoqXG4gKiBYTFNYIFdyaXRlIFN0cmVhbSBiYXNlIGNsYXNzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFhMU1hXcml0ZVN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgbmV3IHN0cmVhbSB0cmFuc2Zvcm0gdGhhdCBoYW5kbGVzIEFycmF5IG9yIE9iamVjdCBhcyBpbnB1dCBjaHVua3MuXG4gICAqIEJlIGF3YXJlIHRoYXQgZmlyc3Qgcm93IGNodW5rIGlzIGRldGVybWluYW50IGluIHRoZSB0cmFuc2Zvcm0gY29uZmlndXJhdGlvbiBwcm9jZXNzIGZvciBmdXJ0aGVyIHJvdyBjaHVua3MuXG4gICAqIEBjbGFzcyBYTFNYV3JpdGVTdHJlYW1cbiAgICogQGV4dGVuZHMgVHJhbnNmb3JtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtBcnJheXxCb29sZWFufSBbb3B0aW9ucy5oZWFkZXJzPWZhbHNlXSAtIElmIHNldCB0byBhbiBhcnJheSB0aGV5IHdpbGwgYmUgcHJpbnRlZCBpbiBmaXJzdCByb3csIG5vIG1hdHRlciB3aGF0IGlzIHN0cmVhbWVkIGluIGlucHV0LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcmVjZWl2aW5nIG9iamVjdHMgZnJvbSBpbnB1dCBzdHJlYW0sIG9ubHkgcHJvcGVydGllcyBnaXZlbiBpbiBoZWFkZXJzIHdpbGwgYmUgcHJpbnRlZCBmb2xsb3dpbmcgaGVhZGVycyBvcmRlci5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byB0cnVlIGl0IG9ubHkgaGFzIGVmZmVjdCB3aGVuIHN0cmVhbWluZyBvYmplY3RzIGluIG9yZGVyIHRvIHByaW50IGluZmVycmVkIGhlYWRlcnMgaW4gZmlyc3QgcGxhY2UuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9ybWF0PXRydWVdIC0gSWYgc2V0IHRvIGZhbHNlIHdyaXRlciB3aWxsIG5vdCBmb3JtYXQgY2VsbHMgd2l0aCBudW1iZXIsIGRhdGUsIGJvb2xlYW4gYW5kIHRleHQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zdHlsZURlZnNdIC0gSWYgc2V0IHlvdSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgc3RhbmRhcmQgdHlwZSBzdHlsZXMgYnkgb3RoZXIgc3RhbmRhcmQgb25lcyBvciBldmVuIGRlZmluZSBjdXN0b20gYGZvcm1hdENvZGVgLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmltbWVkaWF0ZUluaXRpYWxpemF0aW9uPWZhbHNlXSAtIElmIHNldCB0byB0cnVlIHdyaXRlciB3aWxsIGluaXRpYWxpemUgYXJjaGl2ZSBhbmQgc3RhcnQgY29tcHJlc3NpbmcgeGxzeCBjb21tb24gc3R1ZmYgaW1tZWRpYXRlbHksIGFkZGluZyBzdWJzZXF1ZW50bHkgYSBsaXR0bGUgbWVtb3J5IGFuZCBwcm9jZXNzb3IgZm9vdHByaW50LiBJZiBub3QsIGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZGVsYXllZCB0byB0aGUgZmlyc3QgZGF0YSBwcm9jZXNzaW5nLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMucGlwZWxpbmVJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmFycmF5TW9kZSA9IG51bGw7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBkZWZhdWx0c0RlZXAoe30sIG9wdGlvbnMsIHsgaGVhZGVyczogZmFsc2UsIGZvcm1hdDogdHJ1ZSwgaW1tZWRpYXRlSW5pdGlhbGl6YXRpb246IGZhbHNlIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbW1lZGlhdGVJbml0aWFsaXphdGlvbikgdGhpcy5faW5pdGlhbGl6ZVBpcGVsaW5lKCk7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHRoaXMuX2luaXRpYWxpemUoY2h1bmspO1xuXG4gICAgdGhpcy50b1hsc3hSb3cud3JpdGUodGhpcy5ub3JtYWxpemUoY2h1bmspLCBlbmNvZGluZywgY2FsbGJhY2spO1xuICB9XG5cbiAgX2luaXRpYWxpemUoY2h1bmspIHtcbiAgICB0aGlzLl9pbml0aWFsaXplUGlwZWxpbmUoKTtcbiAgICB0aGlzLl9pbml0aWFsaXplSGVhZGVycyhjaHVuayk7XG5cbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYXJyYXlNb2RlID0gQXJyYXkuaXNBcnJheShjaHVuayk7XG4gICAgICB0aGlzLm5vcm1hbGl6ZSA9IHRoaXMuYXJyYXlNb2RlXG4gICAgICAgID8gY2h1bmsgPT4gdGhpcy5vcHRpb25zLmhlYWRlcnMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IGNodW5rW2luZGV4XSlcbiAgICAgICAgOiBjaHVuayA9PiB0aGlzLm9wdGlvbnMuaGVhZGVycy5tYXAoa2V5ID0+IGNodW5rW2tleV0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcGlwZWxpbmUgd2l0aCB4bHN4IGFyY2hpdmUgY29tbW9uIGZpbGVzXG4gICAqL1xuICBfaW5pdGlhbGl6ZVBpcGVsaW5lKCkge1xuICAgIGlmICh0aGlzLnBpcGVsaW5lSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgIHRoaXMuemlwID0gQXJjaGl2ZXIoJ3ppcCcsIHsgZm9yY2VVVEM6IHRydWUgfSk7XG4gICAgdGhpcy56aXAuY2F0Y2hFYXJseUV4aXRBdHRhY2hlZCA9IHRydWU7XG5cbiAgICAvLyBDb21tb24geGxzeCBhcmNoaXZlIGZpbGVzIChub3QgZWRpdGFibGUpXG4gICAgdGhpcy56aXAuYXBwZW5kKHRlbXBsYXRlcy5Db250ZW50VHlwZXMsIHsgbmFtZTogJ1tDb250ZW50X1R5cGVzXS54bWwnIH0pO1xuICAgIHRoaXMuemlwLmFwcGVuZCh0ZW1wbGF0ZXMuUmVscywgeyBuYW1lOiAnX3JlbHMvLnJlbHMnIH0pO1xuICAgIHRoaXMuemlwLmFwcGVuZCh0ZW1wbGF0ZXMuV29ya2Jvb2ssIHsgbmFtZTogJ3hsL3dvcmtib29rLnhtbCcgfSk7XG4gICAgdGhpcy56aXAuYXBwZW5kKHRlbXBsYXRlcy5Xb3JrYm9va1JlbHMsIHsgbmFtZTogJ3hsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzJyB9KTtcblxuICAgIC8vIFN0eWxlIHhsc3ggZGVmaW5pdGlvbnMgKG9uZSB0aW1lIGdlbmVyYXRpb24pXG4gICAgY29uc3Qgc3R5bGVzID0gbmV3IHRlbXBsYXRlcy5TdHlsZXModGhpcy5vcHRpb25zLnN0eWxlRGVmcyk7XG4gICAgdGhpcy56aXAuYXBwZW5kKHN0eWxlcy5yZW5kZXIoKSwgeyBuYW1lOiAneGwvc3R5bGVzLnhtbCcgfSk7XG5cbiAgICB0aGlzLnppcFxuICAgICAgLm9uKCdkYXRhJywgZGF0YSA9PiB0aGlzLnB1c2goZGF0YSkpXG4gICAgICAub24oJ3dhcm5pbmcnLCBlcnIgPT4gdGhpcy5lbWl0KCd3YXJuaW5nJywgZXJyKSlcbiAgICAgIC5vbignZXJyb3InLCBlcnIgPT4gdGhpcy5lcnJvcignZXJyb3InLCBlcnIpKTtcblxuICAgIHRoaXMudG9YbHN4Um93ID0gbmV3IFhMU1hSb3dUcmFuc2Zvcm0oeyBmb3JtYXQ6IHRoaXMub3B0aW9ucy5mb3JtYXQsIHN0eWxlcyB9KTtcbiAgICB0aGlzLnNoZWV0U3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgdGhpcy5zaGVldFN0cmVhbS53cml0ZSh0ZW1wbGF0ZXMuU2hlZXRIZWFkZXIpO1xuICAgIHRoaXMudG9YbHN4Um93LnBpcGUodGhpcy5zaGVldFN0cmVhbSk7XG4gICAgdGhpcy56aXAuYXBwZW5kKHRoaXMuc2hlZXRTdHJlYW0sIHtcbiAgICAgIG5hbWU6ICd4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwnXG4gICAgfSk7XG5cbiAgICB0aGlzLnBpcGVsaW5lSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgX2luaXRpYWxpemVIZWFkZXJzKGNodW5rID0gW10pIHtcbiAgICBjb25zdCBzaG91bGRQcmludEhlYWRlcnMgPSAhIXRoaXMub3B0aW9ucy5oZWFkZXJzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgICBpZiAoaXNCb29sZWFuKHRoaXMub3B0aW9ucy5oZWFkZXJzKSkge1xuICAgICAgICAvLyBDYW5ub3QgaW5mZXIgaGVhZGVycyBmcm9tIGFuIEFycmF5XG4gICAgICAgIC8vID0+IElnbm9yZSBgaGVhZGVyc2Agb3B0aW9uIHNpbGVudGx5LlxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGNodW5rLm1hcCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0Jvb2xlYW4odGhpcy5vcHRpb25zLmhlYWRlcnMpKSB7XG4gICAgICAgIC8vIEluaXQgaGVhZGVycyBmcm9tIGNodW5rXG4gICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gWy4uLk9iamVjdC5rZXlzKGNodW5rKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFByaW50SGVhZGVycykge1xuICAgICAgdGhpcy50b1hsc3hSb3cud3JpdGUodGhpcy5vcHRpb25zLmhlYWRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIF9mbHVzaChjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuX2ZpbmFsaXplKCkudGhlbigoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplIHRoZSB6aXAgYXJjaGl2ZVxuICAgKi9cbiAgX2ZpbmFsaXplKCkge1xuICAgIHRoaXMuc2hlZXRTdHJlYW0uZW5kKHRlbXBsYXRlcy5TaGVldEZvb3Rlcik7XG4gICAgcmV0dXJuIHRoaXMuemlwLmZpbmFsaXplKCk7XG4gIH1cbn1cbiJdfQ==
{
"name": "@atomictech/xlsx-write-stream",
"version": "1.0.3",
"version": "1.1.0",
"description": "Stream huge amount of data into an XLSX generated file stream with minimum memory footprint.",

@@ -50,2 +50,3 @@ "main": "dist/index.js",

"archiver": "^3.1.1",
"lodash": "^4.17.15",
"xml-escape": "^1.1.0"

@@ -52,0 +53,0 @@ },

@@ -19,4 +19,5 @@ # ⏩ XLSX Write Stream ⏩

- [🦄 Usage](#%f0%9f%a6%84-usage)
- [Basic](#basic)
- [Custom Styles](#custom-styles)
- [Basic pipe](#basic-pipe)
- [Basic write](#basic-write)
- [Custom styles](#custom-styles)
- [🔧 API](#%f0%9f%94%a7-api)

@@ -35,3 +36,3 @@ - [XLSXWriteStream ⇐ `Transform`](#xlsxwritestream-%e2%87%90-transform)

```sh
npm install '@atomictech/xlsx-write-stream'
npm install @atomictech/xlsx-write-stream
```

@@ -41,7 +42,26 @@

### Basic
For all usages keep in mind that you should feed your `XLSXWriteStream` instance one row at a time, where a row could be an array or an object.
```js
import XLSXWriteStream from 'xlsx-write-stream';
const row = [1, '02', new Date('2015-10-21T16:29:00.000Z'), true, false, '🦄'];
```
or
```js
const row = {
'A Number Column': 1,
'A Text Column': '02',
'A Date Column': new Date('2015-10-21T16:29:00.000Z'),
'A Boolean Column': true,
'Another Boolean Column': false,
'Another Text Column': '🦄'
};
```
### Basic pipe
```js
import XLSXWriteStream from '@atomictech/xlsx-write-stream';
// Initialize the writer

@@ -54,9 +74,19 @@ const xlsxWriter = new XLSXWriteStream();

// xlsxWriter should be feed with chunks representing a row as an array of values.
// Cell values type supported are: string, number, boolean and date.
// Pipe the writer into a Stream.Writable output stream in order to retrieve XLSX file data,
// write it into file or send it as HTTP response.
const writeStream = fs.createWriteStream('file.xlsx');
xlsxWriter.pipe(writeStream);
```
// Alternatively you can use the writer `write(chunk)` method in order to fill your xlsx.
const row = [1, '02', new Date('2015-10-21T16:29:00.000Z'), true, false];
xlsxWriter.write(row);
### Basic write
```js
import XLSXWriteStream from '@atomictech/xlsx-write-stream';
// [optional] Define some headers
const headers = ['A Number Column', 'A Text Column', 'A Date Column', 'A Boolean Column', 'Another Boolean Column', 'Another Text Column'];
// Initialize the writer
const xlsxWriter = new XLSXWriteStream({ headers });
// Pipe the writer into a Stream.Writable output stream in order to retrieve XLSX file data,

@@ -66,10 +96,20 @@ // write it into file or send it as HTTP response.

xlsxWriter.pipe(writeStream);
// Write rows one by one with
const row = [1, '02', new Date('2015-10-21T16:29:00.000Z'), true, false, '🦄'];
xlsxWriter.write(row);
xlsxWriter.end(); // Do not forget to end the stream!
```
### Custom Styles
⚠️ **Caution** ⚠️
If you are not familiar with streams, in order to take advantage of the smallest memory footprint possible with this form, you need to be aware of backpressure concept and use the boolean returned by the write function!
> See explanations here: [writable.write(chunk[, encoding][, callback])](https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback)
### Custom styles
An `options.styleDefs` parameter is available in order to redefine type style formats.
```js
import { TypeStyleKey } from 'xlsx-write-stream';
import { TypeStyleKey } from '@atomictech/xlsx-write-stream';

@@ -93,7 +133,11 @@ // Declare custom styles definitions

Create new stream transform that handles Array or Object as input chunks.
Be aware that first row chunk is determinant in the transform configuration process for further row chunks.
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| [options] | `Object` | | |
| [options.headers] | `Array|Boolean` | `false` | If set to an array they will be printed in first row, no matter what is streamed in input. If receiving objects from input stream, only properties given in headers will be printed following headers order. If set to true it only has effect when streaming objects in order to print inferred headers in first place.|
| [options.format] | `Boolean` | `true` | If set to false writer will not format cells with number, date, boolean and text. |
| [options.styleDefs] | [`StyleDefs`](###styledefs) | | If set you can overwrite default standard type styles by other standard ones or even define custom `formatCode`. |
| [options.styleDefs] | [`StyleDefs`](#styledefs) | | If set you can overwrite default standard type styles by other standard ones or even define custom `formatCode`. |
| [options.immediateInitialization] | `Boolean` | `false` | If set to true writer will initialize archive and start compressing xlsx common stuff immediately, adding subsequently a little memory and processor footprint. If not, initialization will be delayed to the first data processing. |

@@ -170,3 +214,3 @@

- comments
- ... and a myriad of other OOXML features. It's strictly an CSV replacement.
- ... and a myriad of other OOXML features. It's strictly a CSV replacement.

@@ -173,0 +217,0 @@ ## 👥 Authors

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