This plugin for Mutent will inject a set of Hooks that will validate that all Entities match with the desired JSON Schema.
The validation will be performed when any Entity is loaded (onEntity
hook) and before any Adapter's write op (beforeCreate
and beforeUpdate
hooks).
npm i mutent-json-schema
Returns a new Mutent's Plugin that enforces a JSON Schema to all Entities.
options
<Object>
[options.ajv]
<Ajv>
A customized instance of Ajv. Optional.[options.ajvOptions]
<Object>
Custom options for the Ajv constructor function. Optional defaults are documented below.options.schema
<*>
The required JSON Schema to enforce. Schemas generated withfluent-json-schema
are also supported.- Returns:
<Plugin>
Those are the default options used to create the internal Ajv instance.
new Ajv({
allErrors: process.env.NODE_ENV !== 'production',
coerceTypes: true,
removeAdditional: true,
useDefaults: true,
...pluginOptions.ajvOptions
})
When an Entity with an invalid schema is detected, an error will be thrown. The error is an instance of MutentError
with the "EMUT_INVALID_ENTITY"
code.
You can access the raw Ajv-generated errors, and the Entity that has generated those errors, from the .info.errors
and .info.data
properties respectively.
import { MutentError, Store } from 'mutent'
import ArrayAdapter from 'mutent-array'
import mutentJsonSchema from 'mutent-json-schema'
const store = new Store({
adapter: new ArrayAdapter(),
plugins: [
mutentJsonSchema({
schema: {
type: 'object',
additionalProperties: false,
properties: {
id: {
type: 'string'
},
value: {
type: 'integer'
}
},
required: ['id', 'value']
}
})
]
})
try {
await store.create({ value: 7 }).unwrap()
} catch (err) {
// Handle mutent-json-schema error
if (err instanceof MutentError && err.code === 'EMUT_INVALID_ENTITY') {
// Invalid data: { value: 7 }
console.error('Invalid data:', err.info.data)
// Schema errors: [
// {
// instancePath: '',
// schemaPath: '#/required',
// keyword: 'required',
// params: { missingProperty: 'id' },
// message: "must have required property 'id'"
// }
// ]
console.error('Schema errors:', err.info.errors)
} else {
throw err
}
}
await store.create({ id: 'my_entity', value: 42 }).unwrap()
console.log(store.raw) // [ { id: 'my_entity', value: 42 } ]
Licensed under MIT.