Nectar of the Programming Masses

    feathers-hooks-validate-joi

    2.0.0 • Public • Published

    feathers-hooks-validate-joi

    Feathers hook utility for schema validation and sanitization using Joi. Joi error messages are converted to web/mobile friendly formats, and optionally translated for clarity or internationalization.

    Build Status Coverage Status

    Code Example

    const Joi = require('joi');
    const validate = require('feathers-hooks-validate-joi');
     
    const name = Joi.string().trim().min(5).max(30)
      .regex(/^[\sa-zA-Z0-9]$/, 'letters, numbers and spaces').required();
    const password = Joi.string().trim().min(2).max(30).required();
    const schema = Joi.object().keys({
      name: name,
      password,
      confirmPassword: password.label('Confirm password'),
    });
    const joiOptions = { convert: true, abortEarly: false };

    (1) Validate sanitize data. The client receives any errors in a format suitable for forms which also seems to be recommend by Feathers.

    export.before = {
      create: [ validate.form(schema, joiOptions) ],
      update: [ validate.form(schema, joiOptions) ],
      patch: [ validate.form(schema, joiOptions) ]
    };
     

    (2) Errors are returned in a Mongoose format.

    export.before = {
      create: [ validate.mongoose(schema, joiOptions) ],
      update: [ validate.mongoose(schema, joiOptions) ],
      patch: [ validate.mongoose(schema, joiOptions) ]
    };

    (3) Internationalize or clarify Joi error messages.

    function i18n(str) { return str; } // internationalization
     
    const translations = {
      'string.min': () => i18n('"${key}" must be ${limit} or more chars.'),
      'string.regex.base': (context) => {
        switch (context.pattern.toString()) {
          case /^[\sa-zA-Z0-9]{5,30}$/.toString():
            return i18n('"${key}" must consist of letters, digits or spaces.');
        }
      }
    };
     
    export.before = {
      create: [ validate.mongoose(schema, joiOptions, translations) ],
      update: [ validate.mongoose(schema, joiOptions, translations) ],
      patch: [ validate.mongoose(schema, joiOptions, translations) ]
    };

    Note: Data values in the $set operator are not validated. You could use joi-errors-for-forms for that.

    Motivation

    Data must be validated and sanitized before the database is changed. The client must be informed of any errors using a schema friendly to web/mobile apps.

    This repo helps implement this in Feathers CRUD hooks.

    Installation

    Install Nodejs.

    Run npm install feathers-hooks-validate-joi --save in your project folder.

    You can then require the utilities.

    API Reference

    To do.

    Tests

    npm test to run tests.

    npm run cover to run tests plus coverage.

    A Note on Internationalization

    The options in Joi.validate(value, schema, options, cb)supports a language option with which you can change Joi error messages in bulk.

    You can then internationalize your field names and regex descriptions in the schema, e.g.

    Joi.string().regex(/^[\sa-zA-Z0-9]$/, i18n('letters, number and spaces')).label(i18n('Confirm password'))

    These are suitable methods to internationalize the majority of Joi error messages.

    Contributors

    License

    MIT. See LICENSE.

    Install

    npm i feathers-hooks-validate-joi

    DownloadsWeekly Downloads

    100

    Version

    2.0.0

    License

    MIT

    Last publish

    Collaborators

    • eddystop