feathers-hooks-validate-joi

Feathers hook utility for schema validation, sanitization and client notification using Joi.

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
feathers-hooks-validate-joi
67102.0.06 years ago8 years agoMinified + gzip package size for feathers-hooks-validate-joi in KB

Readme

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.](https://github.com/eddyystop/joi-errors-for-forms#code-examples)
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.