Package Exports
- @heritsilavo/mapper
- @heritsilavo/mapper/dist/index.esm.js
- @heritsilavo/mapper/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@heritsilavo/mapper) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
πΊοΈ @heritsilavo/Mapper
TypeScript object mapper library with fluent API, inspired by AutoMapper (.NET) and MapStruct (Java).
β¨ Features
- π― Fluent API - Chain configurations with
.forMember() - π Auto-mapping - Automatically maps properties with identical names
- π¨ Custom transformations - Define complex mapping rules
- π¦ Reverse mapping - Create bidirectional mappings with
.reverseMap() - π§© Mapping profiles - Organize mappings by domain
- π Type-safe - Full TypeScript support with generics
- π Array mapping - Map collections with
.mapArray()
π¦ Installation
npm install @heritsilavo/mapperπ Quick Start
import { Mapper } from '@heritsilavo/mapper';
// Define your classes
class User {
id!: number;
firstName!: string;
lastName!: string;
age!: number;
}
class UserDto {
id!: number;
fullName!: string;
ageCategory!: string;
}
// Create mapper instance
const mapper = new Mapper();
// Configure mapping
mapper.createMap(User, UserDto)
.forMember('fullName', s => `${s.firstName} ${s.lastName}`)
.forMember('ageCategory', s => s.age >= 18 ? 'Adult' : 'Minor');
// Use the mapper
const user = Object.assign(new User(), {
id: 1,
firstName: 'Heritsilavo',
lastName: 'Andriantsilavina',
age: 22
});
const dto = mapper.map(user, UserDto);
console.log(dto);
// Output: { id: 1, fullName: 'Heritsilavo Andriantsilavina', ageCategory: 'Adult' }π Documentation
Basic Mapping
// Auto-mapping (properties with same name)
mapper.createMap(Product, ProductDto);
const dto = mapper.map(product, ProductDto);Custom Transformations
mapper.createMap(User, UserDto)
.forMember('fullName', s => `${s.firstName} ${s.lastName}`)
.forMember('displayAge', s => `${s.age} years old`);Array Mapping
const users: User[] = [...];
const dtos = mapper.mapArray(users, UserDto);Reverse Mapping
mapper.createMap(User, UserDto)
.forMember('fullName', s => `${s.firstName} ${s.lastName}`)
.reverseMap()
.forMember('firstName', s => s.fullName.split(' ')[0])
.forMember('lastName', s => s.fullName.split(' ')[1]);Mapping Profiles
import { MappingProfile } from '@heritsilavo/mapper';
class UserMappingProfile extends MappingProfile {
configure(mapper: Mapper): void {
mapper.createMap(User, UserDto)
.forMember('fullName', s => `${s.firstName} ${s.lastName}`);
mapper.createMap(User, UserSummaryDto)
.forMember('name', s => s.firstName);
}
}
mapper.addProfile(new UserMappingProfile());Custom Mapper
mapper.createCustomMap(User, UserDto, (source) => ({
id: source.id,
fullName: `${source.firstName} ${source.lastName}`,
ageCategory: source.age >= 18 ? 'Adult' : 'Minor'
}));Disable Auto-mapping
mapper.createMap(User, UserDto)
.disableAutoMap()
.forMember('id', s => s.id)
.forMember('fullName', s => `${s.firstName} ${s.lastName}`);π§ API Reference
Mapper
| Method | Description |
|---|---|
createMap(Source, Destination) |
Create a mapping configuration |
.forMember(key, transform) |
Define custom transformation |
.reverseMap() |
Create reverse mapping |
.map(source, Destination) |
Map single object |
.mapArray(sources, Destination) |
Map array of objects |
.addProfile(profile) |
Add mapping profile |
.createCustomMap(Source, Destination, fn) |
Create fully custom mapper |
.clear() |
Clear all configurations |
π€ Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
π License
MIT Β© Heritsilavo Andriantsilavina
Made with β€οΈ by Heritsilavo