1.0.6 • Published 3 years ago

@xroom.app/validators v1.0.6

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

Data validators library

Installation

Run from command line

npm i @xroom.app/validators

Usage example

Define your own validators

const V = require('@xroom.app/validators/lib/data-type')
const ER = require('@xroom.app/validators/lib/errors')
const E = require('@xroom.app/data-types/lib/either')
const T = require('@xroom.app/validators/lib/basic')

// SECTION Types

// MODULE Imports

/** @template T @typedef {import('@xroom.app/validators/lib/basic').ValidationResult<T>} ValidationResult */

/** @template T1, T2 @typedef {import('@xroom.app/validators/lib/basic').ValidatorExtension<T1, T2>} ValidatorExtension */

// SECTION Constants

/** @type {<T extends { length: number }>(data: T) => ValidationResult<T>} */
const nonEmpty = data => data.length !== 0 ? E.right(data) : E.left([ER.conditionError('non empty', data)])

/** @type {(validator: ValidatorExtension<number, number>) => <T extends { length: number }>(data: T) => ValidationResult<T>} */
const lengthMatches = validator => data => {
  const result = validator(data.length)

  if (E.isRight(result)) { return E.right(data) }

  return E.left([ER.fieldError('length'), ...result.data])
}

/** @type {(number: number) => <N extends number>(data: N) => ValidationResult<N>} */
const leq = number => data => data <= number ? E.right(data) : E.left([ER.conditionError(`less or equal to ${number}`, data)])

Combine your and bundled validators into models

const validatePassword = V.chain(V.chain(T.string, nonEmpty), lengthMatches(leq(32)))

const validateOptions = T.type([
  T.prop('required', 'lock', T.boolean),
  T.prop('optional', 'password', validatePassword),
])

Get readable errors out of box

const data = {
  password: '',
  lock: false,
}

const result = validateOptions(data)

if (E.isLeft(result)) {
  // Error:  [
  //   { __tag: 'field', field: 'password' },
  //   { __tag: 'condition', condition: 'non empty', value: '' }
  // ]
  console.log('Error: ', result.data)
}
1.0.6

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago