2.0.0 • Published 1 year ago
mutent-json-schema v2.0.0
mutent-json-schema
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).
Install
npm i mutent-json-schemaAPI
mutentJsonSchema(options)
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-schemaare also supported.- Returns:
<Plugin>
Default Ajv options
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
})JSON Schema errors
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.
Example
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 } ]License
Licensed under MIT.