Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c49b518b8a | |||
| 5f49532fc2 | |||
| e7f06a7f44 | |||
| 491477da82 | |||
| 935109abb6 | |||
| ea26a1d8ef | |||
| c7324f0240 | |||
| be44a1354b | |||
| 13f3f7b2f6 | |||
| 94f2620161 | |||
| bdebb3308c | |||
| cb5ac7618b | |||
| 00aed79e18 | |||
| 438053a2f9 | |||
| 7479328e13 | |||
| 56d7ae8952 |
18
.gitignore
vendored
18
.gitignore
vendored
@@ -1,6 +1,22 @@
|
||||
.nogit/
|
||||
node_modules/
|
||||
|
||||
# artifacts
|
||||
coverage/
|
||||
public/
|
||||
pages/
|
||||
|
||||
# installs
|
||||
node_modules/
|
||||
|
||||
# caches
|
||||
.yarn/
|
||||
.cache/
|
||||
.rpt2_cache
|
||||
|
||||
# builds
|
||||
dist/
|
||||
dist_web/
|
||||
dist_serve/
|
||||
dist_ts_web/
|
||||
|
||||
# custom
|
||||
@@ -1,5 +1,5 @@
|
||||
# gitzone standard
|
||||
image: hosttoday/ht-docker-node:npmci
|
||||
# gitzone ci_default
|
||||
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||
|
||||
cache:
|
||||
paths:
|
||||
@@ -26,6 +26,7 @@ mirror:
|
||||
snyk:
|
||||
stage: security
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci command npm install -g snyk
|
||||
- npmci command npm install --ignore-scripts
|
||||
- npmci command snyk test
|
||||
@@ -36,21 +37,11 @@ snyk:
|
||||
# ====================
|
||||
# test stage
|
||||
# ====================
|
||||
testLEGACY:
|
||||
stage: test
|
||||
script:
|
||||
- npmci node install legacy
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
allow_failure: true
|
||||
|
||||
testLTS:
|
||||
stage: test
|
||||
script:
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
@@ -58,13 +49,14 @@ testLTS:
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
|
||||
testSTABLE:
|
||||
|
||||
testBuild:
|
||||
stage: test
|
||||
script:
|
||||
- npmci node install stable
|
||||
- npmci npm prepare
|
||||
- npmci node install lts
|
||||
- npmci npm install
|
||||
- npmci npm test
|
||||
- npmci command npm run build
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- docker
|
||||
@@ -73,7 +65,7 @@ testSTABLE:
|
||||
release:
|
||||
stage: release
|
||||
script:
|
||||
- npmci node install stable
|
||||
- npmci node install lts
|
||||
- npmci npm publish
|
||||
only:
|
||||
- tags
|
||||
@@ -86,19 +78,11 @@ release:
|
||||
# ====================
|
||||
codequality:
|
||||
stage: metadata
|
||||
image: docker:stable
|
||||
allow_failure: true
|
||||
services:
|
||||
- docker:stable-dind
|
||||
script:
|
||||
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
|
||||
- docker run
|
||||
--env SOURCE_CODE="$PWD"
|
||||
--volume "$PWD":/code
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock
|
||||
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
|
||||
artifacts:
|
||||
paths: [codeclimate.json]
|
||||
- npmci command npm install -g tslint typescript
|
||||
- npmci npm install
|
||||
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
|
||||
tags:
|
||||
- docker
|
||||
- priv
|
||||
@@ -117,9 +101,10 @@ pages:
|
||||
image: hosttoday/ht-docker-node:npmci
|
||||
stage: metadata
|
||||
script:
|
||||
- npmci command npm install -g typedoc typescript
|
||||
- npmci command npm install -g @gitzone/tsdoc
|
||||
- npmci npm prepare
|
||||
- npmci npm install
|
||||
- npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/
|
||||
- npmci command tsdoc
|
||||
tags:
|
||||
- docker
|
||||
- notpriv
|
||||
@@ -130,13 +115,3 @@ pages:
|
||||
paths:
|
||||
- public
|
||||
allow_failure: true
|
||||
|
||||
windowsCompatibility:
|
||||
image: stefanscherer/node-windows:10-build-tools
|
||||
stage: metadata
|
||||
script:
|
||||
- npm install & npm test
|
||||
coverage: /\d+.?\d+?\%\s*coverage/
|
||||
tags:
|
||||
- windows
|
||||
allow_failure: true
|
||||
|
||||
4
.snyk
Normal file
4
.snyk
Normal file
@@ -0,0 +1,4 @@
|
||||
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
|
||||
version: v1.12.0
|
||||
ignore: {}
|
||||
patch: {}
|
||||
@@ -2,5 +2,15 @@
|
||||
"npmci": {
|
||||
"npmGlobalTools": [],
|
||||
"npmAccessLevel": "public"
|
||||
},
|
||||
"gitzone": {
|
||||
"module": {
|
||||
"githost": "gitlab.com",
|
||||
"gitscope": "pushrocks",
|
||||
"gitrepo": "smartcsv",
|
||||
"shortDescription": "handle csv data | gitzone standard compliant",
|
||||
"npmPackagename": "@pushrocks/smartcsv",
|
||||
"license": "MIT"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
1458
package-lock.json
generated
1458
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
29
package.json
29
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/smartcsv",
|
||||
"version": "1.0.12",
|
||||
"version": "1.0.20",
|
||||
"private": false,
|
||||
"description": "handle csv data | gitzone standard compliant",
|
||||
"main": "dist/index.js",
|
||||
@@ -13,14 +13,25 @@
|
||||
"format": "(gitzone format)"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@gitzone/tsbuild": "^2.0.22",
|
||||
"@gitzone/tsrun": "^1.1.12",
|
||||
"@gitzone/tstest": "^1.0.15",
|
||||
"@pushrocks/smartfile": "^6.0.6",
|
||||
"@pushrocks/tapbundle": "^3.0.5",
|
||||
"@types/node": "^10.7.1"
|
||||
"@gitzone/tsbuild": "^2.1.17",
|
||||
"@gitzone/tsrun": "^1.2.8",
|
||||
"@gitzone/tstest": "^1.0.28",
|
||||
"@pushrocks/smartfile": "^7.0.6",
|
||||
"@pushrocks/tapbundle": "^3.2.0",
|
||||
"@types/node": "^12.12.17"
|
||||
},
|
||||
"dependencies": {
|
||||
"@pushrocks/smartpromise": "^2.0.5"
|
||||
}
|
||||
"@pushrocks/smartpromise": "^3.0.6",
|
||||
"@pushrocks/smartstring": "^3.0.17"
|
||||
},
|
||||
"files": [
|
||||
"ts/*",
|
||||
"ts_web/*",
|
||||
"dist/*",
|
||||
"dist_web/*",
|
||||
"assets/*",
|
||||
"cli.js",
|
||||
"npmextra.json",
|
||||
"readme.md"
|
||||
]
|
||||
}
|
||||
|
||||
26
readme.md
Normal file
26
readme.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# @pushrocks/smartcsv
|
||||
handle csv data | gitzone standard compliant
|
||||
|
||||
## Availabililty and Links
|
||||
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartcsv)
|
||||
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartcsv)
|
||||
* [github.com (source mirror)](https://github.com/pushrocks/smartcsv)
|
||||
* [docs (typedoc)](https://pushrocks.gitlab.io/smartcsv/)
|
||||
|
||||
## Status for master
|
||||
[](https://gitlab.com/pushrocks/smartcsv/commits/master)
|
||||
[](https://gitlab.com/pushrocks/smartcsv/commits/master)
|
||||
[](https://www.npmjs.com/package/@pushrocks/smartcsv)
|
||||
[](https://snyk.io/test/npm/@pushrocks/smartcsv)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||
[](https://prettier.io/)
|
||||
|
||||
## Usage
|
||||
|
||||
For further information read the linked docs at the top of this readme.
|
||||
|
||||
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
|
||||
|
||||
[](https://maintainedby.lossless.com)
|
||||
@@ -1,3 +1,3 @@
|
||||
Header 1;Header 2; Header3
|
||||
row1data1; row1data2; row1data3
|
||||
row2data1; row2data2; row2data3
|
||||
Header 1;Header 2;"Header 3"
|
||||
"row1data1";"row1data2";"row1data3"
|
||||
"row2data1";row2data2;"row2data3"
|
||||
|
||||
|
10
test/test.ts
10
test/test.ts
@@ -13,9 +13,17 @@ tap.test('should read a file', async tools => {
|
||||
});
|
||||
|
||||
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();
|
||||
console.log(result);
|
||||
});
|
||||
|
||||
tap.test('should create a valid csv string', async () => {
|
||||
const createdCsvString = await smartcsv.Csv.createCsvStringFromArray([
|
||||
{ wow: 'hi', wow2: 'there' },
|
||||
{ wow: 'really', wow3: 'yes' }
|
||||
]);
|
||||
console.log(createdCsvString);
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
||||
113
ts/index.ts
113
ts/index.ts
@@ -2,27 +2,91 @@ import * as plugins from './smartcsv.plugins';
|
||||
|
||||
export interface ICsvConstructorOptions {
|
||||
headers: boolean;
|
||||
unquote?: boolean;
|
||||
}
|
||||
|
||||
export class Csv {
|
||||
// STATIC
|
||||
|
||||
/**
|
||||
* creates a Csv Object from string
|
||||
* @param csvStringArg
|
||||
* @param optionsArg
|
||||
*/
|
||||
public static async createCsvFromString(
|
||||
csvStringArg: string,
|
||||
options: ICsvConstructorOptions
|
||||
optionsArg: ICsvConstructorOptions
|
||||
): Promise<Csv> {
|
||||
const csvInstance = new Csv();
|
||||
csvInstance.csvString = csvStringArg;
|
||||
csvInstance.determineKeyframe();
|
||||
const csvInstance = new Csv(csvStringArg, optionsArg);
|
||||
await csvInstance.exportAsObject();
|
||||
return csvInstance;
|
||||
}
|
||||
|
||||
public static async createCsvStringFromArray(arrayArg: any[]): Promise<string> {
|
||||
const foundKeys: string[] = [];
|
||||
|
||||
// lets deal with the keys
|
||||
for (const objectArg of arrayArg) {
|
||||
for (const key of Object.keys(objectArg)) {
|
||||
foundKeys.includes(key) ? null : foundKeys.push(key);
|
||||
}
|
||||
}
|
||||
|
||||
// lets deal with the data
|
||||
const dataRows: string[] = [];
|
||||
for (const objectArg of arrayArg) {
|
||||
const dataRowArray: string[] = [];
|
||||
for (const key of foundKeys) {
|
||||
dataRowArray.push(objectArg[key]);
|
||||
}
|
||||
dataRows.push(dataRowArray.join(','));
|
||||
}
|
||||
|
||||
// lets put togehter the csv string and return it
|
||||
const headerString = foundKeys.join(',');
|
||||
const dataString = dataRows.join('\n');
|
||||
const csvString = `${headerString}\n${dataString}\n`;
|
||||
return csvString;
|
||||
}
|
||||
|
||||
// INSTANCE
|
||||
public csvString: string;
|
||||
public headers: string[];
|
||||
public keyFrame: string = null;
|
||||
public data: any[];
|
||||
|
||||
private base64RecognitionPrefix = '####12345####';
|
||||
|
||||
public options: ICsvConstructorOptions = {
|
||||
headers: true
|
||||
headers: true,
|
||||
unquote: true
|
||||
};
|
||||
|
||||
public determineKeyframe() {
|
||||
constructor(csvStringArg: string, optionsArg: ICsvConstructorOptions) {
|
||||
this.options = {
|
||||
...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();
|
||||
}
|
||||
|
||||
/**
|
||||
* determines the keyframe of the csv string
|
||||
*/
|
||||
private determineKeyframe() {
|
||||
let commaLength = 0;
|
||||
let semicolonLength = 0;
|
||||
const commaRegexResult = this.csvString.match(/,/g);
|
||||
@@ -41,7 +105,10 @@ export class Csv {
|
||||
}
|
||||
}
|
||||
|
||||
public serializeCsvString() {
|
||||
/**
|
||||
* serializes the csv string
|
||||
*/
|
||||
private serializeCsvString() {
|
||||
const rowArray = this.getRows();
|
||||
const resultArray = [];
|
||||
if (this.options.headers) {
|
||||
@@ -54,7 +121,10 @@ export class Csv {
|
||||
return resultArray;
|
||||
}
|
||||
|
||||
public getRows(): string[] {
|
||||
/**
|
||||
* gets the rows of the csv
|
||||
*/
|
||||
private getRows(): string[] {
|
||||
const rowsArray = this.csvString.split('\n');
|
||||
if (rowsArray[rowsArray.length - 1] === '') {
|
||||
rowsArray.pop();
|
||||
@@ -62,20 +132,40 @@ export class Csv {
|
||||
return rowsArray;
|
||||
}
|
||||
|
||||
public getHeaders() {
|
||||
private getHeaders() {
|
||||
const rowArray = this.getRows();
|
||||
if (this.options.headers) {
|
||||
let headerRow = rowArray[0];
|
||||
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;
|
||||
}
|
||||
|
||||
public createDataObject(dataArray: string[]) {
|
||||
private createDataObject(dataArray: string[]) {
|
||||
const neededIterations = dataArray.length;
|
||||
let resultJson: any = {};
|
||||
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;
|
||||
}
|
||||
@@ -86,6 +176,7 @@ export class Csv {
|
||||
for (const dataArray of serializedData) {
|
||||
dataObjects.push(this.createDataObject(dataArray));
|
||||
}
|
||||
this.data = 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 };
|
||||
|
||||
26
tslint.json
26
tslint.json
@@ -1,13 +1,17 @@
|
||||
{
|
||||
"extends": [
|
||||
"tslint:latest",
|
||||
"tslint-config-prettier"
|
||||
],
|
||||
"rules": {
|
||||
"semicolon": [
|
||||
true,
|
||||
"always"
|
||||
]
|
||||
"extends": ["tslint:latest", "tslint-config-prettier"],
|
||||
"rules": {
|
||||
"semicolon": [true, "always"],
|
||||
"no-console": false,
|
||||
"ordered-imports": false,
|
||||
"object-literal-sort-keys": false,
|
||||
"member-ordering": {
|
||||
"options":{
|
||||
"order": [
|
||||
"static-method"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"defaultSeverity": "warning"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user