Skip to content
/ mapper Public

Object to object mapper in Typescript - Inspired by Automapper

License

Notifications You must be signed in to change notification settings

wufe/mapper

Repository files navigation

Mapper - Object to object mapper in Typescript

Inspired by Automapper

Warning: This is NOT a complete reimplementation of Automapper.

What is this

This library provides an API to map an object into another object, following previously set rules.
It is designed with redux's reducers in mind, so it is a perfect fit when used as application's state incremental modifier.
It provides immutability, nested mapping capabilities and higly customizable configuration interfaces.

Supports:

  • Immutability
  • Nested mapping
  • Redudant mapping
  • Override of pre-existing rules to behave differently in runtime (edge cases)
  • Array mapping

How to

Getting started

Install

yarn add @wufe/mapper

or

npm i --save @wufe/mapper


Configuration

Each map ruleset requires a mapping signature, to be able to identify object types at runtime.

Create a mapper and instantiate your first map ruleset
Syntax:
mapper.createMap<S, D>(signature: MapSignature, destination: { new(): D })

const mapper = new Mapper();
const sourceDestinationSignature: MapSignature = {
    source: Symbol('SourceClass'),
    destination: Symbol('DestinationClass')
};
mapper.createMap<SourceClass, DestinationClass>(sourceDestinationSignature, DestinationClass);

To apply the mapping
Syntax:
mapper.map<S, D>(signature: MapSignature, source: S)

const sourceObject = new SourceClass();
sourceObject.a = 'a';
const destinationObject = mapper.map<SourceClass, DestinationClass>(sourceDestinationSignature, sourceObject);
// destinationObject.a is now 'a'

Map creation without signature

It is possible to create a map rule set without a signature, using the mapTo decorator.

Syntax:

@mapTo(Destination)
class Source {}

Example:

import { Mapper } from '@wufe/mapper';

class Destination {
    class Destination {
    destGreeting: string;
    constructor() {
        this.destGreeting = 'destination';
    }
}

@mapTo(Destination)
class Source {
    sourceGreeting: string;
    constructor() {
        this.sourceGreeting = 'source';
    }
}

const mapper = new Mapper();
mapper.createMap<Source, Destination>(Source)
    .forMember("destGreeting", opt => opt.mapFrom(src => src.sourceGreeting));

const sourceEntity = new Source();

const destinationEntity = mapper.map<Source, Destination>(sourceEntity);

Examples

More examples are available in the tests folder.


Documentation

Check the documentation in the wiki.

About

Object to object mapper in Typescript - Inspired by Automapper

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published