1.0.10 • Published 1 year ago

sinoval v1.0.10

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

sinoval

Sinoval (Simple Node.js Validator) is a simple and easy-to-use node.js validator.

Features

  • Easy to use
  • Chaining validation rules
  • Customizable validation rules
  • Customizable error messages
  • Customizable attributes

Installation

npm install sinoval

Usage/Examples

import sinoval from 'sinoval'

const rules = {
    'name': 'required|min:2|alpha_num',
    'email': 'required|email',
    'phone_number': 'starts_with:+62,08',
    'password': 'required|min:6',
    'password_confirmation': 'required|same:password',
    'shipping.method': 'required|in:regular,express',
    'shipping.address': 'required',
    'product.*.name': 'required',
    'product.*.qty': 'required|numeric|max:10',
    'attendanceType:': 'required',
    'location:': 'required_if:attendanceType,in-person',
    'sub_domain': 'required|ends_with:.example.com',
    'old_password': 'required',
    'new_password': 'required|different:old_password',
}

const data = {}

const validator = await sinoval.validate(rules, data)

console.log(validator)

Available rules

  • required

    The field under validation must be present in the input data and not empty. A field is "empty" if it meets one of the following criteria:

    • The value is null or undefined
    • An empty string ('')
    • An empty array ([])
    • An empty object ({}).
  • required_if:anotherfield,value

    The field under validation must be present and not empty if the anotherfield field is equal to any value. Example:

    location: 'required_if:attendanceType,in-person'

  • required_unless:anotherfield,value

    The field under validation must be present and not empty unless the anotherfield field is equal to any value. Example:

    location: 'required_unless:attendance_type,online'

  • numeric

    The field under validation must be a number or a numeric string.

  • min:value

    The field under validation must have a minimum value.

    For string data, value corresponds to the number of characters.

    For numeric data, value corresponds to a given integer value.

    For an array, size corresponds to the length of the array.

  • max:value

    The field under validation must be less than or equal to a maximum value.

    For string data, value corresponds to the number of characters.

    For numeric data, value corresponds to a given integer value.

    For an array, size corresponds to the length of the array.

  • max_filesize:value

    The field under validation must be less than or equal to a maximum file size.

    The value must be a string with a unit, e.g., "1.5MB".

  • alpha

    The field under this rule must be entirely alphabetic characters.

  • alpha_num

    The field under this rule must be entirely alpha-numeric characters.

  • in:value1,value2

    The field under validation must be included in the given list of values.

  • not_in:value1,value2

    The field under validation must not be included in the given list of values.

  • email

    The field under validation must be formatted as an email address.

  • url

    The field under validation must be a valid URL.

  • same:anotherfield

    The given field must match the field under validation.

  • different:anotherfield

    The field under validation must have a different value than field.

  • starts_with:value1,value2

    The field under validation must start with the given value or one of the given values (separated by comma).

  • ends_with:value1,value2

    The field under validation must end with the given value or one of the given values (separated by comma).

  • boolean

    The field under validation must be a valid boolean representation.

    Accepted input are true, false, 1, 0, "1", and "0".

Custom rules

sinoval.setRule({
    exists: async ({ value, args }) => {
        const argv = args.split(',')
        const table = argv[0]
        const field = argv[1]
        const exist = await db(table).where(field, value).first()
        return { pass: exist !== undefined }
    },
    uppercase: ({ value }) => {
        return { pass: value === value.toUpperCase() }
    },
    archive: ({ value }) => {
        const extensions = ['.7z', '.rar', '.tar.gz', '.zip']
        for (const ext of extensions) {
            if (value.endsWith(ext)) {
                return { pass: true }
            }
        }
        return {
            pass: false,
            extra: {
                extensions: extensions.join(', ')
            }
        }
    },
})
const rules = {
    username: 'required|exists:users,username',
    country: 'required|uppercase',
    file: 'archive',
}

Custom messages

sinoval.setMessage({
    'required': ({ attribute }) => `The ${attribute} field cannot be empty.`,
    'archive': ({ attribute, extra }) => `The ${attribute} must be an archive file of the allowed types: ${extra.extensions} .`,
    'email.required': 'We need to know your email address!',
})

Custom attributes

sinoval.setAttribute({
    zip: 'zip code',
})

Configuration

KeyTypeDefault
convertToReadableFieldNamesbooleantrue
convertToReadableFieldNamesFunction(fieldName: any) => stringsinoval.utils.convertToReadableFieldNames
ruleSeparatorstring\|
parseNumericbooleantrue
// Example
sinoval.setConfig({
    convertToReadableFieldNames: false,
    convertToReadableFieldNamesFunction: fieldName => fieldName.toUpperCase(),
    ruleSeparator: '&',
    parseNumeric: false,
})
console.log(await sinoval.validate({
    firstName: 'required&min:2',
    age: 'required&numeric',
}, {
    age: '30',
}))
// Will produce:
// {
//     ...
//     errors: {
//         firstName: 'The FIRSTNAME field is required.'
//     },
//     data: {
//         firstName: null,
//         age: '30',
//     },
// }

License

MIT

1.0.10

1 year ago

1.0.9

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago