0.2.0-Dev.5 • Published 11 months ago

@kilbergr/dto-builder v0.2.0-Dev.5

Weekly downloads
-
License
MIT
Repository
github
Last release
11 months ago

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('john.doe@example.com')
  .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('john.doe@example.com');

userBuilder.patch({
  name: 'Jane Doe',
  email: 'jane.doe@example.com',
});

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('john.doe@example.com')
  .build();

const userTwo = userBuilder
  .clone()
  .setId(2)
  .setName('Jane Doe')
  .setEmail('jane.doe@example.com')
  .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);
}
0.2.0-Dev.5

11 months ago

0.2.0-Dev.4

11 months ago

0.2.0-Dev.1

11 months ago

0.2.0-Dev.3

11 months ago

0.2.0-Dev.2

11 months ago

0.1.0-Dev.8

11 months ago

0.1.0-Dev.7

11 months ago

0.1.0-Dev.6

11 months ago

0.1.0-Dev.5

11 months ago

0.1.0-Dev.4

11 months ago

0.1.0-Dev.3

11 months ago

0.1.0-Dev.2

11 months ago

0.1.0-Dev.1

11 months ago