Sistema de mapeamento

AutoMap, createMap, AutoMapper e registro de mapeamentos entre classes.

O Koala Nest inclui um sistema de mapeamento inspirado em AutoMapper (.NET). Ele converte objetos entre entidades, requests, responses e DTOs de forma declarativa.

Componente Função
@AutoMap() Marca propriedades mapeáveis em uma classe
createMap() Registra mapeamento entre origem e destino
forMember() Customiza mapeamento de propriedades específicas
AutoMapper.map() Executa conversão entre duas classes
MappingStore Armazena metadados de mapeamento em memória
MappingProvider Registra mapeamentos na inicialização da app
typescript
export function AutoMap<T>(config?: AutoMapConfig<T>) {
  return function (target: any, propertyKey: string) {
    const compositionType: (() => any) | undefined = config?.type;

    MappingStore.setProp(target.constructor, propertyKey, compositionType);
  };
}

Uso em entidade:

typescript
@OneToMany(() => PersonContact, (contact) => contact.person, {
  cascade: true,
  onDelete: 'CASCADE',
})
@AutoMap({ type: () => PersonContact })
contacts: PersonContact[];

Crie uma classe mapper por recurso com método estático createMap():

typescript
export class PersonMapper {
  static createMap() {
    createMap(Person, CreatePersonResponse);

    createMap(Person, ReadPersonResponse);
    createMap(PersonAddress, ReadPersonAddressResponse);
    createMap(PersonContact, ReadPersonContactResponse);

    createMap(CreatePersonRequest, Person);
    createMap(CreatePersonAddressRequest, PersonAddress);
    createMap(CreatePersonContactRequest, PersonContact);

    createMap(UpdatePersonRequest, Person);
    createMap(UpdatePersonAddressRequest, PersonAddress);
    createMap(UpdatePersonContactRequest, PersonContact);

    createMap(ReadManyPersonRequest, PersonQueryDto);
    createMap(Person, ReadManyPersonResponseItem);
  }
}

Registre no MappingProvider (carregado pelo ControllerModule):

typescript
@Injectable()
export class MappingProvider {
  constructor() {
    PersonMapper.createMap();
  }
}
typescript
const person = AutoMapper.map(
  new CreatePersonValidator(req).validate(),
  CreatePersonRequest,
  Person,
);

return AutoMapper.map(createdPerson, Person, CreatePersonResponse);

O AutoMapper resolve propriedades pelo nome, mapeia objetos aninhados recursivamente e itera arrays automaticamente.

Para updates, carregue a entidade do banco e aplique o payload manualmente (como em UpdatePersonHandler). Coleções persistidas devem ser substituídas pela lista do request — o comportamento esperado com TypeORM cascade + orphanedRowAction: 'delete': ao salvar, itens ausentes na coleção viram órfãos e são removidos.

typescript
person.contacts = validated.contacts.map((contactRequest) => {
  if (contactRequest.id) {
    const existing = person.contacts.find((c) => c.id === contactRequest.id);
    if (existing) {
      existing.contact = contactRequest.contact;
      return existing;
    }
  }
  const contact = new PersonContact();
  contact.contact = contactRequest.contact;
  contact.person = person;
  return contact;
});

Não use append em coleções persistidas; o save trata a lista como estado completo.

A função forMember permite customizar o mapeamento de uma propriedade. Não é usada no PersonMapper do template, mas está disponível em src/core/tools/mapping/for-member.ts:

typescript
export function forMember<TTarget, TSource>(
  targetProp: keyof TTarget,
  map: (source: TSource) => TTarget[keyof TTarget],
): Partial<ForMemberResult<TTarget, TSource>> {
  return {
    [targetProp]: map,
  } as Partial<ForMemberResult<TTarget, TSource>>;
}

Passe o resultado como terceiro argumento de createMap().

  • Mapping not found for {TargetClass}: o par origem→destino não foi registrado com createMap().
  • Target properties not found for {TargetClass}: a classe destino não possui propriedades marcadas com @AutoMap().

Sempre registre novos pares de mapeamento ao adicionar requests, responses ou entidades.

Koala Nest

Facilitador para criar APIs NestJS com arquitetura DDD. Código copiado para o seu repositório — legível, adaptável e sob seu controle.

Creator

igordrangel.com.br

Design, back-end e estratégia de produto.

Comandos rápidos

CLI global e scripts no projeto gerado

  • bun install -g @koalarx/nest
  • kl-nest new
  • kl-nest add cache
  • bun run migration:run # template CRUD
  • kl-nest --help
© 2026 Koala NestFeito para desenvolvedores NestJS e fluxos assistidos por IA.