@sasjs/adapter
Version:
JavaScript adapter for SAS
1,153 lines (1,086 loc) • 6.38 MB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["SASjs"] = factory();
else
root["SASjs"] = factory();
})(self, () => {
return /******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ 3062:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var Buffer = __webpack_require__(8764)["Buffer"];
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.CsvFormatterStream = void 0;
const stream_1 = __webpack_require__(2830);
const formatter_1 = __webpack_require__(9947);
class CsvFormatterStream extends stream_1.Transform {
constructor(formatterOptions) {
super({ writableObjectMode: formatterOptions.objectMode });
this.hasWrittenBOM = false;
this.formatterOptions = formatterOptions;
this.rowFormatter = new formatter_1.RowFormatter(formatterOptions);
// if writeBOM is false then set to true
// if writeBOM is true then set to false by default so it is written out
this.hasWrittenBOM = !formatterOptions.writeBOM;
}
transform(transformFunction) {
this.rowFormatter.rowTransform = transformFunction;
return this;
}
_transform(row, encoding, cb) {
let cbCalled = false;
try {
if (!this.hasWrittenBOM) {
this.push(this.formatterOptions.BOM);
this.hasWrittenBOM = true;
}
this.rowFormatter.format(row, (err, rows) => {
if (err) {
cbCalled = true;
return cb(err);
}
if (rows) {
rows.forEach((r) => {
this.push(Buffer.from(r, 'utf8'));
});
}
cbCalled = true;
return cb();
});
}
catch (e) {
if (cbCalled) {
throw e;
}
cb(e);
}
}
_flush(cb) {
this.rowFormatter.finish((err, rows) => {
if (err) {
return cb(err);
}
if (rows) {
rows.forEach((r) => {
this.push(Buffer.from(r, 'utf8'));
});
}
return cb();
});
}
}
exports.CsvFormatterStream = CsvFormatterStream;
//# sourceMappingURL=CsvFormatterStream.js.map
/***/ }),
/***/ 6763:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.FormatterOptions = void 0;
class FormatterOptions {
constructor(opts = {}) {
var _a;
this.objectMode = true;
this.delimiter = ',';
this.rowDelimiter = '\n';
this.quote = '"';
this.escape = this.quote;
this.quoteColumns = false;
this.quoteHeaders = this.quoteColumns;
this.headers = null;
this.includeEndRowDelimiter = false;
this.writeBOM = false;
this.BOM = '\ufeff';
this.alwaysWriteHeaders = false;
Object.assign(this, opts || {});
if (typeof (opts === null || opts === void 0 ? void 0 : opts.quoteHeaders) === 'undefined') {
this.quoteHeaders = this.quoteColumns;
}
if ((opts === null || opts === void 0 ? void 0 : opts.quote) === true) {
this.quote = '"';
}
else if ((opts === null || opts === void 0 ? void 0 : opts.quote) === false) {
this.quote = '';
}
if (typeof (opts === null || opts === void 0 ? void 0 : opts.escape) !== 'string') {
this.escape = this.quote;
}
this.shouldWriteHeaders = !!this.headers && ((_a = opts.writeHeaders) !== null && _a !== void 0 ? _a : true);
this.headers = Array.isArray(this.headers) ? this.headers : null;
this.escapedQuote = `${this.escape}${this.quote}`;
}
}
exports.FormatterOptions = FormatterOptions;
//# sourceMappingURL=FormatterOptions.js.map
/***/ }),
/***/ 5186:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.FieldFormatter = void 0;
const lodash_isboolean_1 = __importDefault(__webpack_require__(8094));
const lodash_isnil_1 = __importDefault(__webpack_require__(9722));
const lodash_escaperegexp_1 = __importDefault(__webpack_require__(1658));
class FieldFormatter {
constructor(formatterOptions) {
this._headers = null;
this.formatterOptions = formatterOptions;
if (formatterOptions.headers !== null) {
this.headers = formatterOptions.headers;
}
this.REPLACE_REGEXP = new RegExp(formatterOptions.quote, 'g');
const escapePattern = `[${formatterOptions.delimiter}${lodash_escaperegexp_1.default(formatterOptions.rowDelimiter)}|\r|\n]`;
this.ESCAPE_REGEXP = new RegExp(escapePattern);
}
set headers(headers) {
this._headers = headers;
}
shouldQuote(fieldIndex, isHeader) {
const quoteConfig = isHeader ? this.formatterOptions.quoteHeaders : this.formatterOptions.quoteColumns;
if (lodash_isboolean_1.default(quoteConfig)) {
return quoteConfig;
}
if (Array.isArray(quoteConfig)) {
return quoteConfig[fieldIndex];
}
if (this._headers !== null) {
return quoteConfig[this._headers[fieldIndex]];
}
return false;
}
format(field, fieldIndex, isHeader) {
const preparedField = `${lodash_isnil_1.default(field) ? '' : field}`.replace(/\0/g, '');
const { formatterOptions } = this;
if (formatterOptions.quote !== '') {
const shouldEscape = preparedField.indexOf(formatterOptions.quote) !== -1;
if (shouldEscape) {
return this.quoteField(preparedField.replace(this.REPLACE_REGEXP, formatterOptions.escapedQuote));
}
}
const hasEscapeCharacters = preparedField.search(this.ESCAPE_REGEXP) !== -1;
if (hasEscapeCharacters || this.shouldQuote(fieldIndex, isHeader)) {
return this.quoteField(preparedField);
}
return preparedField;
}
quoteField(field) {
const { quote } = this.formatterOptions;
return `${quote}${field}${quote}`;
}
}
exports.FieldFormatter = FieldFormatter;
//# sourceMappingURL=FieldFormatter.js.map
/***/ }),
/***/ 7181:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.RowFormatter = void 0;
const lodash_isfunction_1 = __importDefault(__webpack_require__(8423));
const lodash_isequal_1 = __importDefault(__webpack_require__(2307));
const FieldFormatter_1 = __webpack_require__(5186);
const types_1 = __webpack_require__(4692);
class RowFormatter {
constructor(formatterOptions) {
this.rowCount = 0;
this.formatterOptions = formatterOptions;
this.fieldFormatter = new FieldFormatter_1.FieldFormatter(formatterOptions);
this.headers = formatterOptions.headers;
this.shouldWriteHeaders = formatterOptions.shouldWriteHeaders;
this.hasWrittenHeaders = false;
if (this.headers !== null) {
this.fieldFormatter.headers = this.headers;
}
if (formatterOptions.transform) {
this.rowTransform = formatterOptions.transform;
}
}
static isRowHashArray(row) {
if (Array.isArray(row)) {
return Array.isArray(row[0]) && row[0].length === 2;
}
return false;
}
static isRowArray(row) {
return Array.isArray(row) && !this.isRowHashArray(row);
}
// get headers from a row item
static gatherHeaders(row) {
if (RowFormatter.isRowHashArray(row)) {
// lets assume a multi-dimesional array with item 0 being the header
return row.map((it) => it[0]);
}
if (Array.isArray(row)) {
return row;
}
return Object.keys(row);
}
// eslint-disable-next-line @typescript-eslint/no-shadow
static createTransform(transformFunction) {
if (types_1.isSyncTransform(transformFunction)) {
return (row, cb) => {
let transformedRow = null;
try {
transformedRow = transformFunction(row);
}
catch (e) {
return cb(e);
}
return cb(null, transformedRow);
};
}
return (row, cb) => {
transformFunction(row, cb);
};
}
set rowTransform(transformFunction) {
if (!lodash_isfunction_1.default(transformFunction)) {
throw new TypeError('The transform should be a function');
}
this._rowTransform = RowFormatter.createTransform(transformFunction);
}
format(row, cb) {
this.callTransformer(row, (err, transformedRow) => {
if (err) {
return cb(err);
}
if (!row) {
return cb(null);
}
const rows = [];
if (transformedRow) {
const { shouldFormatColumns, headers } = this.checkHeaders(transformedRow);
if (this.shouldWriteHeaders && headers && !this.hasWrittenHeaders) {
rows.push(this.formatColumns(headers, true));
this.hasWrittenHeaders = true;
}
if (shouldFormatColumns) {
const columns = this.gatherColumns(transformedRow);
rows.push(this.formatColumns(columns, false));
}
}
return cb(null, rows);
});
}
finish(cb) {
const rows = [];
// check if we should write headers and we didnt get any rows
if (this.formatterOptions.alwaysWriteHeaders && this.rowCount === 0) {
if (!this.headers) {
return cb(new Error('`alwaysWriteHeaders` option is set to true but `headers` option not provided.'));
}
rows.push(this.formatColumns(this.headers, true));
}
if (this.formatterOptions.includeEndRowDelimiter) {
rows.push(this.formatterOptions.rowDelimiter);
}
return cb(null, rows);
}
// check if we need to write header return true if we should also write a row
// could be false if headers is true and the header row(first item) is passed in
checkHeaders(row) {
if (this.headers) {
// either the headers were provided by the user or we have already gathered them.
return { shouldFormatColumns: true, headers: this.headers };
}
const headers = RowFormatter.gatherHeaders(row);
this.headers = headers;
this.fieldFormatter.headers = headers;
if (!this.shouldWriteHeaders) {
// if we are not supposed to write the headers then
// always format the columns
return { shouldFormatColumns: true, headers: null };
}
// if the row is equal to headers dont format
return { shouldFormatColumns: !lodash_isequal_1.default(headers, row), headers };
}
// todo change this method to unknown[]
gatherColumns(row) {
if (this.headers === null) {
throw new Error('Headers is currently null');
}
if (!Array.isArray(row)) {
return this.headers.map((header) => row[header]);
}
if (RowFormatter.isRowHashArray(row)) {
return this.headers.map((header, i) => {
const col = row[i];
if (col) {
return col[1];
}
return '';
});
}
// if its a one dimensional array and headers were not provided
// then just return the row
if (RowFormatter.isRowArray(row) && !this.shouldWriteHeaders) {
return row;
}
return this.headers.map((header, i) => row[i]);
}
callTransformer(row, cb) {
if (!this._rowTransform) {
return cb(null, row);
}
return this._rowTransform(row, cb);
}
formatColumns(columns, isHeadersRow) {
const formattedCols = columns
.map((field, i) => this.fieldFormatter.format(field, i, isHeadersRow))
.join(this.formatterOptions.delimiter);
const { rowCount } = this;
this.rowCount += 1;
if (rowCount) {
return [this.formatterOptions.rowDelimiter, formattedCols].join('');
}
return formattedCols;
}
}
exports.RowFormatter = RowFormatter;
//# sourceMappingURL=RowFormatter.js.map
/***/ }),
/***/ 9947:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.FieldFormatter = exports.RowFormatter = void 0;
var RowFormatter_1 = __webpack_require__(7181);
Object.defineProperty(exports, "RowFormatter", ({ enumerable: true, get: function () { return RowFormatter_1.RowFormatter; } }));
var FieldFormatter_1 = __webpack_require__(5186);
Object.defineProperty(exports, "FieldFormatter", ({ enumerable: true, get: function () { return FieldFormatter_1.FieldFormatter; } }));
//# sourceMappingURL=index.js.map
/***/ }),
/***/ 7201:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
/* provided dependency */ var Buffer = __webpack_require__(8764)["Buffer"];
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.writeToPath = exports.writeToString = exports.writeToBuffer = exports.writeToStream = exports.write = exports.format = exports.FormatterOptions = exports.CsvFormatterStream = void 0;
const util_1 = __webpack_require__(9539);
const stream_1 = __webpack_require__(2830);
const fs = __importStar(__webpack_require__(8646));
const FormatterOptions_1 = __webpack_require__(6763);
const CsvFormatterStream_1 = __webpack_require__(3062);
__exportStar(__webpack_require__(4692), exports);
var CsvFormatterStream_2 = __webpack_require__(3062);
Object.defineProperty(exports, "CsvFormatterStream", ({ enumerable: true, get: function () { return CsvFormatterStream_2.CsvFormatterStream; } }));
var FormatterOptions_2 = __webpack_require__(6763);
Object.defineProperty(exports, "FormatterOptions", ({ enumerable: true, get: function () { return FormatterOptions_2.FormatterOptions; } }));
exports.format = (options) => new CsvFormatterStream_1.CsvFormatterStream(new FormatterOptions_1.FormatterOptions(options));
exports.write = (rows, options) => {
const csvStream = exports.format(options);
const promiseWrite = util_1.promisify((row, cb) => {
csvStream.write(row, undefined, cb);
});
rows.reduce((prev, row) => prev.then(() => promiseWrite(row)), Promise.resolve())
.then(() => csvStream.end())
.catch((err) => {
csvStream.emit('error', err);
});
return csvStream;
};
exports.writeToStream = (ws, rows, options) => exports.write(rows, options).pipe(ws);
exports.writeToBuffer = (rows, opts = {}) => {
const buffers = [];
const ws = new stream_1.Writable({
write(data, enc, writeCb) {
buffers.push(data);
writeCb();
},
});
return new Promise((res, rej) => {
ws.on('error', rej).on('finish', () => res(Buffer.concat(buffers)));
exports.write(rows, opts).pipe(ws);
});
};
exports.writeToString = (rows, options) => exports.writeToBuffer(rows, options).then((buffer) => buffer.toString());
exports.writeToPath = (path, rows, options) => {
const stream = fs.createWriteStream(path, { encoding: 'utf8' });
return exports.write(rows, options).pipe(stream);
};
//# sourceMappingURL=index.js.map
/***/ }),
/***/ 4692:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
/* eslint-disable @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.isSyncTransform = void 0;
exports.isSyncTransform = (transform) => transform.length === 1;
//# sourceMappingURL=types.js.map
/***/ }),
/***/ 2656:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.decodeToken = exports.hasTokenExpired = exports.isRefreshTokenExpiring = exports.isAccessTokenExpiring = void 0;
const jwt_decode_1 = __importDefault(__webpack_require__(6245));
/**
* Checks if the Access Token is expired or is expiring in 1 hour. A default Access Token
* lasts 12 hours. If the Access Token expires, the Refresh Token is used to fetch a new
* Access Token. In the case that the Refresh Token is expired, 1 hour is enough to let
* most jobs finish.
* @param {string} token- token string that will be evaluated
* @param {number} timeToLiveSeconds - the amount of time that the token has before it expires, defaults to 3600
* @returns {boolean} a value indicating whether the token is about to expire
*/
function isAccessTokenExpiring(token, timeToLiveSeconds = 3600) {
if (!token) {
return true;
}
return isTokenExpiring(token, timeToLiveSeconds);
}
exports.isAccessTokenExpiring = isAccessTokenExpiring;
/**
* Checks if the Refresh Token is expired or expiring in 30 secs. A default Refresh Token
* lasts 30 days. Once the Refresh Token expires, the user must re-authenticate (provide
* credentials in a browser to obtain an authorisation code). 30 seconds is enough time
* to make a request for a final Access Token.
* @param {string} token- token string that will be evaluated
* @param {number} timeToLiveSeconds - the amount of time that the token has before it expires, defaults to 30
* @returns {boolean} a value indicating whether the token is about to expire
*/
function isRefreshTokenExpiring(token, timeToLiveSeconds = 30) {
if (!token) {
return true;
}
return isTokenExpiring(token, timeToLiveSeconds);
}
exports.isRefreshTokenExpiring = isRefreshTokenExpiring;
/**
* Checks if the given token has expired.
* @param {string} token- token string that will be evaluated
* @returns {boolean} a value indicating whether the token has expired
*/
function hasTokenExpired(token) {
if (!token) {
return true;
}
return isTokenExpiring(token, 0);
}
exports.hasTokenExpired = hasTokenExpired;
function isTokenExpiring(token, timeToLiveSeconds) {
const payload = (0, jwt_decode_1.default)(token);
const timeToLive = payload.exp - new Date().valueOf() / 1000;
return timeToLive <= timeToLiveSeconds;
}
function decodeToken(token) {
let payload;
try {
payload = (0, jwt_decode_1.default)(token);
}
catch (err) {
throw new Error('Invalid token supplied.');
}
return payload;
}
exports.decodeToken = decodeToken;
//# sourceMappingURL=auth.js.map
/***/ }),
/***/ 6799:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
__exportStar(__webpack_require__(2656), exports);
//# sourceMappingURL=index.js.map
/***/ }),
/***/ 3259:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.prefixMessage = void 0;
const prefixMessage = (err, messagePrefix) => {
if (typeof err === 'object') {
if (err.hasOwnProperty('message')) {
err.message = messagePrefix + err.message;
}
else {
if (err.hasOwnProperty('body')) {
if (typeof err.body === 'object') {
err.message = err.body.message
? messagePrefix + err.body.message
: messagePrefix;
}
if (typeof err.body === 'string') {
let body;
try {
body = JSON.parse(err.body);
}
catch (error) {
err.message = messagePrefix;
return err;
}
body.message = body.message
? messagePrefix + body.message
: messagePrefix;
err.body = body;
return err;
}
}
else
return Object.assign(Object.assign({}, err), { message: messagePrefix });
}
}
if (typeof err === 'string')
err = messagePrefix + err;
return err;
};
exports.prefixMessage = prefixMessage;
//# sourceMappingURL=errorModifier.js.map
/***/ }),
/***/ 9778:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
__exportStar(__webpack_require__(3259), exports);
__exportStar(__webpack_require__(1064), exports);
//# sourceMappingURL=index.js.map
/***/ }),
/***/ 1064:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ServerTypeError = void 0;
const types_1 = __webpack_require__(3900);
class ServerTypeError extends Error {
constructor(validOptions = []) {
validOptions = [...new Set(validOptions)];
let options = validOptions.length
? validOptions.join(', ').trim()
: [types_1.ServerType.SasViya, types_1.ServerType.Sas9, types_1.ServerType.Sasjs]
.join(', ')
.trim();
options = options.replace(/,\s([^,]*)$/, ' and $1');
super(`Invalid server type: valid option${validOptions.length !== 1 ? 's' : ''} ${validOptions.length !== 1 ? 'are' : 'is'} ${options}`);
this.name = 'ServerTypeError';
Object.setPrototypeOf(this, ServerTypeError.prototype);
}
}
exports.ServerTypeError = ServerTypeError;
//# sourceMappingURL=serverTypeError.js.map
/***/ }),
/***/ 3906:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.updateCsv = exports.createCsv = exports.readCsv = void 0;
const file_1 = __webpack_require__(1559);
const format_1 = __webpack_require__(7201);
/**
* reads a CSV file and returns parsed data
* @param csvFilePath
* @returns string[][]
*/
const readCsv = (csvFilePath) => __awaiter(void 0, void 0, void 0, function* () {
const csvContent = yield (0, file_1.readFile)(csvFilePath);
return csvContent
.split('\n')
.filter((row) => row.length)
.map((data) => data.split(','));
});
exports.readCsv = readCsv;
/**
* creates a csv file at given path with provided data
* @param csvFilePath location where to create file
* @param csvData data which needs to be populated in file
* @param headers an array of column names
*/
const createCsv = (csvFilePath, csvData, headers) => __awaiter(void 0, void 0, void 0, function* () {
const output = yield (0, format_1.writeToString)(csvData, { headers });
yield (0, file_1.createFile)(csvFilePath, output);
});
exports.createCsv = createCsv;
/**
* append new csv record if file exists else creates a new file
* @param csvFilePath location where to create file
* @param newRecord new record which needs to be appended
* @param columns an array of header for file, i.e column names
* @param prependId name of id column
*/
const updateCsv = (csvFilePath, newRecord, columns, prependId) => __awaiter(void 0, void 0, void 0, function* () {
const csvData = yield validateInput(csvFilePath, newRecord, columns, prependId);
if (prependId) {
const newId = csvData.length === 0 ? 1 : csvData.length;
const idIndexInColumns = columns.findIndex((col) => col === prependId);
if (idIndexInColumns > -1) {
newRecord.splice(idIndexInColumns, 0, newId);
}
else {
columns.splice(0, 0, prependId);
newRecord.splice(0, 0, newId);
}
}
csvData.push(newRecord);
yield (0, exports.createCsv)(csvFilePath, csvData, columns);
});
exports.updateCsv = updateCsv;
const validateInput = (csvFilePath, newRecord, columnsProvided, prependId) => __awaiter(void 0, void 0, void 0, function* () {
if (newRecord.length !== columnsProvided.length) {
if (newRecord.length > columnsProvided.length) {
throw new Error('a record can not have more fields than provided columns');
}
// provided columns can/cannot have 'id'
if (!(prependId && newRecord.length + 1 === columnsProvided.length)) {
throw new Error('a record can not have less fields than provided columns');
}
}
else if (prependId && columnsProvided.includes(prependId)) {
throw new Error('a record can not have more fields than provided columns');
}
const csvData = yield (0, exports.readCsv)(csvFilePath).catch((_) => []);
const columnsInFile = csvData[0];
if (columnsInFile) {
if (columnsProvided.length > columnsInFile.length) {
throw new Error('number of provided columns are greater than number of existing columns');
}
if (columnsProvided.length < columnsInFile.length) {
// provided columns can/cannot have 'id'
if (!(prependId && columnsProvided.length + 1 === columnsInFile.length))
throw new Error('number of provided columns are less than number of existing columns');
const idIndexInColumns = columnsInFile.findIndex((col) => col === prependId);
const columnsWithId = [...columnsProvided];
if (idIndexInColumns > -1) {
columnsWithId.splice(idIndexInColumns, 0, prependId);
if (JSON.stringify(columnsProvided) !== JSON.stringify(columnsWithId)) {
throw new Error('provided columns does not match existing columns');
}
}
else {
throw new Error('provided columns does not match existing columns');
}
}
else {
if (JSON.stringify(columnsProvided) !== JSON.stringify(columnsInFile)) {
throw new Error('provided columns does not match existing columns');
}
if (prependId && !columnsProvided.includes(prependId)) {
throw new Error('can not add new id to existing data');
}
}
}
return csvData;
});
//# sourceMappingURL=csvFile.js.map
/***/ }),
/***/ 1559:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getLineEnding = exports.isTestFile = exports.testFileRegExp = exports.createReadStream = exports.createWriteStream = exports.getRealPath = exports.base64EncodeFile = exports.base64EncodeImageFile = exports.pathSepEscaped = exports.copy = exports.moveFile = exports.getRelativePath = exports.unifyFilePath = exports.deleteFolder = exports.deleteFile = exports.createFile = exports.createFolder = exports.listFilesAndSubFoldersInFolder = exports.listSubFoldersInFolder = exports.listSasFilesInFolder = exports.listIniFilesInFolder = exports.listFilesInFolder = exports.readFileBinary = exports.readFile = exports.isFolder = exports.folderExists = exports.fileExists = void 0;
const fs_extra_1 = __importDefault(__webpack_require__(5674));
const path_1 = __importDefault(__webpack_require__(2520));
const utils_1 = __webpack_require__(6266);
const file = __importStar(__webpack_require__(2975));
const types_1 = __webpack_require__(3900);
function fileExists(filePath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises
.access(filePath, fs_extra_1.default.constants.F_OK)
.then(() => true)
.catch(() => false);
});
}
exports.fileExists = fileExists;
function folderExists(folderPath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises
.access(folderPath, fs_extra_1.default.constants.F_OK)
.then(() => true)
.catch(() => false);
});
}
exports.folderExists = folderExists;
function isFolder(inputPath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises
.lstat(inputPath)
.then((stat) => stat.isDirectory())
.catch(() => false);
});
}
exports.isFolder = isFolder;
function readFile(fileName, encoding = 'utf8') {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises.readFile(fileName, encoding);
});
}
exports.readFile = readFile;
function readFileBinary(fileName) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises.readFile(fileName);
});
}
exports.readFileBinary = readFileBinary;
function listFilesInFolder(folderName) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises
.readdir(folderName, { withFileTypes: true })
.then((list) => list.filter((f) => !f.isDirectory()).map((f) => f.name));
});
}
exports.listFilesInFolder = listFilesInFolder;
function listIniFilesInFolder(folderName) {
return __awaiter(this, void 0, void 0, function* () {
return (yield listFilesInFolder(folderName)).filter((name) => name.endsWith('.ini'));
});
}
exports.listIniFilesInFolder = listIniFilesInFolder;
/**
* This function returns a list of all SAS files in a folder
*
* @param folderName a string that contains the folder path
* @param recurse (optional) a boolean that identifies the searching of sas files in nested folders recursively
* @param ignoredFolders (optional) a string array that contains the folders to be ignored in recursive search
* @returns a string array containing sas files paths relatived to folderName
*/
function listSasFilesInFolder(folderName, recurse = false, ignoredFolders = []) {
return __awaiter(this, void 0, void 0, function* () {
const filesAndFolders = yield listFilesAndSubFoldersInFolder(folderName, recurse, ignoredFolders);
const sasFiles = filesAndFolders.filter((f) => f.endsWith('.sas'));
return sasFiles;
});
}
exports.listSasFilesInFolder = listSasFilesInFolder;
function listSubFoldersInFolder(folderName) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises
.readdir(folderName, { withFileTypes: true })
.then((list) => list.filter((f) => f.isDirectory()).map((f) => f.name));
});
}
exports.listSubFoldersInFolder = listSubFoldersInFolder;
function listFilesAndSubFoldersInFolder(folderName, recurse = true, ignoredFolders = []) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises
.readdir(folderName, { withFileTypes: true })
.then((list) => __awaiter(this, void 0, void 0, function* () {
if (recurse) {
const subFolders = list.filter((f) => f.isDirectory());
if (subFolders.length) {
let subFoldersFilesAndFolders = [];
yield (0, utils_1.asyncForEach)(list.filter((f) => f.isDirectory()), (f) => __awaiter(this, void 0, void 0, function* () {
const subFolder = f.name;
if (!ignoredFolders.includes(subFolder)) {
const subPath = path_1.default.join(folderName, subFolder);
subFoldersFilesAndFolders = [
...subFoldersFilesAndFolders,
...(yield listFilesAndSubFoldersInFolder(subPath, recurse, ignoredFolders)).map((f) => path_1.default.join(subFolder, f))
];
}
}));
return [
...list.filter((f) => !f.isDirectory()).map((f) => f.name),
...subFoldersFilesAndFolders
];
}
}
return list.map((f) => f.name);
}));
});
}
exports.listFilesAndSubFoldersInFolder = listFilesAndSubFoldersInFolder;
function createFolder(folderName) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises.mkdir(folderName, { recursive: true });
});
}
exports.createFolder = createFolder;
function createFile(fileName, content, encoding) {
return __awaiter(this, void 0, void 0, function* () {
fileName = unifyFilePath(fileName);
if (fileName.split(path_1.default.sep).length > 1) {
let folderPathParts = fileName.split(path_1.default.sep);
folderPathParts.pop();
const folderPath = folderPathParts.join(path_1.default.sep);
if (!(yield folderExists(folderPath))) {
yield createFolder(folderPath);
}
}
return fs_extra_1.default.promises.writeFile(fileName, content, encoding);
});
}
exports.createFile = createFile;
function deleteFile(filePath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.remove(filePath);
});
}
exports.deleteFile = deleteFile;
function deleteFolder(folderPath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.rm(folderPath, {
recursive: true,
force: true
});
});
}
exports.deleteFolder = deleteFolder;
function unifyFilePath(filePath, separator = path_1.default.sep, separatorToReplace = '/') {
const separators = { unix: '/', win: '\\' };
let osSeparator = Object.keys(separators).find((key) => separators[key] === separator);
if (osSeparator) {
const notValidSeparator = separators[Object.keys(separators).find((key) => key !== osSeparator)];
osSeparator = separators[osSeparator];
return filePath.split(notValidSeparator).join(osSeparator);
}
return filePath.split(separatorToReplace).join(separator);
}
exports.unifyFilePath = unifyFilePath;
function getRelativePath(from, to) {
const fromFolders = from.split(path_1.default.sep);
const toFolders = to.split(path_1.default.sep);
let commonPathParts = [];
let relativePathParts = [];
fromFolders.forEach((fromFolder, i) => {
if (toFolders[i] !== undefined && fromFolders[i] === toFolders[i]) {
commonPathParts.push(fromFolder);
}
else {
if (fromFolder)
relativePathParts.push(fromFolder);
}
});
const commonPath = commonPathParts.join(path_1.default.sep);
const leadingPathSepRegExp = new RegExp(`^${path_1.default.sep.replace(/\\/g, '\\\\')}`);
const trailingPathSepRegExp = new RegExp(`${path_1.default.sep.replace(/\\/g, '\\\\')}$`);
const relativePath = (relativePathParts.length
? `..${path_1.default.sep}`.repeat(relativePathParts.length)
: `.${path_1.default.sep}`) +
to
.replace(commonPath, '')
.replace(leadingPathSepRegExp, '')
.replace(trailingPathSepRegExp, '');
return relativePath;
}
exports.getRelativePath = getRelativePath;
function moveFile(oldFilePath, newFilePath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises.rename(oldFilePath, newFilePath);
});
}
exports.moveFile = moveFile;
function copy(source, destination) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.copy(source, destination);
});
}
exports.copy = copy;
exports.pathSepEscaped = path_1.default.sep.replace(/\\/g, '\\\\');
function base64EncodeImageFile(filePath) {
return __awaiter(this, void 0, void 0, function* () {
return readFileBinary(filePath).then((data) => {
let extname = path_1.default.extname(filePath).substr(1) || 'png';
if (extname === 'svg') {
extname = 'svg+xml';
}
return 'data:image/' + extname + ';base64,' + data.toString('base64');
});
});
}
exports.base64EncodeImageFile = base64EncodeImageFile;
function base64EncodeFile(filePath) {
return __awaiter(this, void 0, void 0, function* () {
return fs_extra_1.default.promises.readFile(filePath, { encoding: 'base64' });
});
}
exports.base64EncodeFile = base64EncodeFile;
function getRealPath(file) {
return fs_extra_1.default.realpathSync(file);
}
exports.getRealPath = getRealPath;
function createWriteStream(filePath) {
return __awaiter(this, void 0, void 0, function* () {
const isFilePresent = yield file.fileExists(filePath);
if (isFilePresent) {
return fs_extra_1.default.createWriteStream(filePath, { flags: 'a' });
}
yield file.createFile(filePath, '');
return fs_extra_1.default.createWriteStream(filePath, { flags: 'a' });
});
}
exports.createWriteStream = createWriteStream;
const createReadStream = (filePath) => __awaiter(void 0, void 0, void 0, function* () { return fs_extra_1.default.createReadStream(filePath); });
exports.createReadStream = createReadStream;
exports.testFileRegExp = /\.test\.(\d+\.)?sas$/i;
const isTestFile = (fileName) => exports.testFileRegExp.test(fileName);
exports.isTestFile = isTestFile;
/**
* Returns end of line sequence
* @param content to get end of line sequence.
* @returns CRLF(\r\n) or LF(\n) end of line sequence
*/
const getLineEnding = (content) => new RegExp(types_1.LineEndings.CRLF).test(content) ? types_1.LineEndings.CRLF : types_1.LineEndings.LF;
exports.getLineEnding = getLineEnding;
//# sourceMappingURL=file.js.map
/***/ }),
/***/ 5626:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getAbsolutePath = void 0;
const path_1 = __importDefault(__webpack_require__(2520));
const os_1 = __importDefault(__webpack_require__(7435));
const getAbsolutePath = (providedPath, relativePath) => path_1.default.isAbsolute(providedPath) || /^~/.exec(providedPath)
? path_1.default.normalize(providedPath.replace(/^~/, os_1.default.homedir()))
: path_1.default.join(relativePath, providedPath);
exports.getAbsolutePath = getAbsolutePath;
//# sourceMappingURL=getAbsolutePath.js.map
/***/ }),
/***/ 2975:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.readCsv = exports.createCsv = exports.updateCsv = exports.getLineEnding = exports.testFileRegExp = exports.isTestFile = exports.getRealPath = exports.base64EncodeFile = exports.base64EncodeImageFile = exports.copy = exports.pathSepEscaped = exports.moveFile = exports.unifyFilePath = exports.getRelativePath = exports.deleteFolder = exports.deleteFile = exports.createWriteStream = exports.createReadStream = exports.createFolder = exports.createFile = exports.listFilesAndSubFoldersInFolder = exports.listSubFoldersInFolder = exports.listSasFilesInFolder = exports.listIniFilesInFolder = exports.listFilesInFolder = exports.readFileBinary = exports.readFile = exports.isFolder = exports.folderExists = exports.fileExists = void 0;
var file_1 = __webpack_require__(1559);
Object.defineProperty(exports, "fileExists", ({ enumerable: true, get: function () { return file_1.fileExists; } }));
Object.defineProperty(exports, "folderExists", ({ enumerable: true, get: function () { return file_1.folderExists; } }));
Object.defineProperty(exports, "isFolder", ({ enumerable: true, get: function () { return file_1.isFolder; } }));
Object.defineProperty(exports, "readFile", ({ enumerable: true, get: function () { return file_1.readFile; } }));
Object.defineProperty(exports, "readFileBinary", ({ enumerable: true, get: function () { return file_1.readFileBinary; } }));
Object.defineProperty(exports, "listFilesInFolder", ({ enumerable: true, get: function () { return file_1.listFilesInFolder; } }));
Object.defineProperty(exports, "listIniFilesInFolder", ({ enumerable: true, get: function () { return file_1.listIniFilesInFolder; } }));
Object.defineProperty(exports, "listSasFilesInFolder", ({ enumerable: true, get: function () { return file_1.listSasFilesInFolder; } }));
Object.defineProperty(exports, "listSubFoldersInFolder", ({ enumerable: true, get: function () { return file_1.listSubFoldersInFolder; } }));
Object.defineProperty(exports, "listFilesAndSubFoldersInFolder", ({ enumerable: true, get: function () { return file_1.listFilesAndSubFoldersInFolder; } }));
Object.defineProperty(exports, "createFile", ({ enumerable: true, get: function () { return file_1.createFile; } }));
Object.defineProperty(exports, "createFolder", ({ enumerable: true, get: function () { return file_1.createFolder; } }));
Object.defineProperty(exports, "createReadStream", ({ enumerable: true, get: function () { return file_1.createReadStream; } }));
Object.defineProperty(exports, "createWriteStream", ({ enumerable: true, get: function () { return file_1.createWriteStream; } }));
Object.defineProperty(exports, "deleteFile", ({ enumerable: true, get: function () { return file_1.deleteFile; } }));
Object.defineProperty(exports, "deleteFolder", ({ enumerable: true, get: function () { return file_1.deleteFolder; } }));
Object.defineProperty(exports, "getRelativePath", ({ enumerable: true, get: function () { return file_1.getRelativePath; } }));
Object.defineProperty(exports, "unifyFilePath", ({ enumerable: true, get: function () { return file_1.unifyFilePath; } }));
Object.defineProperty(exports, "moveFile", ({ enumerable: true, get: function () { return file_1.moveFile; } }));
Object.defineProperty(exports, "pathSepEscaped", ({ enumerable: true, get: function () { return file_1.pathSepEscaped; } }));
Object.defineProperty(exports, "copy", ({ enumerable: true, get: function () { return file_1.copy; } }));
Object.defineProperty(exports, "base64EncodeImageFile", ({ enumerable: true, get: function () { return file_1.base64EncodeImageFile; } }));
Object.defineProperty(exports, "base64EncodeFile", ({ enumerable: true, get: function () { return file_1.base64EncodeFile; } }));
Object.defineProperty(exports, "getRealPath", ({ enumerable: true, get: function () { return file_1.getRealPath; } }));
Object.defineProperty(exports, "isTestFile", ({ enumerable: true, get: function () { return file_1.isTestFile; } }));
Object.defineProperty(exports, "testFileRegExp", ({ enumerable: true, get: function () { return file_1.testFileRegExp; } }));
Object.defineProperty(exports, "getLineEnding", ({ enumerable: true, get: function () { return file_1.getLineEnding; } }));
var csvFile_1 = __webpack_require__(3906);
Object.defineProperty(exports, "updateCsv", ({ enumerable: true, get: function () { return csvFile_1.updateCsv; } }));
Object.defineProperty(exports, "createCsv", ({ enumerable: true, get: function () { return csvFile_1.createCsv; } }));
Object.defineProperty(exports, "readCsv", ({ enumerable: true, get: function () { return csvFile_1.readCsv; } }));
__exportStar(__webpack_require__(5626), exports);
//# sourceMappingURL=index.js.map
/***/ }),
/***/ 2777:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.newLine = exports.capitalizeFirstChar = exports.sanitizeSpecialChars = exports.padWithNumber = void 0;
var number_1 = __webpack_require__(5306);
Object.defineProperty(exports, "padWithNumber", ({ enumerable: true, get: function () { return number_1.padWithNumber; } }));
var string_1 = __webpack_require__(9275);
Object.defineProperty(exports, "sanitizeSpecialChars", ({ enumerable: true, get: function () { return string_1.sanitizeSpecialChars; }