/chimney-ts

Type safe object transformation in TypeScript

Primary LanguageTypeScriptMIT LicenseMIT

Chimney-ts

Travis Donate

Type safe object transformation in TypeScript.
This project was heavily inspired from https://github.com/scalalandio/chimney

Usage

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>

API

Chimney

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.

Transformer#withFieldConst

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>

Transformer#withFieldRenamed

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 to Into<IntoFieldName>

Transformer#withFieldComputed

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

Transformer#transform

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()

Changelog

v1.2.0

  • Support Array and Promise transformation

v1.0.2

  • Fix bug of type definitions

v1.0.0

  • Initial release