simpler-mapper
v1.0.0-alpha003
Published
A javascript, profile-based model mapping library.
Downloads
1
Readme
Simpler Mapper
A recursive, object-to-object mapper with optional mapping profiles.
- For straight name-for-name mapping, no profile is needed.
- Use a profile for:
- specifying different source or destination names,
- value transformations,
- beforeMap or afterMap callbacks.
Usage
Basic usage with a mapping profile:
import { Mapper } from 'simpler-mapper';
// assumes class Accountant { ... } exists:
let mappingProfile = { exceptions: { homePhone: "cellPhone", fullname: p => p.First + " " + p.Last } };
let mapper = new Mapper();
let accountant = mapper.map(person, Accountant, mappingProfile);
Or, you can implement the MapperProfile<TSource, TDest>
interface to improve maintainability:
class MyProfile implements MapperProfile<Person, Accountant> {
exceptions = {
homePhone: "cellPhone" as keyof Person,
fullName: (p: Person) => p.First + " " + p.Last
};
beforeMap(src: Person): Accountant {
const a = new Accountant(src);
// ...super custom stuff...
return a;
}
}
let mappingProfile = new MyProfile();
In fact, a project can have many such mapping profiles, and they can inherit from (or be composed of) each other to ease your workload.
Beyond lambdas and property name overrides, you can also specify beforeMap and afterMap callbacks:
let mapper = new Mapper();
let mappingProfile = { afterMap: (src, dest, p) => dest["key"] = "val" };
let accountant = mapper.map(person, Accountant, mappingProfile);
That's about it. Personally, this is all I've needed. Just how much simpler is Simpler Mapper? It's one class, and its supporting interfaces, and type definitions.
Installation
npm install --save-dev simpler-mapper
History
Q: Didn't you already make a mapper?
A: Yes, but it wasn't simple/effective enough. It relied on annotations and wasn't very flexible.