A basic JSON Schema Validator
DISCLAIMER: This is a basic JSON Schema validator implementation, it dont implement the full JSON Schema spec, so it's should never used in production. For a faster and powerful JSON Schema validator, please use AJV
npm install --save jsonschemav
const JsonSchemav = require('jsonschemav')
const jsv = new JsonSchemav()
const schema = {
type: 'object',
properties: {
title: { type: 'string', minLength: 6 },
date: { type: 'string', format: 'date', default: 'now()' }
}
}
const data = { title: 'Hello, World!' }
const validator = jsv.compile(schema)
validator
.then((instance) => instance.validate(datta))
.then((parsedData) => {
// use `parsedData` instead `data`
console.log(parsedData)
// { title: 'Hello, World!',
// date: '2017-06-12T18:49:14.739Z' }
})
validator
.then((instance) => instance.validate('Hello'))
.catch((err) => {
console.error(err.errors)
// [ { keyword: 'minLength',
// size: 5,
// minLength: 6,
// message: 'not enough characters. must be greater than, or equal to, 6' } ]
})
validator
.then((instance) => instance.validate(true))
.catch((err) => {
console.error(err.errors)
// [ { keyword: 'type', message: 'invalid type input' } ]
})
const axios = require('axios')
const JsonSchemav = require('jsonschemav')
const jsv = new JsonSchemav()
const schema = { type: 'string', isTwitterAccount: true }
const endpoint = 'https://twitter.com/users/username_available'
const validationFn = (value, data) => {
// value is the keyword value
// data.value is the user data
if (value === true) {
return axios.get(`${endpoint}?username=${data.value}`)
.then((response) => {
if (response.data.valid) {
const message = `The username '${data.value}' does not exists`
const err = new Error()
err.props = { message }
throw err
}
return Promise.resolve(data.value)
})
}
return true
}
jsv.addKeyword('string', 'isTwitterAccount', validationFn)
const validator = jsv.compile(schema)
validator
.then((instance) => instance.validate('nonexistingac'))
.catch((err) => {
console.error(err.errors)
// [ { message: 'The username \'nonexistingac\' does not exists',
// keyword: 'isTwitterAccount' } ]
})
validator
.then((instance) => instance.validate('demsking'))
.then((parsedData) => {
console.log('success')
})
- validateSchema()
- compile()
- addCompileStep()
- addAlias()
- addType()
- removeType()
- addKeyword()
- removeKeyword()
Validate a schema. Throws an error for invalid schema
schema
object Schema to validate
const jsv = new JsonSchemav()
const schema = { type: 'string' }
try {
jsv.validateSchema(schema)
} catch (err) {
console.error(err)
}
Compile a schema
schema
object Schema to compile
const jsv = new JsonSchemav()
const schema = {
type: 'object',
properties: {
title: { type: 'string' },
date: { type: 'string', format: 'date', default: 'now()' }
}
}
const data = { title: 'Hello, World!' }
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// use `parsedData` instead `data`
console.log(parsedData)
// { title: 'Hello, World!',
// date: '2017-06-12T18:49:14.739Z' }
})
.catch((err) => {
console.error(err.errors) // a list of parsing error
})
Returns Promise Returns the validation interface on success and an error otherwise
Add a compile step function to a type
Add an alias for a type
const jsv = new JsonSchemav()
const schema = { type: 'int' }
const data = 123
jsv.addAlias('integer', 'int')
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// use `parsedData` instead `data`
console.log(parsedData) // 123
})
.catch((err) => {
// err.errors is a list of parsing error
})
Add a new type to the instance
const jsv = new JsonSchemav()
const validateFn = (data) => {
return Number.isInteger(data.value) && /^[01]+$/.test(data.value.toString())
}
jsv.addType('binary', validateFn)
const schema = { type: 'binary' }
const data = 1111011
const instance = jsv.compile(schema)
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// use `parsedData` instead `data`
console.log(parsedData) // 1111011
})
Remove a type from the instance
name
string The nema of the type
const schema = { type: 'string' }
const jsv = new JsonSchemav()
jsv.removeType('string')
try {
jsv.validateSchema(schema)
} catch (err) {
console.error(err) // Error: Unknown type 'string'
}
Add a new keyword to a type
type
string The name of the typename
string The name of the new keywordvalidateFn
function A validate function for the new keyword
const jsv = new JsonSchemav()
const validateFn = function (value, data) {
// value is the keyword value
// data.value is the user data
// the function must returns:
// - true: for a success validation
// - false: for a faillure validate
// - an object { message, errors }
// - a Promise for async validation
return new Promise((resolve, reject) => {
//...
})
}
jsv.addKeyword('string', 'provider', validateFn)
// and then
const schema = {
type: 'object',
properties: {
account: { type: 'string', provider: 'twitter' }
}
}
Remove a keyword from a type
const jsv = new JsonSchemav()
jsv.removeKeyword('string', 'minLength')
const schema = { type: 'string', minLength: 5 }
const instance = jsv.compile(schema)
const data = 'abc'
jsv.compile(schema)
.then((instance) => instance.validate(data))
.then((parsedData) => {
// success
})
Under the MIT license. See LICENSE file for more details.