diff --git a/packages/core/src/actions/index.ts b/packages/core/src/actions/index.ts index c677cac9b..7b4e3fca9 100644 --- a/packages/core/src/actions/index.ts +++ b/packages/core/src/actions/index.ts @@ -26,8 +26,10 @@ import { RankedTester } from '../testers'; import { JsonSchema, UISchemaElement } from '../'; import { generateDefaultUISchema, generateJsonSchema } from '../generators'; import { UISchemaTester } from '../reducers/uischemas'; +import * as AJV from 'ajv'; export const INIT: 'jsonforms/INIT' = 'jsonforms/INIT'; +export const SET_AJV: 'jsonforms/SET_AJV' = 'jsonforms/SET_AJV'; export const UPDATE_DATA: 'jsonforms/UPDATE' = 'jsonforms/UPDATE'; export const VALIDATE: 'jsonforms/VALIDATE' = 'jsonforms/VALIDATE'; export const ADD_RENDERER: 'jsonforms/ADD_RENDERER' = 'jsonforms/ADD_RENDERER'; @@ -50,13 +52,15 @@ export interface UpdateAction { export const init = ( data: any, schema: JsonSchema = generateJsonSchema(data), - uischema: UISchemaElement = generateDefaultUISchema(schema) + uischema: UISchemaElement = generateDefaultUISchema(schema), + ajv?: AJV.Ajv ) => ({ type: INIT, data, schema, - uischema + uischema, + ajv }); export const registerDefaultData = ( @@ -73,6 +77,13 @@ export const unregisterDefaultData = (schemaPath: string) => ({ schemaPath }); +export const setAjv = ( + ajv: AJV.Ajv +) => ({ + type: SET_AJV, + ajv +}); + export const update = (path: string, updater: (any) => any): UpdateAction => ({ type: UPDATE_DATA, diff --git a/packages/core/src/reducers/core.ts b/packages/core/src/reducers/core.ts index fa023a278..3772a05d5 100644 --- a/packages/core/src/reducers/core.ts +++ b/packages/core/src/reducers/core.ts @@ -24,7 +24,7 @@ */ import * as _ from 'lodash'; import { ErrorObject, ValidateFunction } from 'ajv'; -import { INIT, UPDATE_DATA } from '../actions'; +import { INIT, SET_AJV, UPDATE_DATA } from '../actions'; import { createAjv } from '../util/validator'; import { JsonSchema, UISchemaElement } from '..'; @@ -70,7 +70,8 @@ export const coreReducer = ( switch (action.type) { case INIT: { - const v = ajv.compile(action.schema); + const thisAjv = action.ajv ? action.ajv : ajv; + const v = thisAjv.compile(action.schema); const e = sanitizeErrors(v, action.data); return { @@ -81,6 +82,16 @@ export const coreReducer = ( errors: e }; } + case SET_AJV: { + const currentAjv = action.ajv; + const validator = currentAjv.compile(state.schema); + const errors = sanitizeErrors(validator, state.data); + return { + ...state, + validator, + errors + }; + } case UPDATE_DATA: { if (action.path === undefined || action.path === null) {