diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ee7bd94..77d706f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,6 +12,9 @@ stages: - release - metadata +# ==================== +# security stage +# ==================== mirror: stage: security script: @@ -30,6 +33,9 @@ snyk: - docker - notpriv +# ==================== +# test stage +# ==================== testLEGACY: stage: test script: @@ -68,7 +74,6 @@ release: stage: release script: - npmci node install stable - - npmci npm prepare - npmci npm publish only: - tags diff --git a/dist/index.d.ts b/dist/index.d.ts index 9062c68..b18782a 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,16 @@ -export declare class Csv { - static createCsvFromString(csvStringArg: string): Promise; - csvString: string; - getHeaders(): void; - exportAsJson(): void; +export interface ICsvConstructorOptions { + headers: boolean; +} +export declare class Csv { + static createCsvFromString(csvStringArg: string, options: ICsvConstructorOptions): Promise; + csvString: string; + headers: string[]; + keyFrame: string; + options: ICsvConstructorOptions; + determineKeyframe(): void; + serializeCsvString(): any[]; + getRows(): string[]; + getHeaders(): string[]; + createDataObject(dataArray: string[]): any; + exportAsObject(): Promise; } diff --git a/dist/index.js b/dist/index.js index bbc710f..3a34d72 100644 --- a/dist/index.js +++ b/dist/index.js @@ -9,20 +9,80 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; Object.defineProperty(exports, "__esModule", { value: true }); class Csv { - static createCsvFromString(csvStringArg) { + constructor() { + this.keyFrame = null; + this.options = { + headers: true + }; + } + static createCsvFromString(csvStringArg, options) { return __awaiter(this, void 0, void 0, function* () { const csvInstance = new Csv(); csvInstance.csvString = csvStringArg; + csvInstance.determineKeyframe(); return csvInstance; }); } - getHeaders() { + determineKeyframe() { + let commaLength = 0; + let semicolonLength = 0; + const commaRegexResult = this.csvString.match(/,/g); + const semicolonRegexResult = this.csvString.match(/;/g); + if (commaRegexResult) { + commaLength = commaRegexResult.length; + } + if (semicolonRegexResult) { + semicolonLength = semicolonRegexResult.length; + } + // tslint:disable-next-line:prefer-conditional-expression + if (commaLength < semicolonLength) { + this.keyFrame = ';'; + } + else { + this.keyFrame = ','; + } } - exportAsJson() { - let json = { - [`key`]: 'hi' - }; + serializeCsvString() { + const rowArray = this.getRows(); + const resultArray = []; + if (this.options.headers) { + this.getHeaders(); + rowArray.shift(); + } + for (const row of rowArray) { + resultArray.push(row.split(this.keyFrame)); + } + return resultArray; + } + getRows() { + return this.csvString.split('\n'); + } + getHeaders() { + const rowArray = this.getRows(); + if (this.options.headers) { + let headerRow = rowArray[0]; + this.headers = headerRow.split(this.keyFrame); + } + return this.headers; + } + createDataObject(dataArray) { + const neededIterations = dataArray.length; + let resultJson = {}; + for (let i = 0; i < neededIterations; i++) { + resultJson[this.headers[i]] = dataArray[i]; + } + return resultJson; + } + exportAsObject() { + return __awaiter(this, void 0, void 0, function* () { + const serializedData = this.serializeCsvString(); + const dataObjects = []; + for (const dataArray of serializedData) { + dataObjects.push(this.createDataObject(dataArray)); + } + return dataObjects; + }); } } exports.Csv = Csv; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBRUE7SUFDUyxNQUFNLENBQU8sbUJBQW1CLENBQUUsWUFBb0I7O1lBQzNELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7WUFDOUIsV0FBVyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7WUFDckMsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztLQUFBO0lBR00sVUFBVTtJQUVqQixDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksR0FBRztZQUNULENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0NBRUY7QUFsQkQsa0JBa0JDIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBTUE7SUFBQTtRQVlTLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFFeEIsWUFBTyxHQUEyQjtZQUN2QyxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFnRUosQ0FBQztJQS9FUSxNQUFNLENBQU8sbUJBQW1CLENBQ3JDLFlBQW9CLEVBQ3BCLE9BQStCOztZQUUvQixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7S0FBQTtJQVNNLGlCQUFpQjtRQUN0QixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FDdkM7UUFDRCxJQUFJLG9CQUFvQixFQUFFO1lBQ3hCLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7U0FDL0M7UUFDRCx5REFBeUQ7UUFDekQsSUFBSSxXQUFXLEdBQUcsZUFBZSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1NBQ3JCO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDbEI7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUMxQixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU0sT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVNLFVBQVU7UUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUN4QixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsU0FBbUI7UUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzFDLElBQUksVUFBVSxHQUFRLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRVksY0FBYzs7WUFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDakQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxTQUFTLElBQUksY0FBYyxFQUFFO2dCQUN0QyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztLQUFBO0NBQ0Y7QUFoRkQsa0JBZ0ZDIn0= \ No newline at end of file diff --git a/dist/smartcsv.plugins.d.ts b/dist/smartcsv.plugins.d.ts index aeefb70..7a643a2 100644 --- a/dist/smartcsv.plugins.d.ts +++ b/dist/smartcsv.plugins.d.ts @@ -1,2 +1,2 @@ -import * as csv from 'csv'; -export { csv }; +import * as smartq from 'smartq'; +export { smartq }; diff --git a/dist/smartcsv.plugins.js b/dist/smartcsv.plugins.js index 3fcda0b..e258d2f 100644 --- a/dist/smartcsv.plugins.js +++ b/dist/smartcsv.plugins.js @@ -1,5 +1,5 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const csv = require("csv"); -exports.csv = csv; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjc3YucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y3N2LnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQkFBMkI7QUFHekIsa0JBQUcifQ== \ No newline at end of file +const smartq = require("smartq"); +exports.smartq = smartq; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRjc3YucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0Y3N2LnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFFeEIsd0JBQU0ifQ== \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index b2936f5..1acb74c 100644 --- a/test/test.ts +++ b/test/test.ts @@ -8,12 +8,12 @@ import * as smartfile from 'smartfile'; let fileString: string; let testCsv: smartcsv.Csv; -tap.test('should read a file', async (tools) => { +tap.test('should read a file', async tools => { fileString = smartfile.fs.toStringSync('./test/sample.csv'); }); tap.test('should create a valid csv', async () => { - testCsv = await smartcsv.Csv.createCsvFromString(fileString, {headers: true}); + testCsv = await smartcsv.Csv.createCsvFromString(fileString, { headers: true }); const result = await testCsv.exportAsObject(); console.log(result); }); diff --git a/ts/index.ts b/ts/index.ts index 6f45b75..f9371e8 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -5,19 +5,43 @@ export interface ICsvConstructorOptions { } export class Csv { - public static async createCsvFromString (csvStringArg: string, options: ICsvConstructorOptions): Promise { + public static async createCsvFromString( + csvStringArg: string, + options: ICsvConstructorOptions + ): Promise { const csvInstance = new Csv(); csvInstance.csvString = csvStringArg; + csvInstance.determineKeyframe(); return csvInstance; } public csvString: string; public headers: string[]; + public keyFrame: string = null; public options: ICsvConstructorOptions = { headers: true }; - public serializeCsvString () { + public determineKeyframe() { + let commaLength = 0; + let semicolonLength = 0; + const commaRegexResult = this.csvString.match(/,/g); + const semicolonRegexResult = this.csvString.match(/;/g); + if (commaRegexResult) { + commaLength = commaRegexResult.length; + } + if (semicolonRegexResult) { + semicolonLength = semicolonRegexResult.length; + } + // tslint:disable-next-line:prefer-conditional-expression + if (commaLength < semicolonLength) { + this.keyFrame = ';'; + } else { + this.keyFrame = ','; + } + } + + public serializeCsvString() { const rowArray = this.getRows(); const resultArray = []; if (this.options.headers) { @@ -25,34 +49,34 @@ export class Csv { rowArray.shift(); } for (const row of rowArray) { - resultArray.push(row.split(';')); + resultArray.push(row.split(this.keyFrame)); } return resultArray; } - public getRows () { + public getRows() { return this.csvString.split('\n'); } - public getHeaders () { + public getHeaders() { const rowArray = this.getRows(); if (this.options.headers) { - let headerRow = rowArray[ 0 ]; - this.headers = headerRow.split(';'); + let headerRow = rowArray[0]; + this.headers = headerRow.split(this.keyFrame); } return this.headers; } - public createDataObject (dataArray: string[]) { + public createDataObject(dataArray: string[]) { const neededIterations = dataArray.length; let resultJson: any = {}; - for(let i = 0; i < neededIterations; i++) { + for (let i = 0; i < neededIterations; i++) { resultJson[this.headers[i]] = dataArray[i]; } return resultJson; } - public async exportAsObject (): Promise { + public async exportAsObject(): Promise { const serializedData = this.serializeCsvString(); const dataObjects = []; for (const dataArray of serializedData) { @@ -60,5 +84,4 @@ export class Csv { } return dataObjects; } - } diff --git a/ts/smartcsv.plugins.ts b/ts/smartcsv.plugins.ts index 6fa8854..d7d8826 100644 --- a/ts/smartcsv.plugins.ts +++ b/ts/smartcsv.plugins.ts @@ -1,5 +1,3 @@ import * as smartq from 'smartq'; -export { - smartq -}; +export { smartq };