Skip to content

Convenient Invariant functor and several helper functions for validation

License

Notifications You must be signed in to change notification settings

derbent-ninjas/invariant-composer

Repository files navigation

invariant-composer:

What is it?

This library provides utilities which allow you to compose validation invariants into invariants trees. And it gives you detailed information about failed invariants, their path, their error messages and other information which you can pass.


Get started:

Install:

npm install @derbent-ninjas/invariant-composer

Usage:

Create validation functions which return invariants, it can be either fail or success:

const invariant1 = (): Invariant => {
  return success()
}

const invariant2 = (): Invariant => {
  return fail({ message: 'invariant 2 fails, because of something' })
}

const invariant3 = (): Invariant => {
  return fail({ message: 'invariant 3 fails, because of something' })
}

Then you can compose this invariants as a tree:

display(
  path('deepnessA', compose(
    path('deepnessA-B1', invariant1()),
    path(
      'deepnessA-B2',
      compose(path('deepnessA-B2-C', invariant2()))
    ),
    path('deepnessA-B3', invariant3()),
  ))
)

Result:

{
  "status":"FAIL",
  "info": {
    "paths": {
      "deepnessA.deepnessA-B2.deepnessA-B2-C":[{"message":"invariant 2 fails, because of something"}],
      "deepnessA.deepnessA-B3":[{"message":"invariant 3 fails, because of something"}]
    }
  }
}

Looks simple, doesn't it?


More functions:


ifExists

ifExists<T>(property: T, invariantFn: (property: T) => Invariant)

Executes invariant function only if passed value is not undefined. Otherwise, returns success() invariant.

ifExists(name, isNameValid)

assert

assert(path: string, invariant: Invariant)

throw InvariantError if passed invariant is fail.

const canCreateName = fail({ message: 'name is not valid' });
assert('name', canCreateName);

isInvariantError

isInvariantError(value: any)

returns true is passed value is invariant error.

isInvariantError(error)

Guard

@Guard(canActivateFn: (*arguments of decorated function*) => Invariant)

Decorator which throws an InvariantError if passedCanActivate function returned fail invariant.

class Cat {
  name: string;
  
  @Guard(canSetName)
  setName(newName: string) {
    this.name = newName;
  }
}

LICENCE:

This library is MIT licensed