Skip to content

denni-hill/chain-validator-js

Repository files navigation

✔️⛓️❌

chain-validator-js

Status GitHub Issues GitHub Pull Requests License


Easy to use and informative validation tool based on validator.js npm package

📝 Table of Contents

🧐 About

This tool is developed to write easy-to-[read, write, reuse] data validation. It provides intuitive chain syntax, implements all the npm validator.js package validators and sanitizers methods and can be extended by your own.

🏁 Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.

Installation

To install this library you can use npm or build it from sources.

Using npm:

npm install chain-validator-js --save

Code examples

Validate any data

Strings

validate(
    "validate me", 
    build().isString().contains("me")
).then(result => console.log(result));

Expected output

{
  "validated": "validate me",
  "errors": []
}

Arrays

validate(
  ["validate", "123"],
  build().isArray(
    build().isNumeric().withMessage("Given value is not type of numeric")
  )
).then((result) => console.log(JSON.stringify(result)));

Expected output

{
  "validated": {},
  "errors": [
    {
      "value": "validate",
      "message": "Given value is not type of numeric",
      "args": {
        "negate": false
      },
      "path": [
        "0"
      ]
    }
  ]
}

Objects

const authorValidation = () => {
    return build().schema({
        firstName: build().isString(),
        lastName: build().isString()
    });
}

const bookValidation = () => {
    return build().schema({
        name: build().isString(),
        authors: build().isArray(authorValidation())
    });
}

const data = {
    firstName: "Foo",
    lastName: "Bar",
    books: [
        {
            name: "Book1",
            authors: [{
                firstName: "Some",
                lastName: "Author"
            }]
        },
        {
            name: "Book2",
            authors: [{
                firstName: "Another",
                lastName: "Author"
            }]
        }
    ]
}

const validationSchema = build().schema({
    firstName: build().isString(),
    lastName: build().isString(),
    books: build().isArray(bookValidation())
})

validate(data, rules).then(result => console.log(JSON.stringify(result)));

Expected output

{
  "validated": {
    "firstName": "Foo",
    "lastName": "Bar",
    "books": [
      {
        "name": "Book1",
        "authors": [
          {
            "firstName": "Some",
            "lastName": "Author"
          }
        ]
      },
      {
        "name": "Book2",
        "authors": [
          {
            "firstName": "Another",
            "lastName": "Author"
          }
        ]
      }
    ]
  },
  "errors": []
}

In previous example functions authorValidation and bookValidation are functions that returns validation rules, that can be used as part of another validation rules (like authorValidation is a part of bookValidation). This can be super-useful for reusing and mixing rules.

Usefull API

Validate JSON schema, key - string, value - validation chain (build)

  build().schma({
    key: build()
  })

Set name for field being validated (access via error.args.fieldName)

  build().name("fieldName") #

Set custom error message

  buid().withMessage("error message")

Custom validation

  build().custom(
    (context) => async (value: unknown): Promise<boolean> => {
      /* return boolean */
    }
  )

Custom sanitizer

  build().custom(
    (context) => async (value: unknown): Promise<unknown> => {
      /* return sanitized value */
    }
  )

Invert next validator

  build().not().validatorGoesHere()

Conditions

IfTrue will be called if condition is succeed and will be applied to schema's root as it is usefull only in schemas. IMPORTANT: Condition validation chain applies to schema object! Use ifSelf method to apply condition to field in validation chain of which ifSelf called! Same thing with oneOf and oneOfSelf

  build().if(build().validationGoesHere(), {
    ifTrue: build().validationGoesHere(),
    ifFalse: build().validationGoesGere()
  })

  build().ifSelf(build().validationGoesHere(), {
    ifTrue: build().validationGoesHere(),
    ifFalse: build().validationGoesGere()
  })

  build().oneOf(
    build().validationGoesHere(), build().anotherValidationGoesHere(), build().more()
  )

  build().oneOfSelf(
    build().validationGoesHere(), build().anotherValidationGoesHere(), build().more()
  )

Bail

If validation is failed bail() will prevent field for next validation and sanitizing. Can be usefull if you are on server-side and want to load instance from database using customSanitizer() after validation, but not load it, if validation failed

  build().validator().bail().anotherValidator()

✍️ Authors

See also the list of contributors who participated in this project.

🎉 Acknowledgements

  • validator.js - all the included validation and sanitizing methods.
  • Inspired by express-validator - has the almost same functional, except the lack of informative errors.

About

validator.js based validator with chain syntax

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published