Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ab1c84f41f | |||
| 6f575e8516 | |||
| d11f237221 | |||
| 16826ed337 | |||
| c49b518b8a | |||
| 5f49532fc2 | |||
| e7f06a7f44 | |||
| 491477da82 | |||
| 935109abb6 | |||
| ea26a1d8ef | |||
| c7324f0240 | |||
| be44a1354b |
@@ -1,10 +1,10 @@
|
|||||||
# gitzone standard
|
# gitzone ci_default
|
||||||
image: hosttoday/ht-docker-node:npmci
|
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
paths:
|
paths:
|
||||||
- .npmci_cache/
|
- .npmci_cache/
|
||||||
key: "$CI_BUILD_STAGE"
|
key: '$CI_BUILD_STAGE'
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- security
|
- security
|
||||||
@@ -20,17 +20,19 @@ mirror:
|
|||||||
script:
|
script:
|
||||||
- npmci git mirror
|
- npmci git mirror
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
snyk:
|
snyk:
|
||||||
|
image: registry.gitlab.com/hosttoday/ht-docker-node:snyk
|
||||||
stage: security
|
stage: security
|
||||||
script:
|
script:
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
- npmci command npm install -g snyk
|
|
||||||
- npmci command npm install --ignore-scripts
|
- npmci command npm install --ignore-scripts
|
||||||
- npmci command snyk test
|
- npmci command snyk test
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
@@ -38,19 +40,7 @@ snyk:
|
|||||||
# test stage
|
# test stage
|
||||||
# ====================
|
# ====================
|
||||||
|
|
||||||
testLTS:
|
testStable:
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci npm prepare
|
|
||||||
- npmci node install lts
|
|
||||||
- npmci npm install
|
|
||||||
- npmci npm test
|
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- notpriv
|
|
||||||
|
|
||||||
testSTABLE:
|
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
@@ -59,6 +49,20 @@ testSTABLE:
|
|||||||
- npmci npm test
|
- npmci npm test
|
||||||
coverage: /\d+.?\d+?\%\s*coverage/
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
|
- docker
|
||||||
|
- priv
|
||||||
|
|
||||||
|
testBuild:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command npm run build
|
||||||
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
@@ -70,6 +74,7 @@ release:
|
|||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
@@ -78,20 +83,14 @@ release:
|
|||||||
# ====================
|
# ====================
|
||||||
codequality:
|
codequality:
|
||||||
stage: metadata
|
stage: metadata
|
||||||
image: docker:stable
|
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
services:
|
|
||||||
- docker:stable-dind
|
|
||||||
script:
|
script:
|
||||||
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
|
- npmci command npm install -g tslint typescript
|
||||||
- docker run
|
- npmci npm prepare
|
||||||
--env SOURCE_CODE="$PWD"
|
- npmci npm install
|
||||||
--volume "$PWD":/code
|
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||||
--volume /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
|
|
||||||
artifacts:
|
|
||||||
paths: [codeclimate.json]
|
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- priv
|
- priv
|
||||||
|
|
||||||
@@ -102,18 +101,20 @@ trigger:
|
|||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
image: hosttoday/ht-docker-node:npmci
|
|
||||||
stage: metadata
|
stage: metadata
|
||||||
script:
|
script:
|
||||||
|
- npmci node install lts
|
||||||
- npmci command npm install -g @gitzone/tsdoc
|
- npmci command npm install -g @gitzone/tsdoc
|
||||||
- npmci npm prepare
|
- npmci npm prepare
|
||||||
- npmci npm install
|
- npmci npm install
|
||||||
- npmci command tsdoc
|
- npmci command tsdoc
|
||||||
tags:
|
tags:
|
||||||
|
- lossless
|
||||||
- docker
|
- docker
|
||||||
- notpriv
|
- notpriv
|
||||||
only:
|
only:
|
||||||
|
|||||||
1006
package-lock.json
generated
1006
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
32
package.json
32
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartcsv",
|
"name": "@pushrocks/smartcsv",
|
||||||
"version": "1.0.16",
|
"version": "1.0.22",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "handle csv data | gitzone standard compliant",
|
"description": "handle csv data | gitzone standard compliant",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
@@ -13,14 +13,28 @@
|
|||||||
"format": "(gitzone format)"
|
"format": "(gitzone format)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsbuild": "^2.1.11",
|
"@gitzone/tsbuild": "^2.1.17",
|
||||||
"@gitzone/tsrun": "^1.2.6",
|
"@gitzone/tsrun": "^1.2.8",
|
||||||
"@gitzone/tstest": "^1.0.21",
|
"@gitzone/tstest": "^1.0.28",
|
||||||
"@pushrocks/smartfile": "^7.0.2",
|
"@pushrocks/smartfile": "^7.0.6",
|
||||||
"@pushrocks/tapbundle": "^3.0.9",
|
"@pushrocks/tapbundle": "^3.2.0",
|
||||||
"@types/node": "^12.0.2"
|
"@types/node": "^12.12.17",
|
||||||
|
"tslint": "^6.0.0-beta0",
|
||||||
|
"tslint-config-prettier": "^1.18.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@pushrocks/smartpromise": "^3.0.2"
|
"@pushrocks/smartpromise": "^3.0.6",
|
||||||
}
|
"@pushrocks/smartstring": "^3.0.17"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"ts/**/*",
|
||||||
|
"ts_web/**/*",
|
||||||
|
"dist/**/*",
|
||||||
|
"dist_web/**/*",
|
||||||
|
"dist_ts_web/**/*",
|
||||||
|
"assets/**/*",
|
||||||
|
"cli.js",
|
||||||
|
"npmextra.json",
|
||||||
|
"readme.md"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,14 @@ handle csv data | gitzone standard compliant
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
||||||
|
|
||||||
For further information read the linked docs at the top of this readme.
|
For further information read the linked docs at the top of this readme.
|
||||||
|
|
||||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
||||||
|
|
||||||
[](https://maintainedby.lossless.com)
|
[](https://maintainedby.lossless.com)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
Header 1;Header 2; Header3
|
Header 1;Header 2;"Header 3"
|
||||||
row1data1; row1data2; row1data3
|
"row1data1";"row1data2";"row1data3"
|
||||||
row2data1; row2data2; row2data3
|
"row2data1";row2data2;"row2data3"
|
||||||
|
|||||||
|
@@ -13,7 +13,7 @@ tap.test('should read a file', async tools => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should create a valid csv', async () => {
|
tap.test('should create a valid csv', async () => {
|
||||||
testCsv = await smartcsv.Csv.createCsvFromString(fileString, { headers: true });
|
testCsv = await smartcsv.Csv.createCsvFromString(fileString, { headers: true, unquote: true });
|
||||||
const result = await testCsv.exportAsObject();
|
const result = await testCsv.exportAsObject();
|
||||||
console.log(result);
|
console.log(result);
|
||||||
});
|
});
|
||||||
|
|||||||
63
ts/index.ts
63
ts/index.ts
@@ -2,6 +2,7 @@ import * as plugins from './smartcsv.plugins';
|
|||||||
|
|
||||||
export interface ICsvConstructorOptions {
|
export interface ICsvConstructorOptions {
|
||||||
headers: boolean;
|
headers: boolean;
|
||||||
|
unquote?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Csv {
|
export class Csv {
|
||||||
@@ -17,6 +18,7 @@ export class Csv {
|
|||||||
optionsArg: ICsvConstructorOptions
|
optionsArg: ICsvConstructorOptions
|
||||||
): Promise<Csv> {
|
): Promise<Csv> {
|
||||||
const csvInstance = new Csv(csvStringArg, optionsArg);
|
const csvInstance = new Csv(csvStringArg, optionsArg);
|
||||||
|
await csvInstance.exportAsObject();
|
||||||
return csvInstance;
|
return csvInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,21 +53,40 @@ export class Csv {
|
|||||||
public csvString: string;
|
public csvString: string;
|
||||||
public headers: string[];
|
public headers: string[];
|
||||||
public keyFrame: string = null;
|
public keyFrame: string = null;
|
||||||
|
public data: any[];
|
||||||
|
|
||||||
|
private base64RecognitionPrefix = '####12345####';
|
||||||
|
|
||||||
public options: ICsvConstructorOptions = {
|
public options: ICsvConstructorOptions = {
|
||||||
headers: true
|
headers: true,
|
||||||
|
unquote: true
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(csvStringArg: string, optionsArg: ICsvConstructorOptions) {
|
constructor(csvStringArg: string, optionsArg: ICsvConstructorOptions) {
|
||||||
this.csvString = csvStringArg;
|
this.options = {
|
||||||
this.options = optionsArg;
|
...this.options,
|
||||||
|
...optionsArg
|
||||||
|
};
|
||||||
|
|
||||||
|
let csvStringToParse = csvStringArg;
|
||||||
|
if (this.options.unquote) {
|
||||||
|
csvStringToParse = csvStringToParse.replace(
|
||||||
|
/"(.*?)"/gi,
|
||||||
|
(match, p1, offset, originalString) => {
|
||||||
|
return this.base64RecognitionPrefix + plugins.smartstring.base64.encode(match);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.csvString = csvStringToParse;
|
||||||
|
|
||||||
this.determineKeyframe();
|
this.determineKeyframe();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* determines the keyframe of the csv string
|
* determines the keyframe of the csv string
|
||||||
*/
|
*/
|
||||||
public determineKeyframe() {
|
private determineKeyframe() {
|
||||||
let commaLength = 0;
|
let commaLength = 0;
|
||||||
let semicolonLength = 0;
|
let semicolonLength = 0;
|
||||||
const commaRegexResult = this.csvString.match(/,/g);
|
const commaRegexResult = this.csvString.match(/,/g);
|
||||||
@@ -87,7 +108,7 @@ export class Csv {
|
|||||||
/**
|
/**
|
||||||
* serializes the csv string
|
* serializes the csv string
|
||||||
*/
|
*/
|
||||||
public serializeCsvString() {
|
private serializeCsvString() {
|
||||||
const rowArray = this.getRows();
|
const rowArray = this.getRows();
|
||||||
const resultArray = [];
|
const resultArray = [];
|
||||||
if (this.options.headers) {
|
if (this.options.headers) {
|
||||||
@@ -100,7 +121,10 @@ export class Csv {
|
|||||||
return resultArray;
|
return resultArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getRows(): string[] {
|
/**
|
||||||
|
* gets the rows of the csv
|
||||||
|
*/
|
||||||
|
private getRows(): string[] {
|
||||||
const rowsArray = this.csvString.split('\n');
|
const rowsArray = this.csvString.split('\n');
|
||||||
if (rowsArray[rowsArray.length - 1] === '') {
|
if (rowsArray[rowsArray.length - 1] === '') {
|
||||||
rowsArray.pop();
|
rowsArray.pop();
|
||||||
@@ -108,20 +132,40 @@ export class Csv {
|
|||||||
return rowsArray;
|
return rowsArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getHeaders() {
|
private getHeaders() {
|
||||||
const rowArray = this.getRows();
|
const rowArray = this.getRows();
|
||||||
if (this.options.headers) {
|
if (this.options.headers) {
|
||||||
let headerRow = rowArray[0];
|
let headerRow = rowArray[0];
|
||||||
this.headers = headerRow.split(this.keyFrame);
|
this.headers = headerRow.split(this.keyFrame);
|
||||||
|
if (this.options.unquote) {
|
||||||
|
const unquotedHeaders: string[] = [];
|
||||||
|
for (let header of this.headers) {
|
||||||
|
if (header.startsWith(this.base64RecognitionPrefix)) {
|
||||||
|
header = header.replace(this.base64RecognitionPrefix, '');
|
||||||
|
unquotedHeaders.push(plugins.smartstring.base64.decode(header).replace(/['"]+/g, ''));
|
||||||
|
} else {
|
||||||
|
unquotedHeaders.push(header);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.headers = unquotedHeaders;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return this.headers;
|
return this.headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public createDataObject(dataArray: string[]) {
|
private createDataObject(dataArray: string[]) {
|
||||||
const neededIterations = dataArray.length;
|
const neededIterations = dataArray.length;
|
||||||
let resultJson: any = {};
|
let resultJson: any = {};
|
||||||
for (let i = 0; i < neededIterations; i++) {
|
for (let i = 0; i < neededIterations; i++) {
|
||||||
resultJson[this.headers[i]] = dataArray[i];
|
let value = dataArray[i];
|
||||||
|
if (this.options.unquote && value.startsWith(this.base64RecognitionPrefix)) {
|
||||||
|
value = value.replace(this.base64RecognitionPrefix, '');
|
||||||
|
value = plugins.smartstring.base64
|
||||||
|
.decode(value)
|
||||||
|
.replace(/['"]+/g, '')
|
||||||
|
.replace(/['"]+/g, '');
|
||||||
|
}
|
||||||
|
resultJson[this.headers[i]] = value;
|
||||||
}
|
}
|
||||||
return resultJson;
|
return resultJson;
|
||||||
}
|
}
|
||||||
@@ -132,6 +176,7 @@ export class Csv {
|
|||||||
for (const dataArray of serializedData) {
|
for (const dataArray of serializedData) {
|
||||||
dataObjects.push(this.createDataObject(dataArray));
|
dataObjects.push(this.createDataObject(dataArray));
|
||||||
}
|
}
|
||||||
|
this.data = dataObjects;
|
||||||
return dataObjects;
|
return dataObjects;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
import * as smartq from '@pushrocks/smartpromise';
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
|
import * as smartstring from '@pushrocks/smartstring';
|
||||||
|
|
||||||
export { smartq };
|
export { smartpromise, smartstring };
|
||||||
|
|||||||
Reference in New Issue
Block a user