@twistezo/ts-dto-mapper
v1.0.16
Published
DTO mapper based on TS types
Downloads
93
Maintainers
Readme
DTO mapper based on TS types
Description
Utility for easy mapping between DTO and OM objects based on their data types.
Benefits:
- no object-oriented approach based on classes
- no cluttering the code with decorators
- no need to install a large library for a simple operation
- only function based on objects types with access to the context inside
Knowledge
DTO - Data Transfer Object
- ex. object shape from API
- https://en.wikipedia.org/wiki/Data_transfer_object
OM - Object Model
- various shape of object, ex. business object
- https://en.wikipedia.org/wiki/Object_model
Setup
npm install @twistezo/ts-dto-mapper
Tips
Always populate generic types
<From>
, and<To>
inmapDTO
function. This helps you with debugging and provides IDE IntelliSense..transform
accepts callback with source context so you can put there reusable data transformation and have reusable mapper.
Usage
tldr;
From DTO:
const foo = mapDTO<FooDTO, Foo>({ from: fooDTO }).transform(fooDTO => ({
// map with access to source context
}))
To DTO:
const fooDTO = mapDTO<Foo, FooDTO>({ from: foo }).transform(foo => ({
// map with access to source context
}))
Full example
Import:
import { mapDTO } from '@twistezo/ts-dto-mapper'
Prepare OM and DTO shapes:
type Foo = {
id: string
firstName: string
lastName: string
}
type FooDTO = {
uuid: number
fullName: string
unnecessary: object
}
Prepare objects:
const foo: Foo = {
id: '1001',
firstName: 'John',
lastName: 'Smith',
}
const fooDTO: FooDTO = {
uuid: 1001,
fullName: 'John Smith',
unnecessary: {},
}
Map from DTO to OM:
const fooFromFooDTO: Foo = mapDTO<FooDTO, Foo>({ from: fooDTO }).transform(
(fooDTO: FooDTO): Foo => {
// map with access to source context
const { fullName, uuid } = fooDTO
const [firstName, lastName] = fullName.split(' ')
return {
id: uuid.toString(),
firstName,
lastName,
}
},
)
Map from OM to DTO:
const fooDTOfromFoo: FooDTO = mapDTO<Foo, FooDTO>({ from: foo }).transform(foo => {
// map with access to source context
const { firstName, id, lastName } = foo
return {
uuid: Number(id),
fullName: `${firstName} ${lastName}`,
unnecessary: {},
}
})