@kilbergr/dto-builder
v0.2.0-Dev.5
Published
Data only object builder from a typescript interface
Downloads
791
Readme
DTO Builder
Build a DTo object from an interface.
Installation
NPM
npm install @kilbergr/dto-builder
Yarn
yarn add @kilbergr/dto-builder
Usage
import { DtoBuilder } from '@kilbergr/dto-builder';
Examples
Build a simple DTO
import { isRight } from 'fp-ts/Either';
import { DtoBuilder } from '@kilbergr/dto-builder';
interface User {
id: number;
name: string;
email: string;
tags: string[];
}
const builder = DtoBuilder.create<User>();
const user = builder
.setId(1)
.setName('John Doe')
.setEmail('[email protected]')
.addTags('tag1', 'tag2')
.build();
if (isRight(user)) {
console.log(user.right);
} else {
console.log('Building user failed', user.left);
}
Patching a DTO
Override a fragment of the DTO.
import { DtoBuilder } from '@kilbergr/dto-builder';
interface User {
id: number;
name: string;
email: string;
}
const builder = DtoBuilder.create<User>();
const userBuilder = builder
.setId(1)
.setName('John Doe')
.setEmail('[email protected]');
userBuilder.patch({
name: 'Jane Doe',
email: '[email protected]',
});
Cloning a DTO builder
Share a common data between multiple DTOs.
import { DtoBuilder.create } from '@kilbergr/dto-builder';
interface User {
id: number;
name: string;
email: string;
organization: string;
}
const userBuilder = DtoBuilder.create<User>().setOrganization('Test Inc.');
const userOne = userBuilder
.clone()
.setId(1)
.setName('John Doe')
.setEmail('[email protected]')
.build();
const userTwo = userBuilder
.clone()
.setId(2)
.setName('Jane Doe')
.setEmail('[email protected]')
.build();
Counting arrays
import { DtoBuilder.create } from '@kilbergr/dto-builder';
interface WithTags {
tags: string[];
}
const builder = DtoBuilder.create<WithTags>().addTags('tag1', 'tag2', 'tag3');
const tagsCount = builder.countTags();
Validating DTO
The DTO builder can validate the DTO before building it. It requires some validation function for that. It is possible to use for example some json schema with ajv.
import { Ajv } from 'ajv';
import { DtoBuilder.create } from '@kilbergr/dto-builder';
const ajv = new Ajv();
interface UserDto {
id: number;
name: string;
email: string;
}
const userSchema: JsonSchemaType<UserDto> = { ... };
const userDtoValidator = ajv.compile(userSchema);
function validateUserDto(dto: UserDto): boolean {
if (!userDtoValidator(dto)) {
const errors = userDtoValidator.errors;
const error = ... // aggregate errors into one`
return error;
};
return true;
}
const userBuilder = DtoBuilder.create<UserDto, UserBuilderError>({}, {
validate: validateUserDto
});
const user = userBuilder.setId(1).build();
if (isRight(user)) {
console.log(user.right);
} else {
console.log('Building user failed', user.left);
}