Type safe object transformation in TypeScript.
This project was heavily inspired from https://github.com/scalalandio/chimney
import { Chimney } from "chimney-ts";
const square = { size: 10 };
type Rect = { width: number, height: number };
const incompleteRect = new Chimney(square)
.into<Rect>()
.withFieldRenamed("size", "width");
// Can't call `transform()` because `height` property not filled
// incompleteRect.transform()
const completeRect = incompleteRect
.withFieldRenamed("size", "height")
.transform();
// Square transforms into Rect
Also transforms from Array or Promise
new Chimney([square])
.into<Rect>()
.withFieldRenamed("size", "width")
.withFieldRenamed("size", "height")
.transform(); // -> Rect[]
new Chimney(Promise.resolve(square))
.into<Rect>()
.withFieldRenamed("size", "width")
.withFieldRenamed("size", "height")
.transform(); // -> Promise<Rect>
Creates new chimney transformer.
import { Chimney } from "chimney-ts";
const transformer = new Chimney(fromObj).into<Into>();
type constraints
fromObj
value must extends{} | {}[] | Promise<{}>
type.Into
type must extends{}
type.
Creates new transformer that fills constantValue at fieldName.
transformer
.withFieldConst("width", 10)
.withFieldConst("height", 10)
Compatible code:
- Non-monadic:
{ ...fromObj, [intoFieldName]: constValue }
- Array:
fromObj.map(el => ({ ...el, [intoFieldName]: constValue }))
- Promise:
fromObj.then(el => ({ ...el, [intoFieldName]: constValue }))
arguments & type constraints
- intoFieldName:
keyof Into
type. - constValue: value that extends type of
Into<IntoFieldName>
Creates new transformer that renames field.
transformer
.withFieldRenamed("size", "width")
.withFieldRenamed("size", "height")
Compatible code:
- Non-monadic:
{ ...fromObj, [intoFieldName]: fromObj[fromFieldName] }
- Array:
fromObj.map(el => ({ ...el, [intoFieldName]: fromObj[fromFieldName] }))
- Promise:
fromObj.then(el => ({ ...el, [intoFieldName]: fromObj[fromFieldName] }))
arguments & type constraints
- fromFieldName:
keyof From
type. - intoFieldName:
keyof Into
type &From<IntoFieldName>
equals toInto<IntoFieldName>
Creates new transformer that fills computed value at fieldName.
transformer
.withFieldComputed("width", fromObj => fromObj.size * 10)
.withFieldComputed("height", fromObj => fromObj.size * 10)
Compatible code:
- Non-monadic:
{ ...fromObj, [intoFieldName]: computeFn(fromObj) }
- Array:
fromObj.map(el => ({ ...fromObj, [intoFieldName]: computeFn(fromObj) }))
- Promise:
fromObj.then(el => ({ ...fromObj, [intoFieldName]: computeFn(fromObj) }))
arguments & type constraints
- intoFieldName:
keyof Into
type - computeFn(fromObj): function that returns value that extends
Into<IntoFieldName>
type
Returns transformed value that has Into
type (or Into[] | Promise<Into>
).
If transformer is not compatible with Into type, method can't call!
transformer.transform()
- Support Array and Promise transformation
- Fix bug of type definitions
- Initial release