@logicroom/validator
TypeScript icon, indicating that this package has built-in type declarations

2.3.0 • Public • Published

Validator

This is the validation script for The Clean Architecture (JavaScript)

Getting Started

  npm install --save @logicroom/validator

or

  yarn add @logicroom/validator

Purpose

The purpose of the Logic Room Validator is simplify adding validation and change handling to form inputs when using Mobx. The library exposes two new classes GenericFormInputPresenter and GenericFormPresenter. The former provides an intelligent form input API that can be extended to create view model code for any form input (e.g a TextInput). The latter is for grouping these inputs into a form and provides form level attributes and methods.

GenericFormInputPresenter

API

You create a new form input by newing up the class:

import { GenericFormInputPresenter } from '@logicroom/validator'
const emailInput = new GenericFormInputPresenter<string>('email@address.com')

In the above example, a new text input has been created. We've told the GenericFormInputPresenter that the initial value is 'email@address.com'. We've also said that the value is of type 'string' passed as a generic in <string>.

This gives us access to the following properties and methods on the emailInput instance. All properties are observable via Mobx.

Name Property/Method Value Default Type
value Property current value of input initial value provided at construction generic (provided at construction)
isValid Property whether the current value passes all current validation rules true boolean
errorMessages Property a list of messages for all currently non-passing rules [] string[]
isDirty Property whether value has been changed via onChange handler false boolean
disabled Property whether the form input is disabled false boolean
required Property whether the form input is required false boolean
onChange Method the function to call to update the value (to be bound in the view layer) (newValue: T) => void
withMiddleware Method this adds a middleware that can be used to access and manipulate the value coming into onChange before it gets set to value (e.g. v => v.toUpperCase()) (newValue: T) => T
reset Method sets the value and isDirty back to their defaults () => void
addCustomRule Method (fluent) use this method to add a custom validation rule (condition: (value: T) => boolean, errorMessage?: string) => this
mustBeEmail Method (fluent) value must conform to the General Email Regex found here unset (errorMessage?: string) => this
mustBeTrue Method (fluent) value must be true unset (errorMessage?: string) => this
mustBeBool Method (fluent) value must be true or false unset (errorMessage?: string) => this
mustBeString Method (fluent) value must be of type string unset (errorMessage?: string) => this
mustBeNumberPrimitive Method (fluent) value must be of type number unset (errorMessage?: string) => this
mustBeNumber Method (fluent) value must be of type number or valid number string (e.g. '55') unset (errorMessage?: string) => this
minLength Method (fluent) value must have length equal or greater than provided number unset (length: number, errorMessage?: string) => this
maxLength Method (fluent) value must have length equal or less than provided number unset (length: number, errorMessage?: string) => this
isRequired Method (fluent) value must be populated unset (errorMessage?: string) => this
isDisabled Method (fluent) input is disabled unset () => this

Examples

Creation

const emailInput = new GenericFormInputPresenter<string>('email@address.com')
  .mustBeEmail()
  .isRequired()

Update value

emailInput.onChange('new@value.com`)

Check validity

const emailInput = new GenericFormInputPresenter<string>('email@address.com')
  .mustBeEmail('Your email address is not valid')
  .isRequired()

console.log(emailInput.isValid)
// true

emailInput.onChange('qwerty')

console.log(emailInput.isValid)
// false

console.log(emailInput.errorMessages)
// ['Your email address is not valid']

GenericFormPresenter

API

You create a new form by newing up the class:

import {
  GenericFormInputPresenter,
  GenericFormPresenter
} from '@logicroom/validator'

// first we create the input(s) that will be used by the form
const emailInput = new GenericFormInputPresenter<string>('email@address.com')

// then we create the form and add our form input(s)
const myForm = new GenericFormPresenter().addFormInput(emailInput)

In the above example a new form is created with GenericFormPresenter. We've told our form that it has one form input (emailInput). The below table describes the properies and methods available on myForm.

Name Property/Method Value Default Type
isDirty Property form is dirty if any of the inputs are dirty false boolean
isValid Property form is valid if all of the inputs are valid and no server errors exist true boolean
serverErrors Property set server errors to indicate validation errors that have been returned server side validation [] string[]
errorMessages Property any server errors concatanated with any errors from invalid form inputs [] string[]
addFormInput Method (fluent) call this method to add a form input to this form (input: GenericFormInputPresenter) => this
resetForm Method call this method to reset each input in the form () => void

Examples

Creation

const emailInput = new GenericFormInputPresenter<string>('')
const passwordInput = new GenericFormInputPresenter<string>('')

const myForm = new GenericFormPresenter()
  .addFormInput(emailInput)
  .addFormInput(passwordInput)

Reset Form

const emailInput = new GenericFormInputPresenter<string>('intial')
const passwordInput = new GenericFormInputPresenter<string>('')

const myForm = new GenericFormPresenter()
  .addFormInput(emailInput)
  .addFormInput(passwordInput)

emailInput.onChange('foo')

console.log(emailInput.value)
// 'foo'

myForm.reset()

console.log(emailInput.value)
// 'intial'

Form validity / server errors

const emailInput = new GenericFormInputPresenter<string>(
  'test@email.com'
).mustBeEmail('Must be email')

const myForm = new GenericFormPresenter().addFormInput(emailInput)

console.log(myForm.isValid)
// true

emailInput.onChange('not an email')

console.log(myForm.isValid)
// true

console.log(myForm.errors)
// ['Must be email']

myForm.serverErrors.push('Email not found, please register first')

console.log(myForm.errors)
// ['Must be email', 'Email not found, please register first']

Readme

Keywords

none

Package Sidebar

Install

npm i @logicroom/validator

Weekly Downloads

4,836

Version

2.3.0

License

MIT

Unpacked Size

38.4 kB

Total Files

16

Last publish

Collaborators

  • matthew.was
  • peterheard01
  • riglar