You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							162 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							162 lines
						
					
					
						
							4.1 KiB
						
					
					
				"use strict"; | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", { | 
						|
  value: true | 
						|
}); | 
						|
exports.default = void 0; | 
						|
 | 
						|
var _absolutePath = _interopRequireDefault(require("./keywords/absolutePath")); | 
						|
 | 
						|
var _ValidationError = _interopRequireDefault(require("./ValidationError")); | 
						|
 | 
						|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | 
						|
 | 
						|
// Use CommonJS require for ajv libs so TypeScript consumers aren't locked into esModuleInterop (see #110). | 
						|
const Ajv = require('ajv'); | 
						|
 | 
						|
const ajvKeywords = require('ajv-keywords'); | 
						|
/** @typedef {import("json-schema").JSONSchema4} JSONSchema4 */ | 
						|
 | 
						|
/** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */ | 
						|
 | 
						|
/** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */ | 
						|
 | 
						|
/** @typedef {import("ajv").ErrorObject} ErrorObject */ | 
						|
 | 
						|
/** | 
						|
 * @typedef {Object} Extend | 
						|
 * @property {number=} formatMinimum | 
						|
 * @property {number=} formatMaximum | 
						|
 * @property {boolean=} formatExclusiveMinimum | 
						|
 * @property {boolean=} formatExclusiveMaximum | 
						|
 */ | 
						|
 | 
						|
/** @typedef {(JSONSchema4 | JSONSchema6 | JSONSchema7) & Extend} Schema */ | 
						|
 | 
						|
/** @typedef {ErrorObject & { children?: Array<ErrorObject>}} SchemaUtilErrorObject */ | 
						|
 | 
						|
/** | 
						|
 * @callback PostFormatter | 
						|
 * @param {string} formattedError | 
						|
 * @param {SchemaUtilErrorObject} error | 
						|
 * @returns {string} | 
						|
 */ | 
						|
 | 
						|
/** | 
						|
 * @typedef {Object} ValidationErrorConfiguration | 
						|
 * @property {string=} name | 
						|
 * @property {string=} baseDataPath | 
						|
 * @property {PostFormatter=} postFormatter | 
						|
 */ | 
						|
 | 
						|
 | 
						|
const ajv = new Ajv({ | 
						|
  allErrors: true, | 
						|
  verbose: true, | 
						|
  $data: true | 
						|
}); | 
						|
ajvKeywords(ajv, ['instanceof', 'formatMinimum', 'formatMaximum', 'patternRequired']); // Custom keywords | 
						|
 | 
						|
(0, _absolutePath.default)(ajv); | 
						|
/** | 
						|
 * @param {Schema} schema | 
						|
 * @param {Array<object> | object} options | 
						|
 * @param {ValidationErrorConfiguration=} configuration | 
						|
 * @returns {void} | 
						|
 */ | 
						|
 | 
						|
function validate(schema, options, configuration) { | 
						|
  let errors = []; | 
						|
 | 
						|
  if (Array.isArray(options)) { | 
						|
    errors = Array.from(options, nestedOptions => validateObject(schema, nestedOptions)); | 
						|
    errors.forEach((list, idx) => { | 
						|
      const applyPrefix = | 
						|
      /** | 
						|
       * @param {SchemaUtilErrorObject} error | 
						|
       */ | 
						|
      error => { | 
						|
        // eslint-disable-next-line no-param-reassign | 
						|
        error.dataPath = `[${idx}]${error.dataPath}`; | 
						|
 | 
						|
        if (error.children) { | 
						|
          error.children.forEach(applyPrefix); | 
						|
        } | 
						|
      }; | 
						|
 | 
						|
      list.forEach(applyPrefix); | 
						|
    }); | 
						|
    errors = errors.reduce((arr, items) => { | 
						|
      arr.push(...items); | 
						|
      return arr; | 
						|
    }, []); | 
						|
  } else { | 
						|
    errors = validateObject(schema, options); | 
						|
  } | 
						|
 | 
						|
  if (errors.length > 0) { | 
						|
    throw new _ValidationError.default(errors, schema, configuration); | 
						|
  } | 
						|
} | 
						|
/** | 
						|
 * @param {Schema} schema | 
						|
 * @param {Array<object> | object} options | 
						|
 * @returns {Array<SchemaUtilErrorObject>} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function validateObject(schema, options) { | 
						|
  const compiledSchema = ajv.compile(schema); | 
						|
  const valid = compiledSchema(options); | 
						|
  if (valid) return []; | 
						|
  return compiledSchema.errors ? filterErrors(compiledSchema.errors) : []; | 
						|
} | 
						|
/** | 
						|
 * @param {Array<ErrorObject>} errors | 
						|
 * @returns {Array<SchemaUtilErrorObject>} | 
						|
 */ | 
						|
 | 
						|
 | 
						|
function filterErrors(errors) { | 
						|
  /** @type {Array<SchemaUtilErrorObject>} */ | 
						|
  let newErrors = []; | 
						|
 | 
						|
  for (const error of | 
						|
  /** @type {Array<SchemaUtilErrorObject>} */ | 
						|
  errors) { | 
						|
    const { | 
						|
      dataPath | 
						|
    } = error; | 
						|
    /** @type {Array<SchemaUtilErrorObject>} */ | 
						|
 | 
						|
    let children = []; | 
						|
    newErrors = newErrors.filter(oldError => { | 
						|
      if (oldError.dataPath.includes(dataPath)) { | 
						|
        if (oldError.children) { | 
						|
          children = children.concat(oldError.children.slice(0)); | 
						|
        } // eslint-disable-next-line no-undefined, no-param-reassign | 
						|
 | 
						|
 | 
						|
        oldError.children = undefined; | 
						|
        children.push(oldError); | 
						|
        return false; | 
						|
      } | 
						|
 | 
						|
      return true; | 
						|
    }); | 
						|
 | 
						|
    if (children.length) { | 
						|
      error.children = children; | 
						|
    } | 
						|
 | 
						|
    newErrors.push(error); | 
						|
  } | 
						|
 | 
						|
  return newErrors; | 
						|
} // TODO change after resolve https://github.com/microsoft/TypeScript/issues/34994 | 
						|
 | 
						|
 | 
						|
validate.ValidationError = _ValidationError.default; | 
						|
validate.ValidateError = _ValidationError.default; | 
						|
var _default = validate; | 
						|
exports.default = _default; |