@corefunc/class-fillable-dto

Fillable DTO with validation

Usage no npm install needed!

<script type="module">
  import corefuncClassFillableDto from 'https://cdn.skypack.dev/@corefunc/class-fillable-dto';
</script>

README

Class Fillable DTO

Class Fillable DTO with validation functionality. 🟩 NodeJS only.

Example

Minimal implementation

class MyCoolDto extends FillableDto {
  public shouldDisplayMessage: boolean;
}

Strips unnecessary properties

const INCLUDE_KEYS: ReadonlyArray<keyof IMyCoolDto> = [
  'shouldDisplayMessage',
] as const;

class MyCoolDto extends FillableDto implements IMyCoolDto {
  public readonly shouldDisplayMessage: boolean;

  public constructor(attributes: Partial<IMyCoolDto>) {
    super(attributes, INCLUDE_KEYS);
  }
}

const myCoolDto = new MyCoolDto({
  shouldDisplayMessage: false,
  thisPropertyWillBeStripped: true,
});

Default values

const DEFAULT_VALUES: Readonly<IMyCoolDto> = {
  shouldDisplayMessage: false,
} as const;

class MyCoolDto extends FillableDto implements IMyCoolDto {
  public readonly shouldDisplayMessage: boolean;

  public constructor(attributes: Partial<IMyCoolDto>) {
    super(attributes, undefined, DEFAULT_VALUES);
  }
}

DO NOT SET DEFAULT VALUES IN CLASS PROPERTIES!!!

Attributes argument passed to the constructor will be overwritten with a class property default value.

const DEFAULT_VALUES: Readonly<IMyCoolDto> = {
  shouldDisplayMessage: false,
} as const;

class MyCoolDto extends FillableDto implements IMyCoolDto {
  public readonly isActive: boolean = false; // 🛑✋⚠️ No!!!
  public readonly shouldDisplayMessage: boolean;

  public constructor(attributes: Partial<IMyCoolDto>) {
    super(attributes, undefined, DEFAULT_VALUES);
  }
}

const myCoolDto = new MyCoolDto({
  isActive: true,
  shouldDisplayMessage: false,
});

// `false` as in class property default declaration
console.log(myCoolDto.isActive); // false

Fillable DTO Enterprise Edition

interface IMyCoolDto {
  shouldDisplayMessage: boolean;
}

const INCLUDE_KEYS: ReadonlyArray<keyof IMyCoolDto> = [
  'shouldDisplayMessage',
] as const;

const DEFAULT_VALUES: Readonly<IMyCoolDto> = {
  shouldDisplayMessage: false,
} as const;

class MyCoolDto extends FillableDto implements IMyCoolDto {
  public readonly shouldDisplayMessage: boolean;

  public constructor(attributes: Partial<IMyCoolDto>) {
    super(attributes, INCLUDE_KEYS, DEFAULT_VALUES);
  }
}

Methods

Declaration

import { IsBoolean } from 'class-validator';

class MyCoolDto extends FillableDto implements IMyCoolDto {
  @IsBoolean()
  public readonly shouldDisplayMessage: boolean;

  public constructor(attributes: Partial<IMyCoolDto>) {
    super(attributes, INCLUDE_KEYS, DEFAULT_VALUES);
  }
}

Initialization

const attributes = { shouldDisplayMessage: true };
const includeKeys = ["isActive", "shouldDisplayMessage"];
const defaults = { isActive: true };

const myCoolDto = new MyCoolDto(attributes, includeKeys, defaults);

// re-assing everithing
myCoolDto.assign(attributes, includeKeys, defaults);

Factory Methods

const myCoolDtoFromJSON = MyCoolDto
  .fromJSON(`{"shouldDisplayMessage":true}`);

const myCoolDtoFromObject = MyCoolDto
  .fromPlain({ shouldDisplayMessage: true });

Validation

const isValid = myCoolDto.isValid(true); // silent
myCoolDto.isValid(false); // throws error
const error: null | string = myCoolDto.getError();
const errors: string[] = myCoolDto.getErrors();

Serialization

myCoolDto.toJSON(); // creates plain object clone
myCoolDto.toObject(); // creates plain object clone
myCoolDto.toString(); // object packed in JSON string

Immutability

myCoolDto.lock(); // prevents further modifications

Utilities

validateInstance

import { validateInstance } from '@corefunc/class-fillable-dto';

// Empty array if there is no errors.
validateInstance(new ClassName());

// ['Provided value is not an object. Value is [null].']
validateInstance(null);

See also

💾 My other projects

Open Source