import {CsvStringifier} from './abstract'; import {FieldStringifier} from '../field-stringifier'; import {Field, ObjectHeaderItem, ObjectStringifierHeader} from '../record'; import {isObject, ObjectMap} from '../lang/object'; export class ObjectCsvStringifier extends CsvStringifier> { private readonly header: ObjectStringifierHeader; constructor(fieldStringifier: FieldStringifier, header: ObjectStringifierHeader, recordDelimiter?: string) { super(fieldStringifier, recordDelimiter); this.header = header; } protected getHeaderRecord(): ObjectMap | null { if (!this.isObjectHeader) return null; return (this.header as ObjectHeaderItem[]).reduce((memo, field) => Object.assign({}, memo, {[field.id]: field.title}), {}); } protected getRecordAsArray(record: ObjectMap): Field[] { return this.fieldIds.map(field => record[field]); } private get fieldIds(): string[] { return this.isObjectHeader ? (this.header as ObjectHeaderItem[]).map(column => column.id) : (this.header as string[]); } private get isObjectHeader(): boolean { return isObject(this.header && this.header[0]); } }