UNPKG

ngrx-model

Version:

Model classes for integrating ngrx store with a REST API

45 lines (37 loc) 1.46 kB
import { map, each, clone, get, isFunction, isArray } from 'lodash'; export interface IConverter<TDataType> { fromServer(raw: any, parent?: any): TDataType; toServer(data: TDataType, parent?: any): any, } export interface ITransformMapping { [index: string]: IConverter<any> | ITransformMapping; } export interface IConverterService { applyTransform(data: any, transform: IConverter<any> | ITransformMapping, toServer: boolean): any; } export class ConverterService { applyTransform(data: any, transform: IConverter<any> | ITransformMapping, toServer: boolean, parent?: any): any { if (transform == null || (parent == null && !data)) { return data; } if (isArray(data)) { return map(data, (item: any): any => { return this.applyTransform(item, transform, toServer); }); } if (this.isConverter(transform)) { let transformFunc: { (data: any, parent?: any): any } = toServer ? (<IConverter<any>>transform).toServer : (<IConverter<any>>transform).fromServer; return transformFunc(data, parent); } else { let mappedData: any = clone(data); each(transform, (childTransform: any, key: string): any => { mappedData[key] = this.applyTransform(get(mappedData, key), childTransform, toServer, mappedData); }); return mappedData; } } private isConverter(object: any): boolean { return isFunction(object.fromServer) || isFunction(object.toServer); } }