AJV - Проверить свойство является функцией - PullRequest
0 голосов
/ 12 февраля 2020

Я использую AJV для проверки объекта «настройки». Я хочу добавить новое свойство onFeedbackChange, которое может быть функцией (не обязательно).

  const ajv = new Ajv({
    allErrors: true,
  });
  ajv.addKeyword('function', {
    valid: true,
    validate: function (data) {
      return typeof data === 'function';
    }
  });
  const validate = ajv.compile(settingsSchema);

Схема:

  feedback:
    type: object
    properties:
      enabled:
        type: boolean
      saveFeedback: *endpoint
      updateFeedback: *endpoint
      onFeedbackChange: function
    additionalProperties: false
    required:
    - enabled
    - saveFeedback
    - updateFeedback

Но это не удается с:

Ошибка: схема недопустима: data.properties ['modules']. Properties ['feedback']. Properties ['onFeedbackChange'] должен быть объектом, логическим

Интересно, как выполнить проверку, и почему это не встроено.

1 Ответ

1 голос
/ 03 мая 2020

Мы используем это для проверки данных, которые содержат компонент React:

Данные, которые мы проверяем:

const config = {
    id: 'dailyGraph',
    component: BarGraph, // <-- react component (function)
    type: 'bar',
    ...
}

Наша схема:

const barSchema = {
    $schema: 'http://json-schema.org/draft-07/schema',
    $id: 'dailyGraph',
    type: 'object',
    readOnly: true,
    title: 'Schema for validating graph config',
    properties: {
        id: { 
            $id: '#/properties/id',
            type: 'string'
        },
        component: {
            $id: '#/properties/component',
            instanceof: 'Function', // <-- ajv custom keyword
        },
        type: {
            $id: '#/properties/type',
            type: 'string',
            enum: ['bar','pie'],
        }
        ...
    },
    required: ['id', 'assays', 'graphType']
};

И синтаксис .addKeyword в соответствии с приведенным здесь: https://github.com/epoberezkin/ajv/issues/147#issuecomment -199371370

const ajv = new Ajv();
const { id } = config;
const CLASSES = { Function: Function, ... };

ajv.addKeyword('instanceof', {
  compile: schema => data => data instanceof CLASSES[schema]
});

ajv.validate(barSchema, config)
  ? res(true)
  : console.error(`Graph config error for ${id}: ${ajv.errorsText()}`);

Передача component в виде строки (или чего-либо, кроме функции) выдает: Graph config error for dailyGraph: data.component should pass "instanceof" keyword validation

...