From 87d74ecd2cb16f3700b1942ebbbec221afe38790 Mon Sep 17 00:00:00 2001 From: doug-martin Date: Mon, 18 May 2020 20:54:40 -0500 Subject: [PATCH] feat(parsing): Less restrictive row parsing type #356 --- packages/format/src/types.ts | 5 +-- .../parse/__tests__/issues/issue356.spec.ts | 37 +++++++++++++++++++ packages/parse/src/types.ts | 8 ++-- 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 packages/parse/__tests__/issues/issue356.spec.ts diff --git a/packages/format/src/types.ts b/packages/format/src/types.ts index 26916bdc..0866d836 100644 --- a/packages/format/src/types.ts +++ b/packages/format/src/types.ts @@ -1,9 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -export interface RowMap { - [key: string]: any; -} - +export type RowMap = Record; export type RowHashArray = [string, any][]; export type RowArray = string[]; export type Row = RowArray | RowHashArray | RowMap; diff --git a/packages/parse/__tests__/issues/issue356.spec.ts b/packages/parse/__tests__/issues/issue356.spec.ts new file mode 100644 index 00000000..cd6aa794 --- /dev/null +++ b/packages/parse/__tests__/issues/issue356.spec.ts @@ -0,0 +1,37 @@ +import { EOL } from 'os'; +import { parseString, RowMap, RowArray } from '../../src'; + +describe('Issue #356 - https://github.com/C2FO/fast-csv/issues/356', () => { + interface InputRow { + clicks: string; + } + + interface ClicksRow { + clicks?: number; + } + + const CSV_CONTENT = ['clicks', `1`, '2', 'a'].join(EOL); + const expectedRows = [{ clicks: 1 }, { clicks: 2 }, {}]; + + it('allow transforming to any object shape', (done) => { + const invalid: RowArray[] = []; + const rows: RowMap[] = []; + parseString(CSV_CONTENT, { headers: true, escape: "'" }) + .transform((row: InputRow) => { + const clicks = parseInt(row.clicks, 10); + if (Number.isInteger(clicks)) { + return { clicks }; + } + return {}; + }) + .on('data-invalid', (row: RowArray) => invalid.push(row)) + .on('data', (r: ClicksRow) => rows.push(r)) + .on('error', done) + .on('end', (count: number) => { + expect(rows).toEqual(expectedRows); + expect(invalid).toHaveLength(0); + expect(count).toBe(expectedRows.length + invalid.length); + done(); + }); + }); +}); diff --git a/packages/parse/src/types.ts b/packages/parse/src/types.ts index 221925c8..7caa62db 100644 --- a/packages/parse/src/types.ts +++ b/packages/parse/src/types.ts @@ -1,7 +1,7 @@ -export interface RowMap { - [s: string]: string | undefined | null; -} -export type RowArray = string[]; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type RowMap = Record; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type RowArray = any[]; export type Row = RowMap | RowArray; export interface RowValidationResult {