1.5.1 • Published 2 years ago

js-value-object v1.5.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

js-value-object

A value object library for nodejs

API reference can be found at Here

Installation

Using npm:

> npm install js-value-object

Using yarn:

> yarn add js-value-object

Import the library

import {
  Entity,
  ValueObject,
  DateValueObject,
  NumberValueObject,
  StringValueObject,
  UniqueEntityIdValueObject,
} from "js-value-object";

Example

Using predefined value object

const username = StringValueObject.create({
  value: "some-username",
  name: "username",
  min: 8,
  max: 50,
});
// Check if it is valid value-object
username.isValid;
// Check if username is valid value-object. Return this if valid, otherwise throw Error
username.orFail();
// Check if two value object is equal
username.isEqual(anotherUsername);
// throw Error right after creation if not valid
> const invalidUsername = StringValueObject.create({
  value: "name", // <-- invalid value, too short
  name: "username",
  min: 8,
  max: 50,
}).orFail()

Customize value object

import { ValueObject, IValueObjectProps } from "js-value-object";

export enum AccountType {
  USER = "user",
  ADMIN = "admin",
}

export type IAccountTypeValueObjectProps = IValueObjectProps<AccountType>;

export class AccountTypeValueObject extends ValueObject<AccountType> {
  private constructor(props: IAccountTypeValueObjectProps) {
    super(props);
  }

  static create(value: string): AccountTypeValueObject {
    return new AccountTypeValueObject({
      value: value as AccountType,
      name: "accountType",
    });
  }

  public isEqual(vo: ValueObject<unknown>): boolean {
    return vo instanceof AccountTypeValueObject && vo.value === this.value;
  }

  protected validate(): boolean {
    return Object.values(AccountType).includes(this.value);
  }
}

Create Entity

import {
  Entity,
  StringValueObject,
  UniqueEntityIdValueObject,
} from "js-value-object";
import { AccountType, AccountTypeValueObject } from "./accountType";

export interface IAccount {
  accountId: string;
  username: string;
  password: string;
  type: AccountType;
}

export interface AccountProps {
  username: StringValueObject;
  password: StringValueObject;
  type: AccountTypeValueObject;
}

export class Account extends Entity<AccountProps> {
  get accountId(): IAccount["accountId"] {
    return this.id.value;
  }

  get username(): IAccount["username"] {
    return this.props.username.value;
  }

  get password(): IAccount["password"] {
    return this.props.password.value;
  }

  get type(): IAccount["type"] {
    return this.props.type.value;
  }

  static createOne(obj: Record<string, string>): Account {
    const accountId = UniqueEntityIdValueObject.create(
      obj.accountId,
      "accountId"
    );
    const username = StringValueObject.create({
      value: obj.username,
      name: "username",
      min: 8,
      max: 50,
    });
    const password = StringValueObject.create({
      value: obj.password,
      name: "password",
      min: 8,
      max: 50,
    });
    const type = AccountTypeValueObject.create(obj.type);
    const account = new Account(
      {
        username,
        password,
        type,
      },
      "account",
      accountId
    );
    // return this if valid, otherwise throw Error
    return account.orFail();
  }
}
1.5.1

2 years ago

1.5.0

2 years ago

1.4.0

2 years ago

1.3.1

2 years ago

1.3.0

2 years ago

1.2.0

2 years ago

1.1.0

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago