diff options
Diffstat (limited to 'node_modules/ajv/lib')
66 files changed, 2185 insertions, 2072 deletions
diff --git a/node_modules/ajv/lib/$data.js b/node_modules/ajv/lib/$data.js new file mode 100644 index 000000000..60cfc2d8d --- /dev/null +++ b/node_modules/ajv/lib/$data.js @@ -0,0 +1,49 @@ +'use strict'; + +var KEYWORDS = [ +  'multipleOf', +  'maximum', +  'exclusiveMaximum', +  'minimum', +  'exclusiveMinimum', +  'maxLength', +  'minLength', +  'pattern', +  'additionalItems', +  'maxItems', +  'minItems', +  'uniqueItems', +  'maxProperties', +  'minProperties', +  'required', +  'additionalProperties', +  'enum', +  'format', +  'const' +]; + +module.exports = function (metaSchema, keywordsJsonPointers) { +  for (var i=0; i<keywordsJsonPointers.length; i++) { +    metaSchema = JSON.parse(JSON.stringify(metaSchema)); +    var segments = keywordsJsonPointers[i].split('/'); +    var keywords = metaSchema; +    var j; +    for (j=1; j<segments.length; j++) +      keywords = keywords[segments[j]]; + +    for (j=0; j<KEYWORDS.length; j++) { +      var key = KEYWORDS[j]; +      var schema = keywords[key]; +      if (schema) { +        keywords[key] = { +          anyOf: [ +            schema, +            { $ref: 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#' } +          ] +        }; +      } +    } +  } + +  return metaSchema; +}; diff --git a/node_modules/ajv/lib/ajv.d.ts b/node_modules/ajv/lib/ajv.d.ts index 5976e9e3f..1b5bd8188 100644 --- a/node_modules/ajv/lib/ajv.d.ts +++ b/node_modules/ajv/lib/ajv.d.ts @@ -7,26 +7,28 @@ declare namespace ajv {    interface Ajv {      /**      * Validate data using schema -    * Schema will be compiled and cached (using serialized JSON as key. [json-stable-stringify](https://github.com/substack/json-stable-stringify) is used to serialize. -    * @param  {String|Object} schemaKeyRef key, ref or schema object +    * Schema will be compiled and cached (using serialized JSON as key, [json-stable-stringify](https://github.com/substack/json-stable-stringify) is used to serialize by default). +    * @param  {String|Object|Boolean} schemaKeyRef key, ref or schema object      * @param  {Any} data to be validated      * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).      */ -    validate(schemaKeyRef: Object | string, data: any): boolean; +    validate(schemaKeyRef: Object | string | boolean, data: any): boolean | Thenable<any>;      /**      * Create validating function for passed schema. -    * @param  {Object} schema schema object +    * @param  {Object|Boolean} schema schema object      * @return {Function} validating function      */ -    compile(schema: Object): ValidateFunction; +    compile(schema: Object | boolean): ValidateFunction;      /**      * Creates validating function for passed schema with asynchronous loading of missing schemas.      * `loadSchema` option should be a function that accepts schema uri and node-style callback.      * @this  Ajv -    * @param {Object}   schema schema object -    * @param {Function} callback node-style callback, it is always called with 2 parameters: error (or null) and validating function. +    * @param {Object|Boolean} schema schema object +    * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped +    * @param {Function} callback optional node-style callback, it is always called with 2 parameters: error (or null) and validating function. +    * @return {Thenable<ValidateFunction>} validating function      */ -    compileAsync(schema: Object, callback: (err: Error, validate: ValidateFunction) => any): void; +    compileAsync(schema: Object | boolean, meta?: Boolean, callback?: (err: Error, validate: ValidateFunction) => any): Thenable<ValidateFunction>;      /**      * Adds schema to the instance.      * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. @@ -42,10 +44,10 @@ declare namespace ajv {      addMetaSchema(schema: Object, key?: string): void;      /**      * Validate schema -    * @param {Object} schema schema to validate +    * @param {Object|Boolean} schema schema to validate      * @return {Boolean} true if schema is valid      */ -    validateSchema(schema: Object): boolean; +    validateSchema(schema: Object | boolean): boolean;      /**      * Get compiled schema from the instance by `key` or `ref`.      * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). @@ -57,9 +59,9 @@ declare namespace ajv {      * If no parameter is passed all schemas but meta-schemas are removed.      * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.      * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. -    * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object +    * @param  {String|Object|RegExp|Boolean} schemaKeyRef key, ref, pattern to match key/ref or schema object      */ -    removeSchema(schemaKeyRef?: Object | string | RegExp): void; +    removeSchema(schemaKeyRef?: Object | string | RegExp | boolean): void;      /**      * Add custom format      * @param {String} name format name @@ -107,13 +109,13 @@ declare namespace ajv {        parentData?: Object | Array<any>,        parentDataProperty?: string | number,        rootData?: Object | Array<any> -    ): boolean | Thenable<boolean>; +    ): boolean | Thenable<any>;      errors?: Array<ErrorObject>; -    schema?: Object; +    schema?: Object | boolean;    }    interface Options { -    v5?: boolean; +    $data?: boolean;      allErrors?: boolean;      verbose?: boolean;      jsonPointers?: boolean; @@ -121,28 +123,29 @@ declare namespace ajv {      unicode?: boolean;      format?: string;      formats?: Object; -    unknownFormats?: boolean | string | Array<string>; +    unknownFormats?: true | string[] | 'ignore';      schemas?: Array<Object> | Object; -    ownProperties?: boolean; -    missingRefs?: boolean | string; -    extendRefs?: boolean | string; -    loadSchema?: (uri: string, cb: (err: Error, schema: Object) => any) => any; -    removeAdditional?: boolean | string; -    useDefaults?: boolean | string; -    coerceTypes?: boolean | string; +    schemaId?: '$id' | 'id'; +    missingRefs?: true | 'ignore' | 'fail'; +    extendRefs?: true | 'ignore' | 'fail'; +    loadSchema?: (uri: string, cb?: (err: Error, schema: Object) => void) => Thenable<Object | boolean>; +    removeAdditional?: boolean | 'all' | 'failing'; +    useDefaults?: boolean | 'shared'; +    coerceTypes?: boolean | 'array';      async?: boolean | string;      transpile?: string | ((code: string) => string);      meta?: boolean | Object; -    validateSchema?: boolean | string; +    validateSchema?: boolean | 'log';      addUsedSchema?: boolean;      inlineRefs?: boolean | number;      passContext?: boolean;      loopRequired?: number; -    multipleOfPrecision?: number; -    errorDataPath?: string; +    ownProperties?: boolean; +    multipleOfPrecision?: boolean | number; +    errorDataPath?: string,      messages?: boolean;      sourceCode?: boolean; -    beautify?: boolean | Object; +    processCode?: (code: string) => string;      cache?: Object;    } @@ -157,27 +160,30 @@ declare namespace ajv {    interface KeywordDefinition {      type?: string | Array<string>;      async?: boolean; +    $data?: boolean;      errors?: boolean | string; +    metaSchema?: Object;      // schema: false makes validate not to expect schema (ValidateFunction)      schema?: boolean;      modifying?: boolean;      valid?: boolean;      // one and only one of the following properties should be present -    validate?: ValidateFunction | SchemaValidateFunction; -    compile?: (schema: Object, parentSchema: Object) => ValidateFunction; -    macro?: (schema: Object, parentSchema: Object) => Object; -    inline?: (it: Object, keyword: string, schema: Object, parentSchema: Object) => string; +    validate?: SchemaValidateFunction | ValidateFunction; +    compile?: (schema: any, parentSchema: Object) => ValidateFunction; +    macro?: (schema: any, parentSchema: Object) => Object | boolean; +    inline?: (it: Object, keyword: string, schema: any, parentSchema: Object) => string;    }    interface SchemaValidateFunction {      ( -      schema: Object, +      schema: any,        data: any,        parentSchema?: Object,        dataPath?: string,        parentData?: Object | Array<any>, -      parentDataProperty?: string | number -    ): boolean | Thenable<boolean>; +      parentDataProperty?: string | number, +      rootData?: Object | Array<any> +    ): boolean | Thenable<any>;      errors?: Array<ErrorObject>;    } @@ -191,10 +197,12 @@ declare namespace ajv {      dataPath: string;      schemaPath: string;      params: ErrorParameters; +    // Added to validation errors of propertyNames keyword schema +    propertyName?: string;      // Excluded if messages set to false.      message?: string;      // These are added with the `verbose` option. -    schema?: Object; +    schema?: any;      parentSchema?: Object;      data?: any;    } @@ -204,7 +212,7 @@ declare namespace ajv {                            MultipleOfParams | PatternParams | RequiredParams |                            TypeParams | UniqueItemsParams | CustomParams |                            PatternGroupsParams | PatternRequiredParams | -                          SwitchParams | NoParams | EnumParams; +                          PropertyNamesParams | SwitchParams | NoParams | EnumParams;    interface RefParams {      ref: string; @@ -270,6 +278,10 @@ declare namespace ajv {      missingPattern: string;    } +  interface PropertyNamesParams { +    propertyName: string; +  } +    interface SwitchParams {      caseIndex: number;    } diff --git a/node_modules/ajv/lib/ajv.js b/node_modules/ajv/lib/ajv.js index 0502c1fd3..14095599e 100644 --- a/node_modules/ajv/lib/ajv.js +++ b/node_modules/ajv/lib/ajv.js @@ -7,28 +7,41 @@ var compileSchema = require('./compile')    , stableStringify = require('json-stable-stringify')    , formats = require('./compile/formats')    , rules = require('./compile/rules') -  , v5 = require('./v5') +  , $dataMetaSchema = require('./$data') +  , patternGroups = require('./patternGroups')    , util = require('./compile/util') -  , async = require('./async')    , co = require('co');  module.exports = Ajv; -Ajv.prototype.compileAsync = async.compile; +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async');  var customKeyword = require('./keyword');  Ajv.prototype.addKeyword = customKeyword.add;  Ajv.prototype.getKeyword = customKeyword.get;  Ajv.prototype.removeKeyword = customKeyword.remove; -Ajv.ValidationError = require('./compile/validation_error'); -var META_SCHEMA_ID = 'http://json-schema.org/draft-04/schema'; -var SCHEMA_URI_FORMAT = /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i; -function SCHEMA_URI_FORMAT_FUNC(str) { -  return SCHEMA_URI_FORMAT.test(str); -} +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-06/schema';  var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes' ]; +var META_SUPPORT_DATA = ['/properties'];  /**   * Creates validator instance. @@ -38,383 +51,427 @@ var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes' ];   */  function Ajv(opts) {    if (!(this instanceof Ajv)) return new Ajv(opts); -  var self = this; -    opts = this._opts = util.copy(opts) || {};    this._schemas = {};    this._refs = {};    this._fragments = {};    this._formats = formats(opts.format); +  var schemaUriFormat = this._schemaUriFormat = this._formats['uri-reference']; +  this._schemaUriFormatFunc = function (str) { return schemaUriFormat.test(str); }; +    this._cache = opts.cache || new Cache;    this._loadingSchemas = {};    this._compilations = [];    this.RULES = rules(); - -  // this is done on purpose, so that methods are bound to the instance -  // (without using bind) so that they can be used without the instance -  this.validate = validate; -  this.compile = compile; -  this.addSchema = addSchema; -  this.addMetaSchema = addMetaSchema; -  this.validateSchema = validateSchema; -  this.getSchema = getSchema; -  this.removeSchema = removeSchema; -  this.addFormat = addFormat; -  this.errorsText = errorsText; - -  this._addSchema = _addSchema; -  this._compile = _compile; +  this._getId = chooseGetId(opts);    opts.loopRequired = opts.loopRequired || Infinity; -  if (opts.async || opts.transpile) async.setup(opts); -  if (opts.beautify === true) opts.beautify = { indent_size: 2 };    if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; -  this._metaOpts = getMetaSchemaOptions(); - -  if (opts.formats) addInitialFormats(); -  addDraft4MetaSchema(); -  if (opts.v5) v5.enable(this); -  if (typeof opts.meta == 'object') addMetaSchema(opts.meta); -  addInitialSchemas(); - - -  /** -   * Validate data using schema -   * Schema will be compiled and cached (using serialized JSON as key. [json-stable-stringify](https://github.com/substack/json-stable-stringify) is used to serialize. -   * @param  {String|Object} schemaKeyRef key, ref or schema object -   * @param  {Any} data to be validated -   * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). -   */ -  function validate(schemaKeyRef, data) { -    var v; -    if (typeof schemaKeyRef == 'string') { -      v = getSchema(schemaKeyRef); -      if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); -    } else { -      var schemaObj = _addSchema(schemaKeyRef); -      v = schemaObj.validate || _compile(schemaObj); -    } +  if (opts.serialize === undefined) opts.serialize = stableStringify; +  this._metaOpts = getMetaSchemaOptions(this); + +  if (opts.formats) addInitialFormats(this); +  addDraft6MetaSchema(this); +  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); +  addInitialSchemas(this); +  if (opts.patternGroups) patternGroups(this); +} -    var valid = v(data); -    if (v.$async === true) -      return self._opts.async == '*' ? co(valid) : valid; -    self.errors = v.errors; -    return valid; -  } -  /** -   * Create validating function for passed schema. -   * @param  {Object} schema schema object -   * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. -   * @return {Function} validating function -   */ -  function compile(schema, _meta) { -    var schemaObj = _addSchema(schema, undefined, _meta); -    return schemaObj.validate || _compile(schemaObj); +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [json-stable-stringify](https://github.com/substack/json-stable-stringify) is used to serialize. + * @this   Ajv + * @param  {String|Object} schemaKeyRef key, ref or schema object + * @param  {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { +  var v; +  if (typeof schemaKeyRef == 'string') { +    v = this.getSchema(schemaKeyRef); +    if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); +  } else { +    var schemaObj = this._addSchema(schemaKeyRef); +    v = schemaObj.validate || this._compile(schemaObj);    } +  var valid = v(data); +  if (v.$async === true) +    return this._opts.async == '*' ? co(valid) : valid; +  this.errors = v.errors; +  return valid; +} + -  /** -   * Adds schema to the instance. -   * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. -   * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. -   * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. -   * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. -   */ -  function addSchema(schema, key, _skipValidation, _meta) { -    if (Array.isArray(schema)){ -      for (var i=0; i<schema.length; i++) addSchema(schema[i], undefined, _skipValidation, _meta); -      return; -    } -    // can key/id have # inside? -    key = resolve.normalizeId(key || schema.id); -    checkUnique(key); -    self._schemas[key] = _addSchema(schema, _skipValidation, _meta, true); -  } +/** + * Create validating function for passed schema. + * @this   Ajv + * @param  {Object} schema schema object + * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { +  var schemaObj = this._addSchema(schema, undefined, _meta); +  return schemaObj.validate || this._compile(schemaObj); +} -  /** -   * Add schema that will be used to validate other schemas -   * options in META_IGNORE_OPTIONS are alway set to false -   * @param {Object} schema schema object -   * @param {String} key optional schema key -   * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema -   */ -  function addMetaSchema(schema, key, skipValidation) { -    addSchema(schema, key, skipValidation, true); +/** + * Adds schema to the instance. + * @this   Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + */ +function addSchema(schema, key, _skipValidation, _meta) { +  if (Array.isArray(schema)){ +    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta); +    return;    } +  var id = this._getId(schema); +  if (id !== undefined && typeof id != 'string') +    throw new Error('schema id must be string'); +  key = resolve.normalizeId(key || id); +  checkUnique(this, key); +  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true); +} -  /** -   * Validate schema -   * @param {Object} schema schema to validate -   * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid -   * @return {Boolean} true if schema is valid -   */ -  function validateSchema(schema, throwOrLogError) { -    var $schema = schema.$schema || self._opts.defaultMeta || defaultMeta(); -    var currentUriFormat = self._formats.uri; -    self._formats.uri = typeof currentUriFormat == 'function' -                        ? SCHEMA_URI_FORMAT_FUNC -                        : SCHEMA_URI_FORMAT; -    var valid; -    try { valid = validate($schema, schema); } -    finally { self._formats.uri = currentUriFormat; } -    if (!valid && throwOrLogError) { -      var message = 'schema is invalid: ' + errorsText(); -      if (self._opts.validateSchema == 'log') console.error(message); -      else throw new Error(message); -    } -    return valid; -  } +/** + * Add schema that will be used to validate other schemas + * options in META_IGNORE_OPTIONS are alway set to false + * @this   Ajv + * @param {Object} schema schema object + * @param {String} key optional schema key + * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema + */ +function addMetaSchema(schema, key, skipValidation) { +  this.addSchema(schema, key, skipValidation, true); +} -  function defaultMeta() { -    var meta = self._opts.meta; -    self._opts.defaultMeta = typeof meta == 'object' -                              ? meta.id || meta -                              : self._opts.v5 -                                ? v5.META_SCHEMA_ID -                                : META_SCHEMA_ID; -    return self._opts.defaultMeta; +/** + * Validate schema + * @this   Ajv + * @param {Object} schema schema to validate + * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid + * @return {Boolean} true if schema is valid + */ +function validateSchema(schema, throwOrLogError) { +  var $schema = schema.$schema; +  if ($schema !== undefined && typeof $schema != 'string') +    throw new Error('$schema must be a string'); +  $schema = $schema || this._opts.defaultMeta || defaultMeta(this); +  if (!$schema) { +    console.warn('meta-schema not available'); +    this.errors = null; +    return true; +  } +  var currentUriFormat = this._formats.uri; +  this._formats.uri = typeof currentUriFormat == 'function' +                      ? this._schemaUriFormatFunc +                      : this._schemaUriFormat; +  var valid; +  try { valid = this.validate($schema, schema); } +  finally { this._formats.uri = currentUriFormat; } +  if (!valid && throwOrLogError) { +    var message = 'schema is invalid: ' + this.errorsText(); +    if (this._opts.validateSchema == 'log') console.error(message); +    else throw new Error(message);    } +  return valid; +} -  /** -   * Get compiled schema from the instance by `key` or `ref`. -   * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). -   * @return {Function} schema validating function (with property `schema`). -   */ -  function getSchema(keyRef) { -    var schemaObj = _getSchemaObj(keyRef); -    switch (typeof schemaObj) { -      case 'object': return schemaObj.validate || _compile(schemaObj); -      case 'string': return getSchema(schemaObj); -      case 'undefined': return _getSchemaFragment(keyRef); -    } -  } +function defaultMeta(self) { +  var meta = self._opts.meta; +  self._opts.defaultMeta = typeof meta == 'object' +                            ? self._getId(meta) || meta +                            : self.getSchema(META_SCHEMA_ID) +                              ? META_SCHEMA_ID +                              : undefined; +  return self._opts.defaultMeta; +} -  function _getSchemaFragment(ref) { -    var res = resolve.schema.call(self, { schema: {} }, ref); -    if (res) { -      var schema = res.schema -        , root = res.root -        , baseId = res.baseId; -      var v = compileSchema.call(self, schema, root, undefined, baseId); -      self._fragments[ref] = new SchemaObject({ -        ref: ref, -        fragment: true, -        schema: schema, -        root: root, -        baseId: baseId, -        validate: v -      }); -      return v; -    } +/** + * Get compiled schema from the instance by `key` or `ref`. + * @this   Ajv + * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). + * @return {Function} schema validating function (with property `schema`). + */ +function getSchema(keyRef) { +  var schemaObj = _getSchemaObj(this, keyRef); +  switch (typeof schemaObj) { +    case 'object': return schemaObj.validate || this._compile(schemaObj); +    case 'string': return this.getSchema(schemaObj); +    case 'undefined': return _getSchemaFragment(this, keyRef);    } +} -  function _getSchemaObj(keyRef) { -    keyRef = resolve.normalizeId(keyRef); -    return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef]; +function _getSchemaFragment(self, ref) { +  var res = resolve.schema.call(self, { schema: {} }, ref); +  if (res) { +    var schema = res.schema +      , root = res.root +      , baseId = res.baseId; +    var v = compileSchema.call(self, schema, root, undefined, baseId); +    self._fragments[ref] = new SchemaObject({ +      ref: ref, +      fragment: true, +      schema: schema, +      root: root, +      baseId: baseId, +      validate: v +    }); +    return v;    } +} -  /** -   * Remove cached schema(s). -   * If no parameter is passed all schemas but meta-schemas are removed. -   * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. -   * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. -   * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object -   */ -  function removeSchema(schemaKeyRef) { -    if (schemaKeyRef instanceof RegExp) { -      _removeAllSchemas(self._schemas, schemaKeyRef); -      _removeAllSchemas(self._refs, schemaKeyRef); +function _getSchemaObj(self, keyRef) { +  keyRef = resolve.normalizeId(keyRef); +  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef]; +} + + +/** + * Remove cached schema(s). + * If no parameter is passed all schemas but meta-schemas are removed. + * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + * @this   Ajv + * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object + */ +function removeSchema(schemaKeyRef) { +  if (schemaKeyRef instanceof RegExp) { +    _removeAllSchemas(this, this._schemas, schemaKeyRef); +    _removeAllSchemas(this, this._refs, schemaKeyRef); +    return; +  } +  switch (typeof schemaKeyRef) { +    case 'undefined': +      _removeAllSchemas(this, this._schemas); +      _removeAllSchemas(this, this._refs); +      this._cache.clear();        return; -    } -    switch (typeof schemaKeyRef) { -      case 'undefined': -        _removeAllSchemas(self._schemas); -        _removeAllSchemas(self._refs); -        self._cache.clear(); -        return; -      case 'string': -        var schemaObj = _getSchemaObj(schemaKeyRef); -        if (schemaObj) self._cache.del(schemaObj.jsonStr); -        delete self._schemas[schemaKeyRef]; -        delete self._refs[schemaKeyRef]; -        return; -      case 'object': -        var jsonStr = stableStringify(schemaKeyRef); -        self._cache.del(jsonStr); -        var id = schemaKeyRef.id; -        if (id) { -          id = resolve.normalizeId(id); -          delete self._schemas[id]; -          delete self._refs[id]; -        } -    } +    case 'string': +      var schemaObj = _getSchemaObj(this, schemaKeyRef); +      if (schemaObj) this._cache.del(schemaObj.cacheKey); +      delete this._schemas[schemaKeyRef]; +      delete this._refs[schemaKeyRef]; +      return; +    case 'object': +      var serialize = this._opts.serialize; +      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef; +      this._cache.del(cacheKey); +      var id = this._getId(schemaKeyRef); +      if (id) { +        id = resolve.normalizeId(id); +        delete this._schemas[id]; +        delete this._refs[id]; +      }    } +} -  function _removeAllSchemas(schemas, regex) { -    for (var keyRef in schemas) { -      var schemaObj = schemas[keyRef]; -      if (!schemaObj.meta && (!regex || regex.test(keyRef))) { -        self._cache.del(schemaObj.jsonStr); -        delete schemas[keyRef]; -      } +function _removeAllSchemas(self, schemas, regex) { +  for (var keyRef in schemas) { +    var schemaObj = schemas[keyRef]; +    if (!schemaObj.meta && (!regex || regex.test(keyRef))) { +      self._cache.del(schemaObj.cacheKey); +      delete schemas[keyRef];      }    } +} -  function _addSchema(schema, skipValidation, meta, shouldAddSchema) { -    if (typeof schema != 'object') throw new Error('schema should be object'); -    var jsonStr = stableStringify(schema); -    var cached = self._cache.get(jsonStr); -    if (cached) return cached; +/* @this   Ajv */ +function _addSchema(schema, skipValidation, meta, shouldAddSchema) { +  if (typeof schema != 'object' && typeof schema != 'boolean') +    throw new Error('schema should be object or boolean'); +  var serialize = this._opts.serialize; +  var cacheKey = serialize ? serialize(schema) : schema; +  var cached = this._cache.get(cacheKey); +  if (cached) return cached; -    shouldAddSchema = shouldAddSchema || self._opts.addUsedSchema !== false; +  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false; -    var id = resolve.normalizeId(schema.id); -    if (id && shouldAddSchema) checkUnique(id); +  var id = resolve.normalizeId(this._getId(schema)); +  if (id && shouldAddSchema) checkUnique(this, id); -    var willValidate = self._opts.validateSchema !== false && !skipValidation; -    var recursiveMeta; -    if (willValidate && !(recursiveMeta = schema.id && schema.id == schema.$schema)) -      validateSchema(schema, true); +  var willValidate = this._opts.validateSchema !== false && !skipValidation; +  var recursiveMeta; +  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema))) +    this.validateSchema(schema, true); -    var localRefs = resolve.ids.call(self, schema); +  var localRefs = resolve.ids.call(this, schema); -    var schemaObj = new SchemaObject({ -      id: id, -      schema: schema, -      localRefs: localRefs, -      jsonStr: jsonStr, -      meta: meta -    }); +  var schemaObj = new SchemaObject({ +    id: id, +    schema: schema, +    localRefs: localRefs, +    cacheKey: cacheKey, +    meta: meta +  }); -    if (id[0] != '#' && shouldAddSchema) self._refs[id] = schemaObj; -    self._cache.put(jsonStr, schemaObj); +  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj; +  this._cache.put(cacheKey, schemaObj); -    if (willValidate && recursiveMeta) validateSchema(schema, true); +  if (willValidate && recursiveMeta) this.validateSchema(schema, true); -    return schemaObj; -  } +  return schemaObj; +} -  function _compile(schemaObj, root) { -    if (schemaObj.compiling) { -      schemaObj.validate = callValidate; -      callValidate.schema = schemaObj.schema; -      callValidate.errors = null; -      callValidate.root = root ? root : callValidate; -      if (schemaObj.schema.$async === true) -        callValidate.$async = true; -      return callValidate; -    } -    schemaObj.compiling = true; +/* @this   Ajv */ +function _compile(schemaObj, root) { +  if (schemaObj.compiling) { +    schemaObj.validate = callValidate; +    callValidate.schema = schemaObj.schema; +    callValidate.errors = null; +    callValidate.root = root ? root : callValidate; +    if (schemaObj.schema.$async === true) +      callValidate.$async = true; +    return callValidate; +  } +  schemaObj.compiling = true; -    var currentOpts; -    if (schemaObj.meta) { -      currentOpts = self._opts; -      self._opts = self._metaOpts; -    } +  var currentOpts; +  if (schemaObj.meta) { +    currentOpts = this._opts; +    this._opts = this._metaOpts; +  } -    var v; -    try { v = compileSchema.call(self, schemaObj.schema, root, schemaObj.localRefs); } -    finally { -      schemaObj.compiling = false; -      if (schemaObj.meta) self._opts = currentOpts; -    } +  var v; +  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); } +  finally { +    schemaObj.compiling = false; +    if (schemaObj.meta) this._opts = currentOpts; +  } -    schemaObj.validate = v; -    schemaObj.refs = v.refs; -    schemaObj.refVal = v.refVal; -    schemaObj.root = v.root; -    return v; +  schemaObj.validate = v; +  schemaObj.refs = v.refs; +  schemaObj.refVal = v.refVal; +  schemaObj.root = v.root; +  return v; -    function callValidate() { -      var _validate = schemaObj.validate; -      var result = _validate.apply(null, arguments); -      callValidate.errors = _validate.errors; -      return result; -    } +  function callValidate() { +    var _validate = schemaObj.validate; +    var result = _validate.apply(null, arguments); +    callValidate.errors = _validate.errors; +    return result;    } +} -  /** -   * Convert array of error message objects to string -   * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used. -   * @param  {Object} options optional options with properties `separator` and `dataVar`. -   * @return {String} human readable string with all errors descriptions -   */ -  function errorsText(errors, options) { -    errors = errors || self.errors; -    if (!errors) return 'No errors'; -    options = options || {}; -    var separator = options.separator === undefined ? ', ' : options.separator; -    var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; - -    var text = ''; -    for (var i=0; i<errors.length; i++) { -      var e = errors[i]; -      if (e) text += dataVar + e.dataPath + ' ' + e.message + separator; -    } -    return text.slice(0, -separator.length); +function chooseGetId(opts) { +  switch (opts.schemaId) { +    case '$id': return _get$Id; +    case 'id': return _getId; +    default: return _get$IdOrId;    } +} -  /** -   * Add custom format -   * @param {String} name format name -   * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid) -   */ -  function addFormat(name, format) { -    if (typeof format == 'string') format = new RegExp(format); -    self._formats[name] = format; -  } +function _getId(schema) { +  if (schema.$id) console.warn('schema $id ignored', schema.$id); +  return schema.id; +} -  function addDraft4MetaSchema() { -    if (self._opts.meta !== false) { -      var metaSchema = require('./refs/json-schema-draft-04.json'); -      addMetaSchema(metaSchema, META_SCHEMA_ID, true); -      self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID; -    } -  } +function _get$Id(schema) { +  if (schema.id) console.warn('schema id ignored', schema.id); +  return schema.$id; +} -  function addInitialSchemas() { -    var optsSchemas = self._opts.schemas; -    if (!optsSchemas) return; -    if (Array.isArray(optsSchemas)) addSchema(optsSchemas); -    else for (var key in optsSchemas) addSchema(optsSchemas[key], key); -  } +function _get$IdOrId(schema) { +  if (schema.$id && schema.id && schema.$id != schema.id) +    throw new Error('schema $id is different from id'); +  return schema.$id || schema.id; +} -  function addInitialFormats() { -    for (var name in self._opts.formats) { -      var format = self._opts.formats[name]; -      addFormat(name, format); -    } +/** + * Convert array of error message objects to string + * @this   Ajv + * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used. + * @param  {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { +  errors = errors || this.errors; +  if (!errors) return 'No errors'; +  options = options || {}; +  var separator = options.separator === undefined ? ', ' : options.separator; +  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + +  var text = ''; +  for (var i=0; i<errors.length; i++) { +    var e = errors[i]; +    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;    } +  return text.slice(0, -separator.length); +} + + +/** + * Add custom format + * @this   Ajv + * @param {String} name format name + * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid) + */ +function addFormat(name, format) { +  if (typeof format == 'string') format = new RegExp(format); +  this._formats[name] = format; +} -  function checkUnique(id) { -    if (self._schemas[id] || self._refs[id]) -      throw new Error('schema with key or id "' + id + '" already exists'); +function addDraft6MetaSchema(self) { +  var $dataSchema; +  if (self._opts.$data) { +    $dataSchema = require('./refs/$data.json'); +    self.addMetaSchema($dataSchema, $dataSchema.$id, true);    } +  if (self._opts.meta === false) return; +  var metaSchema = require('./refs/json-schema-draft-06.json'); +  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA); +  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true); +  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID; +} + + +function addInitialSchemas(self) { +  var optsSchemas = self._opts.schemas; +  if (!optsSchemas) return; +  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas); +  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key); +} -  function getMetaSchemaOptions() { -    var metaOpts = util.copy(self._opts); -    for (var i=0; i<META_IGNORE_OPTIONS.length; i++) -      delete metaOpts[META_IGNORE_OPTIONS[i]]; -    return metaOpts; +function addInitialFormats(self) { +  for (var name in self._opts.formats) { +    var format = self._opts.formats[name]; +    self.addFormat(name, format);    }  } + + +function checkUnique(self, id) { +  if (self._schemas[id] || self._refs[id]) +    throw new Error('schema with key or id "' + id + '" already exists'); +} + + +function getMetaSchemaOptions(self) { +  var metaOpts = util.copy(self._opts); +  for (var i=0; i<META_IGNORE_OPTIONS.length; i++) +    delete metaOpts[META_IGNORE_OPTIONS[i]]; +  return metaOpts; +} diff --git a/node_modules/ajv/lib/async.js b/node_modules/ajv/lib/async.js deleted file mode 100644 index 173c2c00a..000000000 --- a/node_modules/ajv/lib/async.js +++ /dev/null @@ -1,218 +0,0 @@ -'use strict'; - -module.exports = { -  setup: setupAsync, -  compile: compileAsync -}; - - -var util = require('./compile/util'); - -var ASYNC = { -  '*': checkGenerators, -  'co*': checkGenerators, -  'es7': checkAsyncFunction -}; - -var TRANSPILE = { -  'nodent': getNodent, -  'regenerator': getRegenerator -}; - -var MODES = [ -  { async: 'co*' }, -  { async: 'es7', transpile: 'nodent' }, -  { async: 'co*', transpile: 'regenerator' } -]; - - -var regenerator, nodent; - - -function setupAsync(opts, required) { -  if (required !== false) required = true; -  var async = opts.async -    , transpile = opts.transpile -    , check; - -  switch (typeof transpile) { -    case 'string': -      var get = TRANSPILE[transpile]; -      if (!get) throw new Error('bad transpiler: ' + transpile); -      return (opts._transpileFunc = get(opts, required)); -    case 'undefined': -    case 'boolean': -      if (typeof async == 'string') { -        check = ASYNC[async]; -        if (!check) throw new Error('bad async mode: ' + async); -        return (opts.transpile = check(opts, required)); -      } - -      for (var i=0; i<MODES.length; i++) { -        var _opts = MODES[i]; -        if (setupAsync(_opts, false)) { -          util.copy(_opts, opts); -          return opts.transpile; -        } -      } -      /* istanbul ignore next */ -      throw new Error('generators, nodent and regenerator are not available'); -    case 'function': -      return (opts._transpileFunc = opts.transpile); -    default: -      throw new Error('bad transpiler: ' + transpile); -  } -} - - -function checkGenerators(opts, required) { -  /* jshint evil: true */ -  try { -    (new Function('(function*(){})()'))(); -    return true; -  } catch(e) { -    /* istanbul ignore next */ -    if (required) throw new Error('generators not supported'); -  } -} - - -function checkAsyncFunction(opts, required) { -  /* jshint evil: true */ -  try { -    (new Function('(async function(){})()'))(); -    /* istanbul ignore next */ -    return true; -  } catch(e) { -    if (required) throw new Error('es7 async functions not supported'); -  } -} - - -function getRegenerator(opts, required) { -  try { -    if (!regenerator) { -      var name = 'regenerator'; -      regenerator = require(name); -      regenerator.runtime(); -    } -    if (!opts.async || opts.async === true) -      opts.async = 'es7'; -    return regeneratorTranspile; -  } catch(e) { -    /* istanbul ignore next */ -    if (required) throw new Error('regenerator not available'); -  } -} - - -function regeneratorTranspile(code) { -  return regenerator.compile(code).code; -} - - -function getNodent(opts, required) { -  /* jshint evil: true */ -  try { -    if (!nodent) { -      var name = 'nodent'; -      nodent = require(name)({ log: false, dontInstallRequireHook: true }); -    } -    if (opts.async != 'es7') { -      if (opts.async && opts.async !== true) console.warn('nodent transpiles only es7 async functions'); -      opts.async = 'es7'; -    } -    return nodentTranspile; -  } catch(e) { -    /* istanbul ignore next */ -    if (required) throw new Error('nodent not available'); -  } -} - - -function nodentTranspile(code) { -  return nodent.compile(code, '', { promises: true, sourcemap: false }).code; -} - - -/** - * Creates validating function for passed schema with asynchronous loading of missing schemas. - * `loadSchema` option should be a function that accepts schema uri and node-style callback. - * @this  Ajv - * @param {Object}   schema schema object - * @param {Function} callback node-style callback, it is always called with 2 parameters: error (or null) and validating function. - */ -function compileAsync(schema, callback) { -  /* eslint no-shadow: 0 */ -  /* jshint validthis: true */ -  var schemaObj; -  var self = this; -  try { -    schemaObj = this._addSchema(schema); -  } catch(e) { -    setTimeout(function() { callback(e); }); -    return; -  } -  if (schemaObj.validate) { -    setTimeout(function() { callback(null, schemaObj.validate); }); -  } else { -    if (typeof this._opts.loadSchema != 'function') -      throw new Error('options.loadSchema should be a function'); -    _compileAsync(schema, callback, true); -  } - - -  function _compileAsync(schema, callback, firstCall) { -    var validate; -    try { validate = self.compile(schema); } -    catch(e) { -      if (e.missingSchema) loadMissingSchema(e); -      else deferCallback(e); -      return; -    } -    deferCallback(null, validate); - -    function loadMissingSchema(e) { -      var ref = e.missingSchema; -      if (self._refs[ref] || self._schemas[ref]) -        return callback(new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved')); -      var _callbacks = self._loadingSchemas[ref]; -      if (_callbacks) { -        if (typeof _callbacks == 'function') -          self._loadingSchemas[ref] = [_callbacks, schemaLoaded]; -        else -          _callbacks[_callbacks.length] = schemaLoaded; -      } else { -        self._loadingSchemas[ref] = schemaLoaded; -        self._opts.loadSchema(ref, function (err, sch) { -          var _callbacks = self._loadingSchemas[ref]; -          delete self._loadingSchemas[ref]; -          if (typeof _callbacks == 'function') { -            _callbacks(err, sch); -          } else { -            for (var i=0; i<_callbacks.length; i++) -              _callbacks[i](err, sch); -          } -        }); -      } - -      function schemaLoaded(err, sch) { -        if (err) return callback(err); -        if (!(self._refs[ref] || self._schemas[ref])) { -          try { -            self.addSchema(sch, ref); -          } catch(e) { -            callback(e); -            return; -          } -        } -        _compileAsync(schema, callback); -      } -    } - -    function deferCallback(err, validate) { -      if (firstCall) setTimeout(function() { callback(err, validate); }); -      else return callback(err, validate); -    } -  } -} diff --git a/node_modules/ajv/lib/compile/_rules.js b/node_modules/ajv/lib/compile/_rules.js index c98610e41..3fe69973a 100644 --- a/node_modules/ajv/lib/compile/_rules.js +++ b/node_modules/ajv/lib/compile/_rules.js @@ -5,6 +5,8 @@ module.exports = {    '$ref': require('../dotjs/ref'),    allOf: require('../dotjs/allOf'),    anyOf: require('../dotjs/anyOf'), +  const: require('../dotjs/const'), +  contains: require('../dotjs/contains'),    dependencies: require('../dotjs/dependencies'),    'enum': require('../dotjs/enum'),    format: require('../dotjs/format'), @@ -22,6 +24,7 @@ module.exports = {    oneOf: require('../dotjs/oneOf'),    pattern: require('../dotjs/pattern'),    properties: require('../dotjs/properties'), +  propertyNames: require('../dotjs/propertyNames'),    required: require('../dotjs/required'),    uniqueItems: require('../dotjs/uniqueItems'),    validate: require('../dotjs/validate') diff --git a/node_modules/ajv/lib/compile/async.js b/node_modules/ajv/lib/compile/async.js new file mode 100644 index 000000000..6a30b8892 --- /dev/null +++ b/node_modules/ajv/lib/compile/async.js @@ -0,0 +1,90 @@ +'use strict'; + +var MissingRefError = require('./error_classes').MissingRef; + +module.exports = compileAsync; + + +/** + * Creates validating function for passed schema with asynchronous loading of missing schemas. + * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema. + * @this  Ajv + * @param {Object}   schema schema object + * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped + * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function. + * @return {Promise} promise that resolves with a validating function. + */ +function compileAsync(schema, meta, callback) { +  /* eslint no-shadow: 0 */ +  /* global Promise */ +  /* jshint validthis: true */ +  var self = this; +  if (typeof this._opts.loadSchema != 'function') +    throw new Error('options.loadSchema should be a function'); + +  if (typeof meta == 'function') { +    callback = meta; +    meta = undefined; +  } + +  var p = loadMetaSchemaOf(schema).then(function () { +    var schemaObj = self._addSchema(schema, undefined, meta); +    return schemaObj.validate || _compileAsync(schemaObj); +  }); + +  if (callback) { +    p.then( +      function(v) { callback(null, v); }, +      callback +    ); +  } + +  return p; + + +  function loadMetaSchemaOf(sch) { +    var $schema = sch.$schema; +    return $schema && !self.getSchema($schema) +            ? compileAsync.call(self, { $ref: $schema }, true) +            : Promise.resolve(); +  } + + +  function _compileAsync(schemaObj) { +    try { return self._compile(schemaObj); } +    catch(e) { +      if (e instanceof MissingRefError) return loadMissingSchema(e); +      throw e; +    } + + +    function loadMissingSchema(e) { +      var ref = e.missingSchema; +      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved'); + +      var schemaPromise = self._loadingSchemas[ref]; +      if (!schemaPromise) { +        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref); +        schemaPromise.then(removePromise, removePromise); +      } + +      return schemaPromise.then(function (sch) { +        if (!added(ref)) { +          return loadMetaSchemaOf(sch).then(function () { +            if (!added(ref)) self.addSchema(sch, ref, undefined, meta); +          }); +        } +      }).then(function() { +        return _compileAsync(schemaObj); +      }); + +      function removePromise() { +        delete self._loadingSchemas[ref]; +      } + +      function added(ref) { +        return self._refs[ref] || self._schemas[ref]; +      } +    } +  } +} diff --git a/node_modules/ajv/lib/compile/equal.js b/node_modules/ajv/lib/compile/equal.js index 2a918746c..911774c85 100644 --- a/node_modules/ajv/lib/compile/equal.js +++ b/node_modules/ajv/lib/compile/equal.js @@ -1,45 +1,3 @@  'use strict'; -/*eslint complexity: 0*/ - -module.exports = function equal(a, b) { -  if (a === b) return true; - -  var arrA = Array.isArray(a) -    , arrB = Array.isArray(b) -    , i; - -  if (arrA && arrB) { -    if (a.length != b.length) return false; -    for (i = 0; i < a.length; i++) -      if (!equal(a[i], b[i])) return false; -    return true; -  } - -  if (arrA != arrB) return false; - -  if (a && b && typeof a === 'object' && typeof b === 'object') { -    var keys = Object.keys(a); -    if (keys.length !== Object.keys(b).length) return false; - -    var dateA = a instanceof Date -      , dateB = b instanceof Date; -    if (dateA && dateB) return a.getTime() == b.getTime(); -    if (dateA != dateB) return false; - -    var regexpA = a instanceof RegExp -      , regexpB = b instanceof RegExp; -    if (regexpA && regexpB) return a.toString() == b.toString(); -    if (regexpA != regexpB) return false; - -    for (i = 0; i < keys.length; i++) -      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; - -    for (i = 0; i < keys.length; i++) -      if(!equal(a[keys[i]], b[keys[i]])) return false; - -    return true; -  } - -  return false; -}; +module.exports = require('fast-deep-equal'); diff --git a/node_modules/ajv/lib/compile/error_classes.js b/node_modules/ajv/lib/compile/error_classes.js new file mode 100644 index 000000000..0b0ec4e4e --- /dev/null +++ b/node_modules/ajv/lib/compile/error_classes.js @@ -0,0 +1,34 @@ +'use strict'; + +var resolve = require('./resolve'); + +module.exports = { +  Validation: errorSubclass(ValidationError), +  MissingRef: errorSubclass(MissingRefError) +}; + + +function ValidationError(errors) { +  this.message = 'validation failed'; +  this.errors = errors; +  this.ajv = this.validation = true; +} + + +MissingRefError.message = function (baseId, ref) { +  return 'can\'t resolve reference ' + ref + ' from id ' + baseId; +}; + + +function MissingRefError(baseId, ref, message) { +  this.message = message || MissingRefError.message(baseId, ref); +  this.missingRef = resolve.url(baseId, ref); +  this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef)); +} + + +function errorSubclass(Subclass) { +  Subclass.prototype = Object.create(Error.prototype); +  Subclass.prototype.constructor = Subclass; +  return Subclass; +} diff --git a/node_modules/ajv/lib/compile/formats.js b/node_modules/ajv/lib/compile/formats.js index 2130a31b0..b3a1541a6 100644 --- a/node_modules/ajv/lib/compile/formats.js +++ b/node_modules/ajv/lib/compile/formats.js @@ -6,24 +6,25 @@ var DATE = /^\d\d\d\d-(\d\d)-(\d\d)$/;  var DAYS = [0,31,29,31,30,31,30,31,31,30,31,30,31];  var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d:\d\d)?$/i;  var HOSTNAME = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*$/i; -var URI = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?(?:\#(?:[a-z0-9\-._~!$&'()*+,;=:@\/?]|%[0-9a-f]{2})*)?$/i; -var UUID = /^(?:urn\:uuid\:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; -var JSON_POINTER = /^(?:\/(?:[^~\/]|~0|~1)*)*$|^\#(?:\/(?:[a-z0-9_\-\.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; -var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:\#|(?:\/(?:[^~\/]|~0|~1)*)*)$/; +var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; +var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; +// uri-template: https://tools.ietf.org/html/rfc6570 +var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-?)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-?)*(?:[0-9KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[KSa-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$|^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;  module.exports = formats;  function formats(mode) {    mode = mode == 'full' ? 'full' : 'fast'; -  var formatDefs = util.copy(formats[mode]); -  for (var fName in formats.compare) { -    formatDefs[fName] = { -      validate: formatDefs[fName], -      compare: formats.compare[fName] -    }; -  } -  return formatDefs; +  return util.copy(formats[mode]);  } @@ -34,11 +35,14 @@ formats.fast = {    time: /^[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)?$/i,    'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s][0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:z|[+-]\d\d:\d\d)$/i,    // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js -  uri: /^(?:[a-z][a-z0-9+-.]*)?(?:\:|\/)\/?[^\s]*$/i, +  uri: /^(?:[a-z][a-z0-9+-.]*)(?::|\/)\/?[^\s]*$/i, +  'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i, +  'uri-template': URITEMPLATE, +  url: URL,    // email (sources from jsen validator):    // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363    // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') -  email: /^[a-z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, +  email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,    hostname: HOSTNAME,    // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html    ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, @@ -60,7 +64,10 @@ formats.full = {    time: time,    'date-time': date_time,    uri: uri, -  email: /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, +  'uri-reference': URIREF, +  'uri-template': URITEMPLATE, +  url: URL, +  email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,    hostname: hostname,    ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,    ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, @@ -71,13 +78,6 @@ formats.full = {  }; -formats.compare = { -  date: compareDate, -  time: compareTime, -  'date-time': compareDateTime -}; - -  function date(str) {    // full-date from http://tools.ietf.org/html/rfc3339#section-5.6    var matches = str.match(DATE); @@ -116,14 +116,16 @@ function hostname(str) {  } -var NOT_URI_FRAGMENT = /\/|\:/; +var NOT_URI_FRAGMENT = /\/|:/;  function uri(str) {    // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."    return NOT_URI_FRAGMENT.test(str) && URI.test(str);  } +var Z_ANCHOR = /[^\\]\\Z/;  function regex(str) { +  if (Z_ANCHOR.test(str)) return false;    try {      new RegExp(str);      return true; @@ -131,34 +133,3 @@ function regex(str) {      return false;    }  } - - -function compareDate(d1, d2) { -  if (!(d1 && d2)) return; -  if (d1 > d2) return 1; -  if (d1 < d2) return -1; -  if (d1 === d2) return 0; -} - - -function compareTime(t1, t2) { -  if (!(t1 && t2)) return; -  t1 = t1.match(TIME); -  t2 = t2.match(TIME); -  if (!(t1 && t2)) return; -  t1 = t1[1] + t1[2] + t1[3] + (t1[4]||''); -  t2 = t2[1] + t2[2] + t2[3] + (t2[4]||''); -  if (t1 > t2) return 1; -  if (t1 < t2) return -1; -  if (t1 === t2) return 0; -} - - -function compareDateTime(dt1, dt2) { -  if (!(dt1 && dt2)) return; -  dt1 = dt1.split(DATE_TIME_SEPARATOR); -  dt2 = dt2.split(DATE_TIME_SEPARATOR); -  var res = compareDate(dt1[0], dt2[0]); -  if (res === undefined) return; -  return res || compareTime(dt1[1], dt2[1]); -} diff --git a/node_modules/ajv/lib/compile/index.js b/node_modules/ajv/lib/compile/index.js index c9c6730f8..45e35d905 100644 --- a/node_modules/ajv/lib/compile/index.js +++ b/node_modules/ajv/lib/compile/index.js @@ -2,18 +2,8 @@  var resolve = require('./resolve')    , util = require('./util') -  , stableStringify = require('json-stable-stringify') -  , async = require('../async'); - -var beautify; - -function loadBeautify(){ -  if (beautify === undefined) { -    var name = 'js-beautify'; -    try { beautify = require(name).js_beautify; } -    catch(e) { beautify = false; } -  } -} +  , errorClasses = require('./error_classes') +  , stableStringify = require('json-stable-stringify');  var validateGenerator = require('../dotjs/validate'); @@ -23,10 +13,10 @@ var validateGenerator = require('../dotjs/validate');  var co = require('co');  var ucs2length = util.ucs2length; -var equal = require('./equal'); +var equal = require('fast-deep-equal');  // this error is thrown by async schemas to return validation errors via exception -var ValidationError = require('./validation_error'); +var ValidationError = errorClasses.Validation;  module.exports = compile; @@ -51,8 +41,7 @@ function compile(schema, root, localRefs, baseId) {      , patternsHash = {}      , defaults = []      , defaultsHash = {} -    , customRules = [] -    , keepSourceCode = opts.sourceCode !== false; +    , customRules = [];    root = root || { schema: schema, refVal: refVal, refs: refs }; @@ -74,7 +63,7 @@ function compile(schema, root, localRefs, baseId) {        cv.refVal = v.refVal;        cv.root = v.root;        cv.$async = v.$async; -      if (keepSourceCode) cv.sourceCode = v.sourceCode; +      if (opts.sourceCode) cv.source = v.source;      }      return v;    } finally { @@ -94,7 +83,6 @@ function compile(schema, root, localRefs, baseId) {        return compile.call(self, _schema, _root, localRefs, baseId);      var $async = _schema.$async === true; -    if ($async && !opts.transpile) async.setup(opts);      var sourceCode = validateGenerator({        isTop: true, @@ -105,6 +93,7 @@ function compile(schema, root, localRefs, baseId) {        schemaPath: '',        errSchemaPath: '#',        errorPath: '""', +      MissingRefError: errorClasses.MissingRef,        RULES: RULES,        validate: validateGenerator,        util: util, @@ -122,20 +111,10 @@ function compile(schema, root, localRefs, baseId) {                     + vars(defaults, defaultCode) + vars(customRules, customRuleCode)                     + sourceCode; -    if (opts.beautify) { -      loadBeautify(); -      /* istanbul ignore else */ -      if (beautify) sourceCode = beautify(sourceCode, opts.beautify); -      else console.error('"npm install js-beautify" to use beautify option'); -    } -    // console.log('\n\n\n *** \n', sourceCode); -    var validate, validateCode -      , transpile = opts._transpileFunc; +    if (opts.processCode) sourceCode = opts.processCode(sourceCode); +    // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); +    var validate;      try { -      validateCode = $async && transpile -                      ? transpile(sourceCode) -                      : sourceCode; -        var makeValidate = new Function(          'self',          'RULES', @@ -148,7 +127,7 @@ function compile(schema, root, localRefs, baseId) {          'equal',          'ucs2length',          'ValidationError', -        validateCode +        sourceCode        );        validate = makeValidate( @@ -167,7 +146,7 @@ function compile(schema, root, localRefs, baseId) {        refVal[0] = validate;      } catch(e) { -      console.error('Error compiling schema, function code:', validateCode); +      console.error('Error compiling schema, function code:', sourceCode);        throw e;      } @@ -177,9 +156,9 @@ function compile(schema, root, localRefs, baseId) {      validate.refVal = refVal;      validate.root = isRoot ? validate : _root;      if ($async) validate.$async = true; -    if (keepSourceCode) validate.sourceCode = sourceCode;      if (opts.sourceCode === true) {        validate.source = { +        code: sourceCode,          patterns: patterns,          defaults: defaults        }; @@ -208,7 +187,7 @@ function compile(schema, root, localRefs, baseId) {      refCode = addLocalRef(ref);      var v = resolve.call(self, localCompile, root, ref); -    if (!v) { +    if (v === undefined) {        var localSchema = localRefs && localRefs[ref];        if (localSchema) {          v = resolve.inlineRef(localSchema, opts.inlineRefs) @@ -217,7 +196,9 @@ function compile(schema, root, localRefs, baseId) {        }      } -    if (v) { +    if (v === undefined) { +      removeLocalRef(ref); +    } else {        replaceLocalRef(ref, v);        return resolvedRef(v, refCode);      } @@ -230,13 +211,17 @@ function compile(schema, root, localRefs, baseId) {      return 'refVal' + refId;    } +  function removeLocalRef(ref) { +    delete refs[ref]; +  } +    function replaceLocalRef(ref, v) {      var refId = refs[ref];      refVal[refId] = v;    }    function resolvedRef(refVal, code) { -    return typeof refVal == 'object' +    return typeof refVal == 'object' || typeof refVal == 'boolean'              ? { code: code, schema: refVal, inline: true }              : { code: code, $async: refVal && refVal.$async };    } @@ -294,8 +279,12 @@ function compile(schema, root, localRefs, baseId) {        validate = inline.call(self, it, rule.keyword, schema, parentSchema);      } else {        validate = rule.definition.validate; +      if (!validate) return;      } +    if (validate === undefined) +      throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); +      var index = customRules.length;      customRules[index] = validate; @@ -372,7 +361,7 @@ function defaultCode(i) {  function refValCode(i, refVal) { -  return refVal[i] ? 'var refVal' + i + ' = refVal[' + i + '];' : ''; +  return refVal[i] === undefined ? '' : 'var refVal' + i + ' = refVal[' + i + '];';  } diff --git a/node_modules/ajv/lib/compile/resolve.js b/node_modules/ajv/lib/compile/resolve.js index db2b91fbf..7d06afab8 100644 --- a/node_modules/ajv/lib/compile/resolve.js +++ b/node_modules/ajv/lib/compile/resolve.js @@ -1,9 +1,10 @@  'use strict';  var url = require('url') -  , equal = require('./equal') +  , equal = require('fast-deep-equal')    , util = require('./util') -  , SchemaObject = require('./schema_obj'); +  , SchemaObject = require('./schema_obj') +  , traverse = require('json-schema-traverse');  module.exports = resolve; @@ -47,7 +48,7 @@ function resolve(compile, root, ref) {    if (schema instanceof SchemaObject) {      v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId); -  } else if (schema) { +  } else if (schema !== undefined) {      v = inlineRef(schema, this._opts.inlineRefs)          ? schema          : compile.call(this, schema, root, undefined, baseId); @@ -68,7 +69,7 @@ function resolveSchema(root, ref) {    /* jshint validthis: true */    var p = url.parse(ref, false, true)      , refPath = _getFullPath(p) -    , baseId = getFullPath(root.schema.id); +    , baseId = getFullPath(this._getId(root.schema));    if (refPath !== baseId) {      var id = normalizeId(refPath);      var refVal = this._refs[id]; @@ -89,7 +90,7 @@ function resolveSchema(root, ref) {        }      }      if (!root.schema) return; -    baseId = getFullPath(root.schema.id); +    baseId = getFullPath(this._getId(root.schema));    }    return getJsonPointer.call(this, p, baseId, root.schema, root);  } @@ -103,7 +104,8 @@ function resolveRecursive(root, ref, parsedRef) {      var schema = res.schema;      var baseId = res.baseId;      root = res.root; -    if (schema.id) baseId = resolveUrl(baseId, schema.id); +    var id = this._getId(schema); +    if (id) baseId = resolveUrl(baseId, id);      return getJsonPointer.call(this, parsedRef, baseId, schema, root);    }  } @@ -122,20 +124,24 @@ function getJsonPointer(parsedRef, baseId, schema, root) {      if (part) {        part = util.unescapeFragment(part);        schema = schema[part]; -      if (!schema) break; -      if (schema.id && !PREVENT_SCOPE_CHANGE[part]) baseId = resolveUrl(baseId, schema.id); -      if (schema.$ref) { -        var $ref = resolveUrl(baseId, schema.$ref); -        var res = resolveSchema.call(this, root, $ref); -        if (res) { -          schema = res.schema; -          root = res.root; -          baseId = res.baseId; +      if (schema === undefined) break; +      var id; +      if (!PREVENT_SCOPE_CHANGE[part]) { +        id = this._getId(schema); +        if (id) baseId = resolveUrl(baseId, id); +        if (schema.$ref) { +          var $ref = resolveUrl(baseId, schema.$ref); +          var res = resolveSchema.call(this, root, $ref); +          if (res) { +            schema = res.schema; +            root = res.root; +            baseId = res.baseId; +          }          }        }      }    } -  if (schema && schema != root.schema) +  if (schema !== undefined && schema !== root.schema)      return { schema: schema, root: root, baseId: baseId };  } @@ -225,43 +231,41 @@ function resolveUrl(baseId, id) {  /* @this Ajv */  function resolveIds(schema) { -  /* eslint no-shadow: 0 */ -  /* jshint validthis: true */ -  var id = normalizeId(schema.id); +  var schemaId = normalizeId(this._getId(schema)); +  var baseIds = {'': schemaId}; +  var fullPaths = {'': getFullPath(schemaId, false)};    var localRefs = {}; -  _resolveIds.call(this, schema, getFullPath(id, false), id); -  return localRefs; - -  /* @this Ajv */ -  function _resolveIds(schema, fullPath, baseId) { -    /* jshint validthis: true */ -    if (Array.isArray(schema)) { -      for (var i=0; i<schema.length; i++) -        _resolveIds.call(this, schema[i], fullPath+'/'+i, baseId); -    } else if (schema && typeof schema == 'object') { -      if (typeof schema.id == 'string') { -        var id = baseId = baseId -                          ? url.resolve(baseId, schema.id) -                          : schema.id; -        id = normalizeId(id); - -        var refVal = this._refs[id]; -        if (typeof refVal == 'string') refVal = this._refs[refVal]; -        if (refVal && refVal.schema) { -          if (!equal(schema, refVal.schema)) +  var self = this; + +  traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { +    if (jsonPtr === '') return; +    var id = self._getId(sch); +    var baseId = baseIds[parentJsonPtr]; +    var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword; +    if (keyIndex !== undefined) +      fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex)); + +    if (typeof id == 'string') { +      id = baseId = normalizeId(baseId ? url.resolve(baseId, id) : id); + +      var refVal = self._refs[id]; +      if (typeof refVal == 'string') refVal = self._refs[refVal]; +      if (refVal && refVal.schema) { +        if (!equal(sch, refVal.schema)) +          throw new Error('id "' + id + '" resolves to more than one schema'); +      } else if (id != normalizeId(fullPath)) { +        if (id[0] == '#') { +          if (localRefs[id] && !equal(sch, localRefs[id]))              throw new Error('id "' + id + '" resolves to more than one schema'); -        } else if (id != normalizeId(fullPath)) { -          if (id[0] == '#') { -            if (localRefs[id] && !equal(schema, localRefs[id])) -              throw new Error('id "' + id + '" resolves to more than one schema'); -            localRefs[id] = schema; -          } else { -            this._refs[id] = fullPath; -          } +          localRefs[id] = sch; +        } else { +          self._refs[id] = fullPath;          }        } -      for (var key in schema) -        _resolveIds.call(this, schema[key], fullPath+'/'+util.escapeFragment(key), baseId);      } -  } +    baseIds[jsonPtr] = baseId; +    fullPaths[jsonPtr] = fullPath; +  }); + +  return localRefs;  } diff --git a/node_modules/ajv/lib/compile/rules.js b/node_modules/ajv/lib/compile/rules.js index 39b1708d9..eaeab77fa 100644 --- a/node_modules/ajv/lib/compile/rules.js +++ b/node_modules/ajv/lib/compile/rules.js @@ -6,34 +6,52 @@ var ruleModules = require('./_rules')  module.exports = function rules() {    var RULES = [      { type: 'number', -      rules: [ 'maximum', 'minimum', 'multipleOf'] }, +      rules: [ { 'maximum': ['exclusiveMaximum'] }, +               { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },      { type: 'string',        rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },      { type: 'array', -      rules: [ 'maxItems', 'minItems', 'uniqueItems', 'items' ] }, +      rules: [ 'maxItems', 'minItems', 'uniqueItems', 'contains', 'items' ] },      { type: 'object', -      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'properties' ] }, -    { rules: [ '$ref', 'enum', 'not', 'anyOf', 'oneOf', 'allOf' ] } +      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames', +               { 'properties': ['additionalProperties', 'patternProperties'] } ] }, +    { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf' ] }    ]; -  var ALL = [ 'type', 'additionalProperties', 'patternProperties' ]; -  var KEYWORDS = [ 'additionalItems', '$schema', 'id', 'title', 'description', 'default' ]; +  var ALL = [ 'type' ]; +  var KEYWORDS = [ +    'additionalItems', '$schema', 'id', 'title', +    'description', 'default', 'definitions' +  ];    var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];    RULES.all = toHash(ALL); +  RULES.types = toHash(TYPES);    RULES.forEach(function (group) {      group.rules = group.rules.map(function (keyword) { +      var implKeywords; +      if (typeof keyword == 'object') { +        var key = Object.keys(keyword)[0]; +        implKeywords = keyword[key]; +        keyword = key; +        implKeywords.forEach(function (k) { +          ALL.push(k); +          RULES.all[k] = true; +        }); +      }        ALL.push(keyword);        var rule = RULES.all[keyword] = {          keyword: keyword, -        code: ruleModules[keyword] +        code: ruleModules[keyword], +        implements: implKeywords        };        return rule;      }); + +    if (group.type) RULES.types[group.type] = group;    });    RULES.keywords = toHash(ALL.concat(KEYWORDS)); -  RULES.types = toHash(TYPES);    RULES.custom = {};    return RULES; diff --git a/node_modules/ajv/lib/compile/util.js b/node_modules/ajv/lib/compile/util.js index 8451f83ae..263891c33 100644 --- a/node_modules/ajv/lib/compile/util.js +++ b/node_modules/ajv/lib/compile/util.js @@ -9,19 +9,20 @@ module.exports = {    toHash: toHash,    getProperty: getProperty,    escapeQuotes: escapeQuotes, +  equal: require('fast-deep-equal'),    ucs2length: require('./ucs2length'),    varOccurences: varOccurences,    varReplace: varReplace,    cleanUpCode: cleanUpCode, -  cleanUpVarErrors: cleanUpVarErrors, +  finalCleanUpCode: finalCleanUpCode,    schemaHasRules: schemaHasRules,    schemaHasRulesExcept: schemaHasRulesExcept, -  stableStringify: require('json-stable-stringify'),    toQuotedString: toQuotedString,    getPathExpr: getPathExpr,    getPath: getPath,    getData: getData,    unescapeFragment: unescapeFragment, +  unescapeJsonPointer: unescapeJsonPointer,    escapeFragment: escapeFragment,    escapeJsonPointer: escapeJsonPointer  }; @@ -144,31 +145,40 @@ function cleanUpCode(out) {  } -var ERRORS_REGEXP = /[^v\.]errors/g +var ERRORS_REGEXP = /[^v.]errors/g    , REMOVE_ERRORS = /var errors = 0;|var vErrors = null;|validate.errors = vErrors;/g    , REMOVE_ERRORS_ASYNC = /var errors = 0;|var vErrors = null;/g    , RETURN_VALID = 'return errors === 0;'    , RETURN_TRUE = 'validate.errors = null; return true;' -  , RETURN_ASYNC = /if \(errors === 0\) return true;\s*else throw new ValidationError\(vErrors\);/ -  , RETURN_TRUE_ASYNC = 'return true;'; +  , RETURN_ASYNC = /if \(errors === 0\) return data;\s*else throw new ValidationError\(vErrors\);/ +  , RETURN_DATA_ASYNC = 'return data;' +  , ROOTDATA_REGEXP = /[^A-Za-z_$]rootData[^A-Za-z0-9_$]/g +  , REMOVE_ROOTDATA = /if \(rootData === undefined\) rootData = data;/; -function cleanUpVarErrors(out, async) { +function finalCleanUpCode(out, async) {    var matches = out.match(ERRORS_REGEXP); -  if (!matches || matches.length !== 2) return out; -  return async +  if (matches && matches.length == 2) { +    out = async            ? out.replace(REMOVE_ERRORS_ASYNC, '') -               .replace(RETURN_ASYNC, RETURN_TRUE_ASYNC) +               .replace(RETURN_ASYNC, RETURN_DATA_ASYNC)            : out.replace(REMOVE_ERRORS, '')                 .replace(RETURN_VALID, RETURN_TRUE); +  } + +  matches = out.match(ROOTDATA_REGEXP); +  if (!matches || matches.length !== 3) return out; +  return out.replace(REMOVE_ROOTDATA, '');  }  function schemaHasRules(schema, rules) { +  if (typeof schema == 'boolean') return !schema;    for (var key in schema) if (rules[key]) return true;  }  function schemaHasRulesExcept(schema, rules, exceptKeyword) { +  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';    for (var key in schema) if (key != exceptKeyword && rules[key]) return true;  } diff --git a/node_modules/ajv/lib/compile/validation_error.js b/node_modules/ajv/lib/compile/validation_error.js deleted file mode 100644 index 3c5c59478..000000000 --- a/node_modules/ajv/lib/compile/validation_error.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -module.exports = ValidationError; - - -function ValidationError(errors) { -  this.message = 'validation failed'; -  this.errors = errors; -  this.ajv = this.validation = true; -} - - -ValidationError.prototype = Object.create(Error.prototype); -ValidationError.prototype.constructor = ValidationError; diff --git a/node_modules/ajv/lib/dot/_limit.jst b/node_modules/ajv/lib/dot/_limit.jst index 21793d874..13e7649b3 100644 --- a/node_modules/ajv/lib/dot/_limit.jst +++ b/node_modules/ajv/lib/dot/_limit.jst @@ -3,47 +3,94 @@  {{# def.setupKeyword }}  {{# def.$data }} +{{## def.setExclusiveLimit: +  $exclusive = true; +  $errorKeyword = $exclusiveKeyword; +  $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; +#}} +  {{    var $isMax = $keyword == 'maximum'      , $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum'      , $schemaExcl = it.schema[$exclusiveKeyword] -    , $isDataExcl = it.opts.v5 && $schemaExcl && $schemaExcl.$data +    , $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data      , $op = $isMax ? '<' : '>' -    , $notOp = $isMax ? '>' : '<'; +    , $notOp = $isMax ? '>' : '<' +    , $errorKeyword = undefined;  }}  {{? $isDataExcl }}    {{      var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr)        , $exclusive = 'exclusive' + $lvl +      , $exclType = 'exclType' + $lvl +      , $exclIsNumber = 'exclIsNumber' + $lvl        , $opExpr = 'op' + $lvl        , $opStr = '\' + ' + $opExpr + ' + \'';    }}    var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}};    {{ $schemaValueExcl = 'schemaExcl' + $lvl; }} -  var exclusive{{=$lvl}}; -  if (typeof {{=$schemaValueExcl}} != 'boolean' && typeof {{=$schemaValueExcl}} != 'undefined') { +  var {{=$exclusive}}; +  var {{=$exclType}} = typeof {{=$schemaValueExcl}}; +  if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') {      {{ var $errorKeyword = $exclusiveKeyword; }}      {{# def.error:'_exclusiveLimit' }} -  } else if({{# def.$dataNotType:'number' }} -            ((exclusive{{=$lvl}} = {{=$schemaValueExcl}} === true) -              ? {{=$data}} {{=$notOp}}= {{=$schemaValue}} -              : {{=$data}} {{=$notOp}} {{=$schemaValue}}) +  } else if ({{# def.$dataNotType:'number' }} +            {{=$exclType}} == 'number' +              ? ( +                  ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}}) +                    ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}} +                    : {{=$data}} {{=$notOp}} {{=$schemaValue}} +                ) +              : ( +                  ({{=$exclusive}} = {{=$schemaValueExcl}} === true) +                    ? {{=$data}} {{=$notOp}}= {{=$schemaValue}} +                    : {{=$data}} {{=$notOp}} {{=$schemaValue}} +                )              || {{=$data}} !== {{=$data}}) { -    var op{{=$lvl}} = exclusive{{=$lvl}} ? '{{=$op}}' : '{{=$op}}='; +    var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}=';  {{??}}    {{ -    var $exclusive = $schemaExcl === true +    var $exclIsNumber = typeof $schemaExcl == 'number'        , $opStr = $op;  /*used in error*/ -    if (!$exclusive) $opStr += '='; -    var $opExpr = '\'' + $opStr + '\''; /*used in error*/    }} -  if ({{# def.$dataNotType:'number' }} -      {{=$data}} {{=$notOp}}{{?$exclusive}}={{?}} {{=$schemaValue}} -      || {{=$data}} !== {{=$data}}) { +  {{? $exclIsNumber && $isData }} +    {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }} +    if ({{# def.$dataNotType:'number' }} +        ( {{=$schemaValue}} === undefined +          || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}} +            ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}} +            : {{=$data}} {{=$notOp}} {{=$schemaValue}} ) +        || {{=$data}} !== {{=$data}}) { +  {{??}} +    {{ +      if ($exclIsNumber && $schema === undefined) { +          {{# def.setExclusiveLimit }} +          $schemaValue = $schemaExcl; +          $notOp += '='; +      } else { +        if ($exclIsNumber) +          $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + +        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { +          {{# def.setExclusiveLimit }} +          $notOp += '='; +        } else { +          $exclusive = false; +          $opStr += '='; +        } +      } + +      var $opExpr = '\'' + $opStr + '\''; /*used in error*/ +    }} + +    if ({{# def.$dataNotType:'number' }} +        {{=$data}} {{=$notOp}} {{=$schemaValue}} +        || {{=$data}} !== {{=$data}}) { +  {{?}}  {{?}} -    {{ var $errorKeyword = $keyword; }} +    {{ $errorKeyword = $errorKeyword || $keyword; }}      {{# def.error:'_limit' }}    } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/anyOf.jst b/node_modules/ajv/lib/dot/anyOf.jst index 93c3cd828..086cf2b33 100644 --- a/node_modules/ajv/lib/dot/anyOf.jst +++ b/node_modules/ajv/lib/dot/anyOf.jst @@ -35,7 +35,7 @@    {{= $closingBraces }}    if (!{{=$valid}}) { -    {{# def.addError:'anyOf' }} +    {{# def.extraError:'anyOf' }}    } else {      {{# def.resetErrors }}    {{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/v5/constant.jst b/node_modules/ajv/lib/dot/const.jst index 67969c1b9..2aa22980d 100644 --- a/node_modules/ajv/lib/dot/v5/constant.jst +++ b/node_modules/ajv/lib/dot/const.jst @@ -7,4 +7,5 @@    var schema{{=$lvl}} = validate.schema{{=$schemaPath}};  {{?}}  var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}}); -{{# def.checkError:'constant' }} +{{# def.checkError:'const' }} +{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/contains.jst b/node_modules/ajv/lib/dot/contains.jst new file mode 100644 index 000000000..925d2c84b --- /dev/null +++ b/node_modules/ajv/lib/dot/contains.jst @@ -0,0 +1,57 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{ +  var $idx = 'i' + $lvl +    , $dataNxt = $it.dataLevel = it.dataLevel + 1 +    , $nextData = 'data' + $dataNxt +    , $currentBaseId = it.baseId +    , $nonEmptySchema = {{# def.nonEmptySchema:$schema }}; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? $nonEmptySchema }} +  {{# def.setCompositeRule }} + +  {{ +    $it.schema = $schema; +    $it.schemaPath = $schemaPath; +    $it.errSchemaPath = $errSchemaPath; +  }} + +  var {{=$nextValid}} = false; + +  for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { +    {{ +      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); +      var $passData = $data + '[' + $idx + ']'; +      $it.dataPathArr[$dataNxt] = $idx; +    }} + +    {{# def.generateSubschemaCode }} +    {{# def.optimizeValidate }} + +    if ({{=$nextValid}}) break; +  } + +  {{# def.resetCompositeRule }} +  {{= $closingBraces }} + +  if (!{{=$nextValid}}) { +{{??}} +  if ({{=$data}}.length == 0) { +{{?}} + +    {{# def.error:'contains' }} +  } else { +    {{? $nonEmptySchema }} +      {{# def.resetErrors }} +    {{?}} +  {{? it.opts.allErrors }} } {{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/custom.jst b/node_modules/ajv/lib/dot/custom.jst index e91c50e6f..402028e6b 100644 --- a/node_modules/ajv/lib/dot/custom.jst +++ b/node_modules/ajv/lib/dot/custom.jst @@ -6,7 +6,8 @@  {{    var $rule = this      , $definition = 'definition' + $lvl -    , $rDef = $rule.definition; +    , $rDef = $rule.definition +    , $closingBraces = '';    var $validate = $rDef.validate;    var $compile, $inline, $macro, $ruleValidate, $validateCode;  }} @@ -21,6 +22,7 @@  {{??}}    {{      $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); +    if (!$ruleValidate) return;      $schemaValue = 'validate.schema' + $schemaPath;      $validateCode = $ruleValidate.code;      $compile = $rDef.compile; @@ -76,9 +78,16 @@ var {{=$valid}};  #}} -{{? $validateSchema }} -  {{=$valid}} = {{=$definition}}.validateSchema({{=$schemaValue}}); -  if ({{=$valid}}) { +{{? $isData && $rDef.$data }} +  {{ $closingBraces += '}'; }} +  if ({{=$schemaValue}} === undefined) { +    {{=$valid}} = true; +  } else { +  {{? $validateSchema }} +    {{ $closingBraces += '}'; }} +    {{=$valid}} = {{=$definition}}.validateSchema({{=$schemaValue}}); +    if ({{=$valid}}) { +  {{?}}  {{?}}  {{? $inline }} @@ -123,12 +132,10 @@ var {{=$valid}};  {{?}}  {{? $rDef.modifying }} -  {{=$data}} = {{=$parentData}}[{{=$parentDataProperty}}]; +  if ({{=$parentData}}) {{=$data}} = {{=$parentData}}[{{=$parentDataProperty}}];  {{?}} -{{? $validateSchema }} -  } -{{?}} +{{= $closingBraces }}  {{## def.notValidationResult:    {{? $rDef.valid === undefined }} diff --git a/node_modules/ajv/lib/dot/definitions.def b/node_modules/ajv/lib/dot/definitions.def index a442346f5..cdbe140bb 100644 --- a/node_modules/ajv/lib/dot/definitions.def +++ b/node_modules/ajv/lib/dot/definitions.def @@ -113,12 +113,12 @@  {{## def.cleanUp: {{ out = it.util.cleanUpCode(out); }} #}} -{{## def.cleanUpVarErrors: {{ out = it.util.cleanUpVarErrors(out, $async); }} #}} +{{## def.finalCleanUp: {{ out = it.util.finalCleanUpCode(out, $async); }} #}}  {{## def.$data:    {{ -    var $isData = it.opts.v5 && $schema && $schema.$data +    var $isData = it.opts.$data && $schema && $schema.$data        , $schemaValue;    }}    {{? $isData }} @@ -175,8 +175,25 @@  #}} -{{## def.checkOwnProperty: +{{## def.iterateProperties:    {{? $ownProperties }} -    if (!Object.prototype.hasOwnProperty.call({{=$data}}, {{=$key}})) continue; +    {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}}); +    for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) { +      var {{=$key}} = {{=$dataProperties}}[{{=$idx}}]; +  {{??}} +    for (var {{=$key}} in {{=$data}}) {    {{?}}  #}} + + +{{## def.noPropertyInData: +  {{=$useData}} === undefined +  {{? $ownProperties }} +    || !{{# def.isOwnProperty }} +  {{?}} +#}} + + +{{## def.isOwnProperty: +  Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}') +#}} diff --git a/node_modules/ajv/lib/dot/dependencies.jst b/node_modules/ajv/lib/dot/dependencies.jst index 1198a45fe..c41f33422 100644 --- a/node_modules/ajv/lib/dot/dependencies.jst +++ b/node_modules/ajv/lib/dot/dependencies.jst @@ -5,9 +5,18 @@  {{# def.setupNextLevel }} +{{## def.propertyInData: +  {{=$data}}{{= it.util.getProperty($property) }} !== undefined +  {{? $ownProperties }} +    && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}') +  {{?}} +#}} + +  {{    var $schemaDeps = {} -    , $propertyDeps = {}; +    , $propertyDeps = {} +    , $ownProperties = it.opts.ownProperties;    for ($property in $schema) {      var $sch = $schema[$property]; @@ -23,17 +32,19 @@ var {{=$errs}} = errors;  var missing{{=$lvl}};  {{ for (var $property in $propertyDeps) { }}    {{ $deps = $propertyDeps[$property]; }} -  if ({{=$data}}{{= it.util.getProperty($property) }} !== undefined -    {{? $breakOnError }} -        && ({{# def.checkMissingProperty:$deps }})) { -        {{# def.errorMissingProperty:'dependencies' }} -    {{??}} -      ) { -        {{~ $deps:$reqProperty }} -          {{# def.allErrorsMissingProperty:'dependencies' }} -        {{~}} -    {{?}} -  } {{# def.elseIfValid }} +  {{? $deps.length }} +    if ({{# def.propertyInData }} +      {{? $breakOnError }} +          && ({{# def.checkMissingProperty:$deps }})) { +          {{# def.errorMissingProperty:'dependencies' }} +      {{??}} +        ) { +          {{~ $deps:$propertyKey }} +            {{# def.allErrorsMissingProperty:'dependencies' }} +          {{~}} +      {{?}} +    } {{# def.elseIfValid }} +  {{?}}  {{ } }}  {{ @@ -47,7 +58,7 @@ var missing{{=$lvl}};    {{? {{# def.nonEmptySchema:$sch }} }}      {{=$nextValid}} = true; -    if ({{=$data}}{{= it.util.getProperty($property) }} !== undefined) { +    if ({{# def.propertyInData }}) {        {{           $it.schema = $sch;          $it.schemaPath = $schemaPath + it.util.getProperty($property); diff --git a/node_modules/ajv/lib/dot/errors.def b/node_modules/ajv/lib/dot/errors.def index 3e0472120..b79646fc2 100644 --- a/node_modules/ajv/lib/dot/errors.def +++ b/node_modules/ajv/lib/dot/errors.def @@ -87,14 +87,17 @@  {{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}} -{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schema}}'{{?}}#}} +{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}}  {{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}}  {{## def._errorMessages = { +  'false schema':  "'boolean schema is false'",    $ref:            "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'",    additionalItems: "'should NOT have more than {{=$schema.length}} items'",    additionalProperties: "'should NOT have additional properties'",    anyOf:           "'should match some schema in anyOf'", +  const:           "'should be equal to constant'", +  contains:        "'should contain a valid item'",    dependencies:    "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'",    'enum':          "'should be equal to one of the allowed values'",    format:          "'should match format \"{{#def.concatSchemaEQ}}\"'", @@ -107,14 +110,14 @@    not:             "'should NOT be valid'",    oneOf:           "'should match exactly one schema in oneOf'",    pattern:         "'should match pattern \"{{#def.concatSchemaEQ}}\"'", +  patternGroups:   "'should NOT have {{=$moreOrLess}} than {{=$limit}} properties matching pattern \"{{=it.util.escapeQuotes($pgProperty)}}\"'", +  propertyNames:   "'property name \\'{{=$invalidName}}\\' is invalid'",    required:        "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'",    type:            "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'",    uniqueItems:     "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'",    custom:          "'should pass \"{{=$rule.keyword}}\" keyword validation'", -  patternGroups:   "'should NOT have {{=$moreOrLess}} than {{=$limit}} properties matching pattern \"{{=it.util.escapeQuotes($pgProperty)}}\"'",    patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''",    switch:          "'should pass \"switch\" keyword validation'", -  constant:        "'should be equal to constant'",    _formatLimit:    "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'",    _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'"  } #}} @@ -124,10 +127,13 @@  {{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}  {{## def._errorSchemas = { +  'false schema':  "false",    $ref:            "{{=it.util.toQuotedString($schema)}}",    additionalItems: "false",    additionalProperties: "false",    anyOf:           "validate.schema{{=$schemaPath}}", +  const:           "validate.schema{{=$schemaPath}}", +  contains:        "validate.schema{{=$schemaPath}}",    dependencies:    "validate.schema{{=$schemaPath}}",    'enum':          "validate.schema{{=$schemaPath}}",    format:          "{{#def.schemaRefOrQS}}", @@ -140,14 +146,14 @@    not:             "validate.schema{{=$schemaPath}}",    oneOf:           "validate.schema{{=$schemaPath}}",    pattern:         "{{#def.schemaRefOrQS}}", +  patternGroups:   "validate.schema{{=$schemaPath}}", +  propertyNames:   "validate.schema{{=$schemaPath}}",    required:        "validate.schema{{=$schemaPath}}",    type:            "validate.schema{{=$schemaPath}}",    uniqueItems:     "{{#def.schemaRefOrVal}}",    custom:          "validate.schema{{=$schemaPath}}", -  patternGroups:   "validate.schema{{=$schemaPath}}",    patternRequired: "validate.schema{{=$schemaPath}}",    switch:          "validate.schema{{=$schemaPath}}", -  constant:        "validate.schema{{=$schemaPath}}",    _formatLimit:    "{{#def.schemaRefOrQS}}",    _formatExclusiveLimit: "validate.schema{{=$schemaPath}}"  } #}} @@ -156,10 +162,13 @@  {{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}}  {{## def._errorParams = { +  'false schema':  "{}",    $ref:            "{ ref: '{{=it.util.escapeQuotes($schema)}}' }",    additionalItems: "{ limit: {{=$schema.length}} }",    additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }",    anyOf:           "{}", +  const:           "{}", +  contains:        "{}",    dependencies:    "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }",    'enum':          "{ allowedValues: schema{{=$lvl}} }",    format:          "{ format: {{#def.schemaValueQS}} }", @@ -172,14 +181,14 @@    not:             "{}",    oneOf:           "{}",    pattern:         "{ pattern: {{#def.schemaValueQS}} }", +  patternGroups:   "{ reason: '{{=$reason}}', limit: {{=$limit}}, pattern: '{{=it.util.escapeQuotes($pgProperty)}}' }", +  propertyNames:   "{ propertyName: '{{=$invalidName}}' }",    required:        "{ missingProperty: '{{=$missingProperty}}' }",    type:            "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }",    uniqueItems:     "{ i: i, j: j }",    custom:          "{ keyword: '{{=$rule.keyword}}' }", -  patternGroups:   "{ reason: '{{=$reason}}', limit: {{=$limit}}, pattern: '{{=it.util.escapeQuotes($pgProperty)}}' }",    patternRequired: "{ missingPattern: '{{=$missingPattern}}' }",    switch:          "{ caseIndex: {{=$caseIndex}} }", -  constant:        "{}",    _formatLimit:    "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }",    _formatExclusiveLimit: "{}"  } #}} diff --git a/node_modules/ajv/lib/dot/format.jst b/node_modules/ajv/lib/dot/format.jst index 961fe4fc9..074d16c31 100644 --- a/node_modules/ajv/lib/dot/format.jst +++ b/node_modules/ajv/lib/dot/format.jst @@ -15,13 +15,14 @@  {{## def.$dataCheckFormat:    {{# def.$dataNotType:'string' }} -  ({{? $unknownFormats === true || $allowUnknown }} +  ({{? $unknownFormats != 'ignore' }}       ({{=$schemaValue}} && !{{=$format}}        {{? $allowUnknown }}          && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1        {{?}}) ||     {{?}} -   ({{=$format}} && !(typeof {{=$format}} == 'function' +   ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}' +                 && !(typeof {{=$format}} == 'function'                       ? {{? it.async}}                          (async{{=$lvl}} ? {{=it.yieldAwait}} {{=$format}}({{=$data}}) : {{=$format}}({{=$data}}))                         {{??}} @@ -49,12 +50,17 @@  }}  {{? $isData }} -  {{ var $format = 'format' + $lvl; }} +  {{ +    var $format = 'format' + $lvl +      , $isObject = 'isObject' + $lvl +      , $formatType = 'formatType' + $lvl; +  }}    var {{=$format}} = formats[{{=$schemaValue}}]; -  var isObject{{=$lvl}} = typeof {{=$format}} == 'object' -                          && !({{=$format}} instanceof RegExp) -                          && {{=$format}}.validate; -  if (isObject{{=$lvl}}) { +  var {{=$isObject}} = typeof {{=$format}} == 'object' +                        && !({{=$format}} instanceof RegExp) +                        && {{=$format}}.validate; +  var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string'; +  if ({{=$isObject}}) {      {{? it.async}}        var async{{=$lvl}} = {{=$format}}.async;      {{?}} @@ -64,28 +70,28 @@  {{??}}    {{ var $format = it.formats[$schema]; }}    {{? !$format }} -    {{? $unknownFormats === true || ($allowUnknown && $unknownFormats.indexOf($schema) == -1) }} -      {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }} -    {{??}} -      {{ -        if (!$allowUnknown) { -          console.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); -          if ($unknownFormats !== 'ignore') -            console.warn('In the next major version it will throw exception. See option unknownFormats for more information'); -        } -      }} +    {{? $unknownFormats == 'ignore' }} +      {{ console.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }}        {{# def.skipFormat }} +    {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }} +      {{# def.skipFormat }} +    {{??}} +      {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }}      {{?}}    {{?}}    {{      var $isObject = typeof $format == 'object'                      && !($format instanceof RegExp)                      && $format.validate; +    var $formatType = $isObject && $format.type || 'string';      if ($isObject) {        var $async = $format.async === true;        $format = $format.validate;      }    }} +  {{? $formatType != $ruleType }} +    {{# def.skipFormat }} +  {{?}}    {{? $async }}      {{        if (!it.async) throw new Error('async format in sync schema'); diff --git a/node_modules/ajv/lib/dot/items.jst b/node_modules/ajv/lib/dot/items.jst index a8b8aa7dd..8c0f5acb5 100644 --- a/node_modules/ajv/lib/dot/items.jst +++ b/node_modules/ajv/lib/dot/items.jst @@ -90,7 +90,6 @@ var {{=$valid}};      $it.errSchemaPath = $errSchemaPath;    }}    {{# def.validateItems: 0 }} -  {{# def.ifResultValid }}  {{?}}  {{? $breakOnError }} diff --git a/node_modules/ajv/lib/dot/missing.def b/node_modules/ajv/lib/dot/missing.def index 23ad04cf4..a73b9f966 100644 --- a/node_modules/ajv/lib/dot/missing.def +++ b/node_modules/ajv/lib/dot/missing.def @@ -1,8 +1,11 @@  {{## def.checkMissingProperty:_properties: -  {{~ _properties:_$property:$i }} +  {{~ _properties:$propertyKey:$i }}      {{?$i}} || {{?}} -    {{ var $prop = it.util.getProperty(_$property); }} -    ( {{=$data}}{{=$prop}} === undefined && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? _$property : $prop) }}) ) +    {{ +      var $prop = it.util.getProperty($propertyKey) +        , $useData = $data + $prop; +    }} +    ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) )    {{~}}  #}} @@ -20,15 +23,17 @@    {{# def.error:_error }}  #}} +  {{## def.allErrorsMissingProperty:_error:    {{ -    var $prop = it.util.getProperty($reqProperty) -      , $missingProperty = it.util.escapeQuotes($reqProperty); +    var $prop = it.util.getProperty($propertyKey) +      , $missingProperty = it.util.escapeQuotes($propertyKey) +      , $useData = $data + $prop;      if (it.opts._errorDataPathProperty) { -      it.errorPath = it.util.getPath($currentErrorPath, $reqProperty, it.opts.jsonPointers); +      it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);      }    }} -  if ({{=$data}}{{=$prop}} === undefined) { +  if ({{# def.noPropertyInData }}) {      {{# def.addError:_error }}    }  #}} diff --git a/node_modules/ajv/lib/dot/oneOf.jst b/node_modules/ajv/lib/dot/oneOf.jst index b7f7bff07..59a435549 100644 --- a/node_modules/ajv/lib/dot/oneOf.jst +++ b/node_modules/ajv/lib/dot/oneOf.jst @@ -38,7 +38,7 @@ var {{=$valid}} = false;  {{= $closingBraces }}  if (!{{=$valid}}) { -  {{# def.error:'oneOf' }} +  {{# def.extraError:'oneOf' }}  } else {    {{# def.resetErrors }}  {{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/properties.jst b/node_modules/ajv/lib/dot/properties.jst index 3a4b966ff..8d56324b7 100644 --- a/node_modules/ajv/lib/dot/properties.jst +++ b/node_modules/ajv/lib/dot/properties.jst @@ -23,8 +23,10 @@  {{    var $key = 'key' + $lvl +    , $idx = 'idx' + $lvl      , $dataNxt = $it.dataLevel = it.dataLevel + 1 -    , $nextData = 'data' + $dataNxt; +    , $nextData = 'data' + $dataNxt +    , $dataProperties = 'dataProperties' + $lvl;    var $schemaKeys = Object.keys($schema || {})      , $pProperties = it.schema.patternProperties || {} @@ -43,7 +45,7 @@    if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired)      var $requiredHash = it.util.toHash($required); -  if (it.opts.v5) { +  if (it.opts.patternGroups) {      var $pgProperties = it.schema.patternGroups || {}        , $pgPropertyKeys = Object.keys($pgProperties);    } @@ -52,10 +54,12 @@  var {{=$errs}} = errors;  var {{=$nextValid}} = true; +{{? $ownProperties }} +  var {{=$dataProperties}} = undefined; +{{?}}  {{? $checkAdditional }} -  for (var {{=$key}} in {{=$data}}) { -    {{# def.checkOwnProperty }} +  {{# def.iterateProperties }}      {{? $someProperties }}        var isAdditional{{=$lvl}} = !(false          {{? $schemaKeys.length }} @@ -72,7 +76,7 @@ var {{=$nextValid}} = true;              || {{= it.usePattern($pProperty) }}.test({{=$key}})            {{~}}          {{?}} -        {{? it.opts.v5 && $pgPropertyKeys && $pgPropertyKeys.length }} +        {{? it.opts.patternGroups && $pgPropertyKeys.length }}            {{~ $pgPropertyKeys:$pgProperty:$i }}              || {{= it.usePattern($pgProperty) }}.test({{=$key}})            {{~}} @@ -170,7 +174,7 @@ var {{=$nextValid}} = true;          {{= $code }}        {{??}}          {{? $requiredHash && $requiredHash[$propertyKey] }} -          if ({{=$useData}} === undefined) { +          if ({{# def.noPropertyInData }}) {              {{=$nextValid}} = false;              {{                var $currentErrorPath = it.errorPath @@ -187,11 +191,15 @@ var {{=$nextValid}} = true;            } else {          {{??}}            {{? $breakOnError }} -            if ({{=$useData}} === undefined) { +            if ({{# def.noPropertyInData }}) {                {{=$nextValid}} = true;              } else {            {{??}} -            if ({{=$useData}} !== undefined) { +            if ({{=$useData}} !== undefined +              {{? $ownProperties }} +                && {{# def.isOwnProperty }} +              {{?}} +            ) {            {{?}}          {{?}} @@ -204,40 +212,41 @@ var {{=$nextValid}} = true;    {{~}}  {{?}} -{{~ $pPropertyKeys:$pProperty }} -  {{ var $sch = $pProperties[$pProperty]; }} +{{? $pPropertyKeys.length }} +  {{~ $pPropertyKeys:$pProperty }} +    {{ var $sch = $pProperties[$pProperty]; }} -  {{? {{# def.nonEmptySchema:$sch}} }} -    {{ -      $it.schema = $sch; -      $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); -      $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' -                                           + it.util.escapeFragment($pProperty); -    }} +    {{? {{# def.nonEmptySchema:$sch}} }} +      {{ +        $it.schema = $sch; +        $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); +        $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' +                                             + it.util.escapeFragment($pProperty); +      }} -    for (var {{=$key}} in {{=$data}}) { -      {{# def.checkOwnProperty }} -      if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { -        {{ -          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); -          var $passData = $data + '[' + $key + ']'; -          $it.dataPathArr[$dataNxt] = $key; -        }} +      {{# def.iterateProperties }} +        if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { +          {{ +            $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); +            var $passData = $data + '[' + $key + ']'; +            $it.dataPathArr[$dataNxt] = $key; +          }} -        {{# def.generateSubschemaCode }} -        {{# def.optimizeValidate }} +          {{# def.generateSubschemaCode }} +          {{# def.optimizeValidate }} -        {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} +          {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} +        } +        {{? $breakOnError }} else {{=$nextValid}} = true; {{?}}        } -      {{? $breakOnError }} else {{=$nextValid}} = true; {{?}} -    } -    {{# def.ifResultValid }} -  {{?}} {{ /* def.nonEmptySchema */ }} -{{~}} +      {{# def.ifResultValid }} +    {{?}} {{ /* def.nonEmptySchema */ }} +  {{~}} +{{?}} -{{? it.opts.v5 }} +{{? it.opts.patternGroups && $pgPropertyKeys.length }}    {{~ $pgPropertyKeys:$pgProperty }}      {{        var $pgSchema = $pgProperties[$pgProperty] @@ -255,8 +264,7 @@ var {{=$nextValid}} = true;        var pgPropCount{{=$lvl}} = 0; -      for (var {{=$key}} in {{=$data}}) { -        {{# def.checkOwnProperty }} +      {{# def.iterateProperties }}          if ({{= it.usePattern($pgProperty) }}.test({{=$key}})) {            pgPropCount{{=$lvl}}++; diff --git a/node_modules/ajv/lib/dot/propertyNames.jst b/node_modules/ajv/lib/dot/propertyNames.jst new file mode 100644 index 000000000..51caffc20 --- /dev/null +++ b/node_modules/ajv/lib/dot/propertyNames.jst @@ -0,0 +1,54 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{? {{# def.nonEmptySchema:$schema }} }} +  {{ +    $it.schema = $schema; +    $it.schemaPath = $schemaPath; +    $it.errSchemaPath = $errSchemaPath; +  }} + +  {{ +    var $key = 'key' + $lvl +      , $idx = 'idx' + $lvl +      , $i = 'i' + $lvl +      , $invalidName = '\' + ' + $key + ' + \'' +      , $dataNxt = $it.dataLevel = it.dataLevel + 1 +      , $nextData = 'data' + $dataNxt +      , $dataProperties = 'dataProperties' + $lvl +      , $ownProperties = it.opts.ownProperties +      , $currentBaseId = it.baseId; +  }} + +  var {{=$errs}} = errors; + +  {{? $ownProperties }} +    var {{=$dataProperties}} = undefined; +  {{?}} +  {{# def.iterateProperties }} +    var startErrs{{=$lvl}} = errors; + +    {{ var $passData = $key; }} +    {{# def.setCompositeRule }} +    {{# def.generateSubschemaCode }} +    {{# def.optimizeValidate }} +    {{# def.resetCompositeRule }} + +    if (!{{=$nextValid}}) { +      for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}<errors; {{=$i}}++) { +        vErrors[{{=$i}}].propertyName = {{=$key}}; +      } +      {{# def.extraError:'propertyNames' }} +      {{? $breakOnError }} break; {{?}} +    } +  } +{{?}} + +{{? $breakOnError }} +  {{= $closingBraces }} +  if ({{=$errs}} == errors) { +{{?}} + +{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/ref.jst b/node_modules/ajv/lib/dot/ref.jst index e8cdc4435..4a0889686 100644 --- a/node_modules/ajv/lib/dot/ref.jst +++ b/node_modules/ajv/lib/dot/ref.jst @@ -25,21 +25,16 @@  {{??}}    {{ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); }}    {{? $refVal === undefined }} -    {{ var $message = 'can\'t resolve reference ' + $schema + ' from id ' + it.baseId; }} +    {{ var $message = it.MissingRefError.message(it.baseId, $schema); }}      {{? it.opts.missingRefs == 'fail' }} -      {{ console.log($message); }} +      {{ console.error($message); }}        {{# def.error:'$ref' }}        {{? $breakOnError }} if (false) { {{?}}      {{?? it.opts.missingRefs == 'ignore' }} -      {{ console.log($message); }} +      {{ console.warn($message); }}        {{? $breakOnError }} if (true) { {{?}}      {{??}} -      {{ -        var $error = new Error($message); -        $error.missingRef = it.resolve.url(it.baseId, $schema); -        $error.missingSchema = it.resolve.normalizeId(it.resolve.fullPath($error.missingRef)); -        throw $error; -      }} +      {{ throw new it.MissingRefError(it.baseId, $schema, $message); }}      {{?}}    {{?? $refVal.inline }}      {{# def.setupNextLevel }} @@ -68,12 +63,16 @@    {{? $async }}      {{ if (!it.async) throw new Error('async schema referenced by sync schema'); }} -    try { {{? $breakOnError }}var {{=$valid}} ={{?}} {{=it.yieldAwait}} {{=__callValidate}}; } -    catch (e) { +    {{? $breakOnError }} var {{=$valid}}; {{?}} +    try { +      {{=it.yieldAwait}} {{=__callValidate}}; +      {{? $breakOnError }} {{=$valid}} = true; {{?}} +    } catch (e) {        if (!(e instanceof ValidationError)) throw e;        if (vErrors === null) vErrors = e.errors;        else vErrors = vErrors.concat(e.errors);        errors = vErrors.length; +      {{? $breakOnError }} {{=$valid}} = false; {{?}}      }      {{? $breakOnError }} if ({{=$valid}}) { {{?}}    {{??}} diff --git a/node_modules/ajv/lib/dot/required.jst b/node_modules/ajv/lib/dot/required.jst index e109568f3..80fde35e8 100644 --- a/node_modules/ajv/lib/dot/required.jst +++ b/node_modules/ajv/lib/dot/required.jst @@ -22,6 +22,11 @@  #}} +{{## def.isRequiredOwnProperty: +  Object.prototype.hasOwnProperty.call({{=$data}}, {{=$vSchema}}[{{=$i}}]) +#}} + +  {{? !$isData }}    {{? $schema.length < it.opts.loopRequired &&        it.schema.properties && Object.keys(it.schema.properties).length }} @@ -41,7 +46,8 @@  {{? $isData || $required.length }}    {{      var $currentErrorPath = it.errorPath -      , $loopRequired = $isData || $required.length >= it.opts.loopRequired; +      , $loopRequired = $isData || $required.length >= it.opts.loopRequired +      , $ownProperties = it.opts.ownProperties;    }}    {{? $breakOnError }} @@ -53,7 +59,10 @@        {{?$isData}}{{# def.check$dataIsArray }}{{?}}        for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { -        {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined; +        {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined +                      {{? $ownProperties }} +                        && {{# def.isRequiredOwnProperty }} +                      {{?}};          if (!{{=$valid}}) break;        } @@ -76,14 +85,17 @@        {{?}}        for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { -        if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined) { +        if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined +            {{? $ownProperties }} +              || !{{# def.isRequiredOwnProperty }} +            {{?}}) {            {{# def.addError:'required' }}          }        }        {{? $isData }}  }  {{?}}      {{??}} -      {{~ $required:$reqProperty }} +      {{~ $required:$propertyKey }}          {{# def.allErrorsMissingProperty:'required' }}        {{~}}      {{?}} diff --git a/node_modules/ajv/lib/dot/v5/_formatLimit.jst b/node_modules/ajv/lib/dot/v5/_formatLimit.jst deleted file mode 100644 index af16b88d8..000000000 --- a/node_modules/ajv/lib/dot/v5/_formatLimit.jst +++ /dev/null @@ -1,116 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} - -var {{=$valid}} = undefined; - -{{## def.skipFormatLimit: -  {{=$valid}} = true; -  {{ return out; }} -#}} - -{{## def.compareFormat: -  {{? $isData }} -    if ({{=$schemaValue}} === undefined) {{=$valid}} = true; -    else if (typeof {{=$schemaValue}} != 'string') {{=$valid}} = false; -    else { -    {{ $closingBraces += '}'; }} -  {{?}} - -  {{? $isDataFormat }} -    if (!{{=$compare}}) {{=$valid}} = true; -    else { -    {{ $closingBraces += '}'; }} -  {{?}} - -  var {{=$result}} = {{=$compare}}({{=$data}}, {{# def.schemaValueQS }}); - -  if ({{=$result}} === undefined) {{=$valid}} = false; -#}} - - -{{? it.opts.format === false }}{{# def.skipFormatLimit }}{{?}} - -{{ -  var $schemaFormat = it.schema.format -    , $isDataFormat = it.opts.v5 && $schemaFormat.$data -    , $closingBraces = ''; -}} - -{{? $isDataFormat }} -  {{ -    var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr) -      , $format = 'format' + $lvl -      , $compare = 'compare' + $lvl; -  }} - -  var {{=$format}} = formats[{{=$schemaValueFormat}}] -    , {{=$compare}} = {{=$format}} && {{=$format}}.compare; -{{??}} -  {{ var $format = it.formats[$schemaFormat]; }} -  {{? !($format && $format.compare) }} -    {{# def.skipFormatLimit }} -  {{?}} -  {{ var $compare = 'formats' + it.util.getProperty($schemaFormat) + '.compare'; }} -{{?}} - -{{ -  var $isMax = $keyword == 'formatMaximum' -    , $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum') -    , $schemaExcl = it.schema[$exclusiveKeyword] -    , $isDataExcl = it.opts.v5 && $schemaExcl && $schemaExcl.$data -    , $op = $isMax ? '<' : '>' -    , $result = 'result' + $lvl; -}} - -{{# def.$data }} - - -{{? $isDataExcl }} -  {{ -    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr) -      , $exclusive = 'exclusive' + $lvl -      , $opExpr = 'op' + $lvl -      , $opStr = '\' + ' + $opExpr + ' + \''; -  }} -  var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}}; -  {{ $schemaValueExcl = 'schemaExcl' + $lvl; }} - -  if (typeof {{=$schemaValueExcl}} != 'boolean' && {{=$schemaValueExcl}} !== undefined) { -    {{=$valid}} = false; -    {{ var $errorKeyword = $exclusiveKeyword; }} -    {{# def.error:'_formatExclusiveLimit' }} -  } - -  {{# def.elseIfValid }} - -  {{# def.compareFormat }} -  var {{=$exclusive}} = {{=$schemaValueExcl}} === true; - -  if ({{=$valid}} === undefined) { -    {{=$valid}} = {{=$exclusive}} -                  ? {{=$result}} {{=$op}} 0 -                  : {{=$result}} {{=$op}}= 0; -  } - -  if (!{{=$valid}}) var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}='; -{{??}} -  {{ -    var $exclusive = $schemaExcl === true -      , $opStr = $op;  /*used in error*/ -    if (!$exclusive) $opStr += '='; -    var $opExpr = '\'' + $opStr + '\''; /*used in error*/ -  }} - -  {{# def.compareFormat }} - -  if ({{=$valid}} === undefined) -    {{=$valid}} = {{=$result}} {{=$op}}{{?!$exclusive}}={{?}} 0; -{{?}} - -{{= $closingBraces }} - -if (!{{=$valid}}) { -  {{ var $errorKeyword = $keyword; }} -  {{# def.error:'_formatLimit' }} -} diff --git a/node_modules/ajv/lib/dot/v5/patternRequired.jst b/node_modules/ajv/lib/dot/v5/patternRequired.jst deleted file mode 100644 index 9af2cdc9d..000000000 --- a/node_modules/ajv/lib/dot/v5/patternRequired.jst +++ /dev/null @@ -1,28 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} - -{{ -  var $key = 'key' + $lvl -    , $matched = 'patternMatched' + $lvl -    , $closingBraces = '' -    , $ownProperties = it.opts.ownProperties; -}} - -var {{=$valid}} = true; -{{~ $schema:$pProperty }} -  var {{=$matched}} = false; -  for (var {{=$key}} in {{=$data}}) { -    {{# def.checkOwnProperty }} -    {{=$matched}} = {{= it.usePattern($pProperty) }}.test({{=$key}}); -    if ({{=$matched}}) break; -  } - -  {{ var $missingPattern = it.util.escapeQuotes($pProperty); }} -  if (!{{=$matched}}) { -    {{=$valid}} = false; -    {{# def.addError:'patternRequired' }} -  } {{# def.elseIfValid }} -{{~}} - -{{= $closingBraces }} diff --git a/node_modules/ajv/lib/dot/v5/switch.jst b/node_modules/ajv/lib/dot/v5/switch.jst deleted file mode 100644 index 389678e34..000000000 --- a/node_modules/ajv/lib/dot/v5/switch.jst +++ /dev/null @@ -1,73 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - - -{{## def.validateIf: -  {{# def.setCompositeRule }} -  {{ $it.createErrors = false; }} -  {{# def._validateSwitchRule:if }} -  {{ $it.createErrors = true; }} -  {{# def.resetCompositeRule }} -  {{=$ifPassed}} = {{=$nextValid}}; -#}} - -{{## def.validateThen: -  {{? typeof $sch.then == 'boolean' }} -    {{? $sch.then === false }} -      {{# def.error:'switch' }} -    {{?}} -    var {{=$nextValid}} = {{= $sch.then }}; -  {{??}} -    {{# def._validateSwitchRule:then }} -  {{?}} -#}} - -{{## def._validateSwitchRule:_clause: -  {{ -    $it.schema = $sch._clause; -    $it.schemaPath = $schemaPath + '[' + $caseIndex + ']._clause'; -    $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/_clause'; -  }} -  {{# def.insertSubschemaCode }} -#}} - -{{## def.switchCase: -  {{? $sch.if && {{# def.nonEmptySchema:$sch.if }} }} -    var {{=$errs}} = errors; -    {{# def.validateIf }} -    if ({{=$ifPassed}}) { -      {{# def.validateThen }}   -    } else { -      {{# def.resetErrors }} -    } -  {{??}} -    {{=$ifPassed}} = true; -    {{# def.validateThen }} -  {{?}} -#}} - - -{{ -  var $ifPassed = 'ifPassed' + it.level -    , $currentBaseId = $it.baseId -    , $shouldContinue; -}} -var {{=$ifPassed}}; - -{{~ $schema:$sch:$caseIndex }} -  {{? $caseIndex && !$shouldContinue }} -    if (!{{=$ifPassed}}) { -    {{ $closingBraces+= '}'; }} -  {{?}} - -  {{# def.switchCase }} -  {{ $shouldContinue = $sch.continue }} -{{~}} - -{{= $closingBraces }} - -var {{=$valid}} = {{=$nextValid}}; - -{{# def.cleanUp }} diff --git a/node_modules/ajv/lib/dot/validate.jst b/node_modules/ajv/lib/dot/validate.jst index 896e0860a..4ebc599c0 100644 --- a/node_modules/ajv/lib/dot/validate.jst +++ b/node_modules/ajv/lib/dot/validate.jst @@ -14,48 +14,93 @@      * validateRef etc. are defined in the parent scope in index.js      */ }} -{{ var $async = it.schema.$async === true; }} +{{ +  var $async = it.schema.$async === true +    , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref') +    , $id = it.self._getId(it.schema); +}} + +{{? it.isTop }} +  {{? $async }} +    {{ +      it.async = true; +      var $es7 = it.opts.async == 'es7'; +      it.yieldAwait = $es7 ? 'await' : 'yield'; +    }} +  {{?}} + +  var validate = +    {{? $async }} +      {{? $es7 }} +        (async function +      {{??}} +        {{? it.opts.async != '*'}}co.wrap{{?}}(function* +      {{?}} +    {{??}} +      (function +    {{?}} +        (data, dataPath, parentData, parentDataProperty, rootData) { +          'use strict'; +          {{? $id && (it.opts.sourceCode || it.opts.processCode) }} +            {{= '/\*# sourceURL=' + $id + ' */' }} +          {{?}} +{{?}} -{{? it.isTop}} +{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }} +  {{ var $keyword = 'false schema'; }} +  {{# def.setupKeyword }} +  {{? it.schema === false}} +    {{? it.isTop}} +      {{ $breakOnError = true; }} +    {{??}} +      var {{=$valid}} = false; +    {{?}} +    {{# def.error:'false schema' }} +  {{??}} +    {{? it.isTop}} +      {{? $async }} +        return data; +      {{??}} +        validate.errors = null; +        return true; +      {{?}} +    {{??}} +      var {{=$valid}} = true; +    {{?}} +  {{?}} + +  {{? it.isTop}} +    }); +    return validate; +  {{?}} + +  {{ return out; }} +{{?}} + + +{{? it.isTop }}    {{      var $top = it.isTop        , $lvl = it.level = 0        , $dataLvl = it.dataLevel = 0        , $data = 'data'; -    it.rootId = it.resolve.fullPath(it.root.schema.id); +    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));      it.baseId = it.baseId || it.rootId; -    if ($async) { -      it.async = true; -      var $es7 = it.opts.async == 'es7'; -      it.yieldAwait = $es7 ? 'await' : 'yield'; -    }      delete it.isTop;      it.dataPathArr = [undefined];    }} -  var validate = -  {{? $async }} -    {{? $es7 }} -      (async function -    {{??}} -      {{? it.opts.async == 'co*'}}co.wrap{{?}}(function* -    {{?}} -  {{??}} -    (function -  {{?}} -    (data, dataPath, parentData, parentDataProperty, rootData) { -    'use strict'; -    var vErrors = null; {{ /* don't edit, used in replace */ }} -    var errors = 0;     {{ /* don't edit, used in replace */ }} -    if (rootData === undefined) rootData = data; +  var vErrors = null; {{ /* don't edit, used in replace */ }} +  var errors = 0;     {{ /* don't edit, used in replace */ }} +  if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }}  {{??}}    {{      var $lvl = it.level        , $dataLvl = it.dataLevel        , $data = 'data' + ($dataLvl || ''); -    if (it.schema.id) it.baseId = it.resolve.url(it.baseId, it.schema.id); +    if ($id) it.baseId = it.resolve.url(it.baseId, $id);      if ($async && !it.async) throw new Error('async schema in sync schema');    }} @@ -72,6 +117,11 @@    var $errorKeyword;    var $typeSchema = it.schema.type      , $typeIsArray = Array.isArray($typeSchema); + +  if ($typeIsArray && $typeSchema.length == 1) { +    $typeSchema = $typeSchema[0]; +    $typeIsArray = false; +  }  }}  {{## def.checkType: @@ -84,29 +134,40 @@    if ({{= it.util[$method]($typeSchema, $data, true) }}) {  #}} -{{? $typeSchema && it.opts.coerceTypes }} -  {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }} -  {{? $coerceToTypes }} -    {{# def.checkType }} -      {{# def.coerceType }} -    } +{{? it.schema.$ref && $refKeywords }} +  {{? it.opts.extendRefs == 'fail' }} +    {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }} +  {{?? it.opts.extendRefs !== true }} +    {{ +      $refKeywords = false; +      console.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); +    }}    {{?}}  {{?}} -{{ var $refKeywords; }} -{{? it.schema.$ref && ($refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref')) }} -  {{? it.opts.extendRefs == 'fail' }} -    {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '"'); }} -  {{?? it.opts.extendRefs == 'ignore' }} +{{? $typeSchema }} +  {{? it.opts.coerceTypes }} +    {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }} +  {{?}} + +  {{ var $rulesGroup = it.RULES.types[$typeSchema]; }} +  {{? $coerceToTypes || $typeIsArray || $rulesGroup === true || +    ($rulesGroup && !$shouldUseGroup($rulesGroup)) }}      {{ -      $refKeywords = false; -      console.log('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); +      var $schemaPath = it.schemaPath + '.type' +        , $errSchemaPath = it.errSchemaPath + '/type';      }} -  {{?? it.opts.extendRefs !== true }} -    {{ console.log('$ref: all keywords used in schema at path "' + it.errSchemaPath + '". It will change in the next major version, see issue #260. Use option { extendRefs: true } to keep current behaviour'); }} +    {{# def.checkType }} +      {{? $coerceToTypes }} +        {{# def.coerceType }} +      {{??}} +        {{# def.error:'type' }} +      {{?}} +    }    {{?}}  {{?}} +  {{? it.schema.$ref && !$refKeywords }}    {{= it.RULES.all.$ref.code(it, '$ref') }}    {{? $breakOnError }} @@ -115,6 +176,9 @@      {{ $closingBraces2 += '}'; }}    {{?}}  {{??}} +  {{? it.opts.v5 && it.schema.patternGroups }} +    {{ console.warn('keyword "patternGroups" is deprecated and disabled. Use option patternGroups: true to enable.'); }} +  {{?}}    {{~ it.RULES:$rulesGroup }}      {{? $shouldUseGroup($rulesGroup) }}        {{? $rulesGroup.type }} @@ -129,9 +193,12 @@          {{?}}          {{~ $rulesGroup.rules:$rule }}            {{? $shouldUseRule($rule) }} -            {{= $rule.code(it, $rule.keyword) }} -            {{? $breakOnError }} -              {{ $closingBraces1 += '}'; }} +            {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }} +            {{? $code }} +              {{= $code }} +              {{? $breakOnError }} +                {{ $closingBraces1 += '}'; }} +              {{?}}              {{?}}            {{?}}          {{~}} @@ -142,7 +209,6 @@        {{? $rulesGroup.type }}          }          {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }} -          {{ var $typeChecked = true; }}            else {              {{                var $schemaPath = it.schemaPath + '.type' @@ -161,17 +227,11 @@    {{~}}  {{?}} -{{? $typeSchema && !$typeChecked && !$coerceToTypes }} -  {{# def.checkType }} -    {{# def.error:'type' }} -  } -{{?}} -  {{? $breakOnError }} {{= $closingBraces2 }} {{?}}  {{? $top }}      {{? $async }} -      if (errors === 0) return true;           {{ /* don't edit, used in replace */ }} +      if (errors === 0) return data;           {{ /* don't edit, used in replace */ }}        else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }}      {{??}}        validate.errors = vErrors; {{ /* don't edit, used in replace */ }} @@ -186,25 +246,27 @@  {{# def.cleanUp }} -{{? $top && $breakOnError }} -  {{# def.cleanUpVarErrors }} +{{? $top }} +  {{# def.finalCleanUp }}  {{?}}  {{    function $shouldUseGroup($rulesGroup) { -    for (var i=0; i < $rulesGroup.rules.length; i++) -      if ($shouldUseRule($rulesGroup.rules[i])) +    var rules = $rulesGroup.rules; +    for (var i=0; i < rules.length; i++) +      if ($shouldUseRule(rules[i]))          return true;    }    function $shouldUseRule($rule) {      return it.schema[$rule.keyword] !== undefined || -           ( $rule.keyword == 'properties' && -             ( it.schema.additionalProperties === false || -               typeof it.schema.additionalProperties == 'object' -               || ( it.schema.patternProperties && -                    Object.keys(it.schema.patternProperties).length ) -               || ( it.opts.v5 && it.schema.patternGroups && -                    Object.keys(it.schema.patternGroups).length ))); +           ($rule.implements && $ruleImlementsSomeKeyword($rule)); +  } + +  function $ruleImlementsSomeKeyword($rule) { +    var impl = $rule.implements; +    for (var i=0; i < impl.length; i++) +      if (it.schema[impl[i]] !== undefined) +        return true;    }  }} diff --git a/node_modules/ajv/lib/dotjs/_formatLimit.js b/node_modules/ajv/lib/dotjs/_formatLimit.js deleted file mode 100644 index 996e1f2c2..000000000 --- a/node_modules/ajv/lib/dotjs/_formatLimit.js +++ /dev/null @@ -1,176 +0,0 @@ -'use strict'; -module.exports = function generate__formatLimit(it, $keyword) { -  var out = ' '; -  var $lvl = it.level; -  var $dataLvl = it.dataLevel; -  var $schema = it.schema[$keyword]; -  var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -  var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -  var $breakOnError = !it.opts.allErrors; -  var $errorKeyword; -  var $data = 'data' + ($dataLvl || ''); -  var $valid = 'valid' + $lvl; -  out += 'var ' + ($valid) + ' = undefined;'; -  if (it.opts.format === false) { -    out += ' ' + ($valid) + ' = true; '; -    return out; -  } -  var $schemaFormat = it.schema.format, -    $isDataFormat = it.opts.v5 && $schemaFormat.$data, -    $closingBraces = ''; -  if ($isDataFormat) { -    var $schemaValueFormat = it.util.getData($schemaFormat.$data, $dataLvl, it.dataPathArr), -      $format = 'format' + $lvl, -      $compare = 'compare' + $lvl; -    out += ' var ' + ($format) + ' = formats[' + ($schemaValueFormat) + '] , ' + ($compare) + ' = ' + ($format) + ' && ' + ($format) + '.compare;'; -  } else { -    var $format = it.formats[$schemaFormat]; -    if (!($format && $format.compare)) { -      out += '  ' + ($valid) + ' = true; '; -      return out; -    } -    var $compare = 'formats' + it.util.getProperty($schemaFormat) + '.compare'; -  } -  var $isMax = $keyword == 'formatMaximum', -    $exclusiveKeyword = 'formatExclusive' + ($isMax ? 'Maximum' : 'Minimum'), -    $schemaExcl = it.schema[$exclusiveKeyword], -    $isDataExcl = it.opts.v5 && $schemaExcl && $schemaExcl.$data, -    $op = $isMax ? '<' : '>', -    $result = 'result' + $lvl; -  var $isData = it.opts.v5 && $schema && $schema.$data, -    $schemaValue; -  if ($isData) { -    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; -    $schemaValue = 'schema' + $lvl; -  } else { -    $schemaValue = $schema; -  } -  if ($isDataExcl) { -    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), -      $exclusive = 'exclusive' + $lvl, -      $opExpr = 'op' + $lvl, -      $opStr = '\' + ' + $opExpr + ' + \''; -    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; -    $schemaValueExcl = 'schemaExcl' + $lvl; -    out += ' if (typeof ' + ($schemaValueExcl) + ' != \'boolean\' && ' + ($schemaValueExcl) + ' !== undefined) { ' + ($valid) + ' = false; '; -    var $errorKeyword = $exclusiveKeyword; -    var $$outStack = $$outStack || []; -    $$outStack.push(out); -    out = ''; /* istanbul ignore else */ -    if (it.createErrors !== false) { -      out += ' { keyword: \'' + ($errorKeyword || '_formatExclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; -      if (it.opts.messages !== false) { -        out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; -      } -      if (it.opts.verbose) { -        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -      } -      out += ' } '; -    } else { -      out += ' {} '; -    } -    var __err = out; -    out = $$outStack.pop(); -    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -      if (it.async) { -        out += ' throw new ValidationError([' + (__err) + ']); '; -      } else { -        out += ' validate.errors = [' + (__err) + ']; return false; '; -      } -    } else { -      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -    } -    out += ' }  '; -    if ($breakOnError) { -      $closingBraces += '}'; -      out += ' else { '; -    } -    if ($isData) { -      out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'string\') ' + ($valid) + ' = false; else { '; -      $closingBraces += '}'; -    } -    if ($isDataFormat) { -      out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { '; -      $closingBraces += '}'; -    } -    out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ',  '; -    if ($isData) { -      out += '' + ($schemaValue); -    } else { -      out += '' + (it.util.toQuotedString($schema)); -    } -    out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; var ' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true; if (' + ($valid) + ' === undefined) { ' + ($valid) + ' = ' + ($exclusive) + ' ? ' + ($result) + ' ' + ($op) + ' 0 : ' + ($result) + ' ' + ($op) + '= 0; } if (!' + ($valid) + ') var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';'; -  } else { -    var $exclusive = $schemaExcl === true, -      $opStr = $op; -    if (!$exclusive) $opStr += '='; -    var $opExpr = '\'' + $opStr + '\''; -    if ($isData) { -      out += ' if (' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'string\') ' + ($valid) + ' = false; else { '; -      $closingBraces += '}'; -    } -    if ($isDataFormat) { -      out += ' if (!' + ($compare) + ') ' + ($valid) + ' = true; else { '; -      $closingBraces += '}'; -    } -    out += ' var ' + ($result) + ' = ' + ($compare) + '(' + ($data) + ',  '; -    if ($isData) { -      out += '' + ($schemaValue); -    } else { -      out += '' + (it.util.toQuotedString($schema)); -    } -    out += ' ); if (' + ($result) + ' === undefined) ' + ($valid) + ' = false; if (' + ($valid) + ' === undefined) ' + ($valid) + ' = ' + ($result) + ' ' + ($op); -    if (!$exclusive) { -      out += '='; -    } -    out += ' 0;'; -  } -  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { '; -  var $errorKeyword = $keyword; -  var $$outStack = $$outStack || []; -  $$outStack.push(out); -  out = ''; /* istanbul ignore else */ -  if (it.createErrors !== false) { -    out += ' { keyword: \'' + ($errorKeyword || '_formatLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit:  '; -    if ($isData) { -      out += '' + ($schemaValue); -    } else { -      out += '' + (it.util.toQuotedString($schema)); -    } -    out += ' , exclusive: ' + ($exclusive) + ' } '; -    if (it.opts.messages !== false) { -      out += ' , message: \'should be ' + ($opStr) + ' "'; -      if ($isData) { -        out += '\' + ' + ($schemaValue) + ' + \''; -      } else { -        out += '' + (it.util.escapeQuotes($schema)); -      } -      out += '"\' '; -    } -    if (it.opts.verbose) { -      out += ' , schema:  '; -      if ($isData) { -        out += 'validate.schema' + ($schemaPath); -      } else { -        out += '' + (it.util.toQuotedString($schema)); -      } -      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -    } -    out += ' } '; -  } else { -    out += ' {} '; -  } -  var __err = out; -  out = $$outStack.pop(); -  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -    if (it.async) { -      out += ' throw new ValidationError([' + (__err) + ']); '; -    } else { -      out += ' validate.errors = [' + (__err) + ']; return false; '; -    } -  } else { -    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -  } -  out += '}'; -  return out; -} diff --git a/node_modules/ajv/lib/dotjs/_limit.js b/node_modules/ajv/lib/dotjs/_limit.js index 4d92024af..10a187fb7 100644 --- a/node_modules/ajv/lib/dotjs/_limit.js +++ b/node_modules/ajv/lib/dotjs/_limit.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate__limit(it, $keyword) { +module.exports = function generate__limit(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate__limit(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $errorKeyword;    var $data = 'data' + ($dataLvl || ''); -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; @@ -20,17 +20,20 @@ module.exports = function generate__limit(it, $keyword) {    var $isMax = $keyword == 'maximum',      $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',      $schemaExcl = it.schema[$exclusiveKeyword], -    $isDataExcl = it.opts.v5 && $schemaExcl && $schemaExcl.$data, +    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,      $op = $isMax ? '<' : '>', -    $notOp = $isMax ? '>' : '<'; +    $notOp = $isMax ? '>' : '<', +    $errorKeyword = undefined;    if ($isDataExcl) {      var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),        $exclusive = 'exclusive' + $lvl, +      $exclType = 'exclType' + $lvl, +      $exclIsNumber = 'exclIsNumber' + $lvl,        $opExpr = 'op' + $lvl,        $opStr = '\' + ' + $opExpr + ' + \'';      out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';      $schemaValueExcl = 'schemaExcl' + $lvl; -    out += ' var exclusive' + ($lvl) + '; if (typeof ' + ($schemaValueExcl) + ' != \'boolean\' && typeof ' + ($schemaValueExcl) + ' != \'undefined\') { '; +    out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { ';      var $errorKeyword = $exclusiveKeyword;      var $$outStack = $$outStack || [];      $$outStack.push(out); @@ -58,27 +61,49 @@ module.exports = function generate__limit(it, $keyword) {      } else {        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';      } -    out += ' } else if( '; +    out += ' } else if ( ';      if ($isData) {        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || ';      } -    out += ' ((exclusive' + ($lvl) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ') || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = exclusive' + ($lvl) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';'; +    out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\';';    } else { -    var $exclusive = $schemaExcl === true, +    var $exclIsNumber = typeof $schemaExcl == 'number',        $opStr = $op; -    if (!$exclusive) $opStr += '='; -    var $opExpr = '\'' + $opStr + '\''; -    out += ' if ( '; -    if ($isData) { -      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; -    } -    out += ' ' + ($data) + ' ' + ($notOp); -    if ($exclusive) { -      out += '='; +    if ($exclIsNumber && $isData) { +      var $opExpr = '\'' + $opStr + '\''; +      out += ' if ( '; +      if ($isData) { +        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; +      } +      out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; +    } else { +      if ($exclIsNumber && $schema === undefined) { +        $exclusive = true; +        $errorKeyword = $exclusiveKeyword; +        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; +        $schemaValue = $schemaExcl; +        $notOp += '='; +      } else { +        if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); +        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { +          $exclusive = true; +          $errorKeyword = $exclusiveKeyword; +          $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; +          $notOp += '='; +        } else { +          $exclusive = false; +          $opStr += '='; +        } +      } +      var $opExpr = '\'' + $opStr + '\''; +      out += ' if ( '; +      if ($isData) { +        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; +      } +      out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';      } -    out += ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') {';    } -  var $errorKeyword = $keyword; +  $errorKeyword = $errorKeyword || $keyword;    var $$outStack = $$outStack || [];    $$outStack.push(out);    out = ''; /* istanbul ignore else */ @@ -89,7 +114,7 @@ module.exports = function generate__limit(it, $keyword) {        if ($isData) {          out += '\' + ' + ($schemaValue);        } else { -        out += '' + ($schema) + '\''; +        out += '' + ($schemaValue) + '\'';        }      }      if (it.opts.verbose) { diff --git a/node_modules/ajv/lib/dotjs/_limitItems.js b/node_modules/ajv/lib/dotjs/_limitItems.js index 6a843627b..16e37f214 100644 --- a/node_modules/ajv/lib/dotjs/_limitItems.js +++ b/node_modules/ajv/lib/dotjs/_limitItems.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate__limitItems(it, $keyword) { +module.exports = function generate__limitItems(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate__limitItems(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $errorKeyword;    var $data = 'data' + ($dataLvl || ''); -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; diff --git a/node_modules/ajv/lib/dotjs/_limitLength.js b/node_modules/ajv/lib/dotjs/_limitLength.js index e378104df..e6927f39c 100644 --- a/node_modules/ajv/lib/dotjs/_limitLength.js +++ b/node_modules/ajv/lib/dotjs/_limitLength.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate__limitLength(it, $keyword) { +module.exports = function generate__limitLength(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate__limitLength(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $errorKeyword;    var $data = 'data' + ($dataLvl || ''); -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; diff --git a/node_modules/ajv/lib/dotjs/_limitProperties.js b/node_modules/ajv/lib/dotjs/_limitProperties.js index 74c085184..a48308f8a 100644 --- a/node_modules/ajv/lib/dotjs/_limitProperties.js +++ b/node_modules/ajv/lib/dotjs/_limitProperties.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate__limitProperties(it, $keyword) { +module.exports = function generate__limitProperties(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate__limitProperties(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $errorKeyword;    var $data = 'data' + ($dataLvl || ''); -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; diff --git a/node_modules/ajv/lib/dotjs/allOf.js b/node_modules/ajv/lib/dotjs/allOf.js index 0063ecf1a..5107b18cf 100644 --- a/node_modules/ajv/lib/dotjs/allOf.js +++ b/node_modules/ajv/lib/dotjs/allOf.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_allOf(it, $keyword) { +module.exports = function generate_allOf(it, $keyword, $ruleType) {    var out = ' ';    var $schema = it.schema[$keyword];    var $schemaPath = it.schemaPath + it.util.getProperty($keyword); diff --git a/node_modules/ajv/lib/dotjs/anyOf.js b/node_modules/ajv/lib/dotjs/anyOf.js index c95f8ff9a..994b09123 100644 --- a/node_modules/ajv/lib/dotjs/anyOf.js +++ b/node_modules/ajv/lib/dotjs/anyOf.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_anyOf(it, $keyword) { +module.exports = function generate_anyOf(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -38,7 +38,7 @@ module.exports = function generate_anyOf(it, $keyword) {        }      }      it.compositeRule = $it.compositeRule = $wasComposite; -    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {  var err =   '; /* istanbul ignore else */ +    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */      if (it.createErrors !== false) {        out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';        if (it.opts.messages !== false) { @@ -51,7 +51,15 @@ module.exports = function generate_anyOf(it, $keyword) {      } else {        out += ' {} ';      } -    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; +    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; +    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +      if (it.async) { +        out += ' throw new ValidationError(vErrors); '; +      } else { +        out += ' validate.errors = vErrors; return false; '; +      } +    } +    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';      if (it.opts.allErrors) {        out += ' } ';      } diff --git a/node_modules/ajv/lib/dotjs/constant.js b/node_modules/ajv/lib/dotjs/const.js index 2a3e147ff..d19756e14 100644 --- a/node_modules/ajv/lib/dotjs/constant.js +++ b/node_modules/ajv/lib/dotjs/const.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_constant(it, $keyword) { +module.exports = function generate_const(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate_constant(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $data = 'data' + ($dataLvl || '');    var $valid = 'valid' + $lvl; -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; @@ -25,7 +25,7 @@ module.exports = function generate_constant(it, $keyword) {    $$outStack.push(out);    out = ''; /* istanbul ignore else */    if (it.createErrors !== false) { -    out += ' { keyword: \'' + ('constant') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; +    out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';      if (it.opts.messages !== false) {        out += ' , message: \'should be equal to constant\' ';      } @@ -48,5 +48,8 @@ module.exports = function generate_constant(it, $keyword) {      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';    }    out += ' }'; +  if ($breakOnError) { +    out += ' else { '; +  }    return out;  } diff --git a/node_modules/ajv/lib/dotjs/contains.js b/node_modules/ajv/lib/dotjs/contains.js new file mode 100644 index 000000000..04c6e936f --- /dev/null +++ b/node_modules/ajv/lib/dotjs/contains.js @@ -0,0 +1,81 @@ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { +  var out = ' '; +  var $lvl = it.level; +  var $dataLvl = it.dataLevel; +  var $schema = it.schema[$keyword]; +  var $schemaPath = it.schemaPath + it.util.getProperty($keyword); +  var $errSchemaPath = it.errSchemaPath + '/' + $keyword; +  var $breakOnError = !it.opts.allErrors; +  var $data = 'data' + ($dataLvl || ''); +  var $valid = 'valid' + $lvl; +  var $errs = 'errs__' + $lvl; +  var $it = it.util.copy(it); +  var $closingBraces = ''; +  $it.level++; +  var $nextValid = 'valid' + $it.level; +  var $idx = 'i' + $lvl, +    $dataNxt = $it.dataLevel = it.dataLevel + 1, +    $nextData = 'data' + $dataNxt, +    $currentBaseId = it.baseId, +    $nonEmptySchema = it.util.schemaHasRules($schema, it.RULES.all); +  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; +  if ($nonEmptySchema) { +    var $wasComposite = it.compositeRule; +    it.compositeRule = $it.compositeRule = true; +    $it.schema = $schema; +    $it.schemaPath = $schemaPath; +    $it.errSchemaPath = $errSchemaPath; +    out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; +    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); +    var $passData = $data + '[' + $idx + ']'; +    $it.dataPathArr[$dataNxt] = $idx; +    var $code = it.validate($it); +    $it.baseId = $currentBaseId; +    if (it.util.varOccurences($code, $nextData) < 2) { +      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; +    } else { +      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; +    } +    out += ' if (' + ($nextValid) + ') break; }  '; +    it.compositeRule = $it.compositeRule = $wasComposite; +    out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; +  } else { +    out += ' if (' + ($data) + '.length == 0) {'; +  } +  var $$outStack = $$outStack || []; +  $$outStack.push(out); +  out = ''; /* istanbul ignore else */ +  if (it.createErrors !== false) { +    out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; +    if (it.opts.messages !== false) { +      out += ' , message: \'should contain a valid item\' '; +    } +    if (it.opts.verbose) { +      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +    } +    out += ' } '; +  } else { +    out += ' {} '; +  } +  var __err = out; +  out = $$outStack.pop(); +  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +    if (it.async) { +      out += ' throw new ValidationError([' + (__err) + ']); '; +    } else { +      out += ' validate.errors = [' + (__err) + ']; return false; '; +    } +  } else { +    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; +  } +  out += ' } else { '; +  if ($nonEmptySchema) { +    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; +  } +  if (it.opts.allErrors) { +    out += ' } '; +  } +  out = it.util.cleanUpCode(out); +  return out; +} diff --git a/node_modules/ajv/lib/dotjs/custom.js b/node_modules/ajv/lib/dotjs/custom.js index cbd481ccf..bff06d111 100644 --- a/node_modules/ajv/lib/dotjs/custom.js +++ b/node_modules/ajv/lib/dotjs/custom.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_custom(it, $keyword) { +module.exports = function generate_custom(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -11,7 +11,7 @@ module.exports = function generate_custom(it, $keyword) {    var $data = 'data' + ($dataLvl || '');    var $valid = 'valid' + $lvl;    var $errs = 'errs__' + $lvl; -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; @@ -21,7 +21,8 @@ module.exports = function generate_custom(it, $keyword) {    }    var $rule = this,      $definition = 'definition' + $lvl, -    $rDef = $rule.definition; +    $rDef = $rule.definition, +    $closingBraces = '';    var $compile, $inline, $macro, $ruleValidate, $validateCode;    if ($isData && $rDef.$data) {      $validateCode = 'keywordValidate' + $lvl; @@ -29,6 +30,7 @@ module.exports = function generate_custom(it, $keyword) {      out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';    } else {      $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); +    if (!$ruleValidate) return;      $schemaValue = 'validate.schema' + $schemaPath;      $validateCode = $ruleValidate.code;      $compile = $rDef.compile; @@ -44,8 +46,13 @@ module.exports = function generate_custom(it, $keyword) {      out += '' + ($ruleErrs) + ' = null;';    }    out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; -  if ($validateSchema) { -    out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') {'; +  if ($isData && $rDef.$data) { +    $closingBraces += '}'; +    out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; +    if ($validateSchema) { +      $closingBraces += '}'; +      out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; +    }    }    if ($inline) {      if ($rDef.statements) { @@ -55,6 +62,7 @@ module.exports = function generate_custom(it, $keyword) {      }    } else if ($macro) {      var $it = it.util.copy(it); +    var $closingBraces = '';      $it.level++;      var $nextValid = 'valid' + $it.level;      $it.schema = $ruleValidate.validate; @@ -104,11 +112,9 @@ module.exports = function generate_custom(it, $keyword) {      }    }    if ($rDef.modifying) { -    out += ' ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; -  } -  if ($validateSchema) { -    out += ' }'; +    out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';    } +  out += '' + ($closingBraces);    if ($rDef.valid) {      if ($breakOnError) {        out += ' if (true) { '; diff --git a/node_modules/ajv/lib/dotjs/dependencies.js b/node_modules/ajv/lib/dotjs/dependencies.js index 9ba4c5437..58814c612 100644 --- a/node_modules/ajv/lib/dotjs/dependencies.js +++ b/node_modules/ajv/lib/dotjs/dependencies.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_dependencies(it, $keyword) { +module.exports = function generate_dependencies(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -14,7 +14,8 @@ module.exports = function generate_dependencies(it, $keyword) {    $it.level++;    var $nextValid = 'valid' + $it.level;    var $schemaDeps = {}, -    $propertyDeps = {}; +    $propertyDeps = {}, +    $ownProperties = it.opts.ownProperties;    for ($property in $schema) {      var $sch = $schema[$property];      var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps; @@ -25,100 +26,115 @@ module.exports = function generate_dependencies(it, $keyword) {    out += 'var missing' + ($lvl) + ';';    for (var $property in $propertyDeps) {      $deps = $propertyDeps[$property]; -    out += ' if (' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; -    if ($breakOnError) { -      out += ' && ( '; -      var arr1 = $deps; -      if (arr1) { -        var _$property, $i = -1, -          l1 = arr1.length - 1; -        while ($i < l1) { -          _$property = arr1[$i += 1]; -          if ($i) { -            out += ' || '; -          } -          var $prop = it.util.getProperty(_$property); -          out += ' ( ' + ($data) + ($prop) + ' === undefined && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? _$property : $prop)) + ') ) '; -        } +    if ($deps.length) { +      out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; +      if ($ownProperties) { +        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') ';        } -      out += ')) {  '; -      var $propertyPath = 'missing' + $lvl, -        $missingProperty = '\' + ' + $propertyPath + ' + \''; -      if (it.opts._errorDataPathProperty) { -        it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; -      } -      var $$outStack = $$outStack || []; -      $$outStack.push(out); -      out = ''; /* istanbul ignore else */ -      if (it.createErrors !== false) { -        out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } '; -        if (it.opts.messages !== false) { -          out += ' , message: \'should have '; -          if ($deps.length == 1) { -            out += 'property ' + (it.util.escapeQuotes($deps[0])); -          } else { -            out += 'properties ' + (it.util.escapeQuotes($deps.join(", "))); +      if ($breakOnError) { +        out += ' && ( '; +        var arr1 = $deps; +        if (arr1) { +          var $propertyKey, $i = -1, +            l1 = arr1.length - 1; +          while ($i < l1) { +            $propertyKey = arr1[$i += 1]; +            if ($i) { +              out += ' || '; +            } +            var $prop = it.util.getProperty($propertyKey), +              $useData = $data + $prop; +            out += ' ( ( ' + ($useData) + ' === undefined '; +            if ($ownProperties) { +              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; +            } +            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';            } -          out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' ';          } -        if (it.opts.verbose) { -          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +        out += ')) {  '; +        var $propertyPath = 'missing' + $lvl, +          $missingProperty = '\' + ' + $propertyPath + ' + \''; +        if (it.opts._errorDataPathProperty) { +          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;          } -        out += ' } '; -      } else { -        out += ' {} '; -      } -      var __err = out; -      out = $$outStack.pop(); -      if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -        if (it.async) { -          out += ' throw new ValidationError([' + (__err) + ']); '; +        var $$outStack = $$outStack || []; +        $$outStack.push(out); +        out = ''; /* istanbul ignore else */ +        if (it.createErrors !== false) { +          out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } '; +          if (it.opts.messages !== false) { +            out += ' , message: \'should have '; +            if ($deps.length == 1) { +              out += 'property ' + (it.util.escapeQuotes($deps[0])); +            } else { +              out += 'properties ' + (it.util.escapeQuotes($deps.join(", "))); +            } +            out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' '; +          } +          if (it.opts.verbose) { +            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +          } +          out += ' } ';          } else { -          out += ' validate.errors = [' + (__err) + ']; return false; '; +          out += ' {} ';          } -      } else { -        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -      } -    } else { -      out += ' ) { '; -      var arr2 = $deps; -      if (arr2) { -        var $reqProperty, i2 = -1, -          l2 = arr2.length - 1; -        while (i2 < l2) { -          $reqProperty = arr2[i2 += 1]; -          var $prop = it.util.getProperty($reqProperty), -            $missingProperty = it.util.escapeQuotes($reqProperty); -          if (it.opts._errorDataPathProperty) { -            it.errorPath = it.util.getPath($currentErrorPath, $reqProperty, it.opts.jsonPointers); +        var __err = out; +        out = $$outStack.pop(); +        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +          if (it.async) { +            out += ' throw new ValidationError([' + (__err) + ']); '; +          } else { +            out += ' validate.errors = [' + (__err) + ']; return false; ';            } -          out += ' if (' + ($data) + ($prop) + ' === undefined) {  var err =   '; /* istanbul ignore else */ -          if (it.createErrors !== false) { -            out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } '; -            if (it.opts.messages !== false) { -              out += ' , message: \'should have '; -              if ($deps.length == 1) { -                out += 'property ' + (it.util.escapeQuotes($deps[0])); -              } else { -                out += 'properties ' + (it.util.escapeQuotes($deps.join(", "))); -              } -              out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' '; +        } else { +          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; +        } +      } else { +        out += ' ) { '; +        var arr2 = $deps; +        if (arr2) { +          var $propertyKey, i2 = -1, +            l2 = arr2.length - 1; +          while (i2 < l2) { +            $propertyKey = arr2[i2 += 1]; +            var $prop = it.util.getProperty($propertyKey), +              $missingProperty = it.util.escapeQuotes($propertyKey), +              $useData = $data + $prop; +            if (it.opts._errorDataPathProperty) { +              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);              } -            if (it.opts.verbose) { -              out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +            out += ' if ( ' + ($useData) + ' === undefined '; +            if ($ownProperties) { +              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';              } -            out += ' } '; -          } else { -            out += ' {} '; +            out += ') {  var err =   '; /* istanbul ignore else */ +            if (it.createErrors !== false) { +              out += ' { keyword: \'' + ('dependencies') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \'' + (it.util.escapeQuotes($property)) + '\', missingProperty: \'' + ($missingProperty) + '\', depsCount: ' + ($deps.length) + ', deps: \'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(", "))) + '\' } '; +              if (it.opts.messages !== false) { +                out += ' , message: \'should have '; +                if ($deps.length == 1) { +                  out += 'property ' + (it.util.escapeQuotes($deps[0])); +                } else { +                  out += 'properties ' + (it.util.escapeQuotes($deps.join(", "))); +                } +                out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\' '; +              } +              if (it.opts.verbose) { +                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +              } +              out += ' } '; +            } else { +              out += ' {} '; +            } +            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';            } -          out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';          }        } -    } -    out += ' }   '; -    if ($breakOnError) { -      $closingBraces += '}'; -      out += ' else { '; +      out += ' }   '; +      if ($breakOnError) { +        $closingBraces += '}'; +        out += ' else { '; +      }      }    }    it.errorPath = $currentErrorPath; @@ -126,7 +142,11 @@ module.exports = function generate_dependencies(it, $keyword) {    for (var $property in $schemaDeps) {      var $sch = $schemaDeps[$property];      if (it.util.schemaHasRules($sch, it.RULES.all)) { -      out += ' ' + ($nextValid) + ' = true; if (' + ($data) + (it.util.getProperty($property)) + ' !== undefined) { '; +      out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; +      if ($ownProperties) { +        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; +      } +      out += ') { ';        $it.schema = $sch;        $it.schemaPath = $schemaPath + it.util.getProperty($property);        $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); diff --git a/node_modules/ajv/lib/dotjs/enum.js b/node_modules/ajv/lib/dotjs/enum.js index ccbf0d831..03f3a8caa 100644 --- a/node_modules/ajv/lib/dotjs/enum.js +++ b/node_modules/ajv/lib/dotjs/enum.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_enum(it, $keyword) { +module.exports = function generate_enum(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate_enum(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $data = 'data' + ($dataLvl || '');    var $valid = 'valid' + $lvl; -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; diff --git a/node_modules/ajv/lib/dotjs/format.js b/node_modules/ajv/lib/dotjs/format.js index 09872c2c4..eb13371c1 100644 --- a/node_modules/ajv/lib/dotjs/format.js +++ b/node_modules/ajv/lib/dotjs/format.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_format(it, $keyword) { +module.exports = function generate_format(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -14,7 +14,7 @@ module.exports = function generate_format(it, $keyword) {      }      return out;    } -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; @@ -25,8 +25,10 @@ module.exports = function generate_format(it, $keyword) {    var $unknownFormats = it.opts.unknownFormats,      $allowUnknown = Array.isArray($unknownFormats);    if ($isData) { -    var $format = 'format' + $lvl; -    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var isObject' + ($lvl) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; if (isObject' + ($lvl) + ') { '; +    var $format = 'format' + $lvl, +      $isObject = 'isObject' + $lvl, +      $formatType = 'formatType' + $lvl; +    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { ';      if (it.async) {        out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';      } @@ -35,14 +37,14 @@ module.exports = function generate_format(it, $keyword) {        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || ';      }      out += ' ('; -    if ($unknownFormats === true || $allowUnknown) { +    if ($unknownFormats != 'ignore') {        out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';        if ($allowUnknown) {          out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';        }        out += ') || ';      } -    out += ' (' + ($format) + ' && !(typeof ' + ($format) + ' == \'function\' ? '; +    out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? ';      if (it.async) {        out += ' (async' + ($lvl) + ' ? ' + (it.yieldAwait) + ' ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';      } else { @@ -52,24 +54,33 @@ module.exports = function generate_format(it, $keyword) {    } else {      var $format = it.formats[$schema];      if (!$format) { -      if ($unknownFormats === true || ($allowUnknown && $unknownFormats.indexOf($schema) == -1)) { -        throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); -      } else { -        if (!$allowUnknown) { -          console.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); -          if ($unknownFormats !== 'ignore') console.warn('In the next major version it will throw exception. See option unknownFormats for more information'); +      if ($unknownFormats == 'ignore') { +        console.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); +        if ($breakOnError) { +          out += ' if (true) { ';          } +        return out; +      } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {          if ($breakOnError) {            out += ' if (true) { ';          }          return out; +      } else { +        throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"');        }      }      var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; +    var $formatType = $isObject && $format.type || 'string';      if ($isObject) {        var $async = $format.async === true;        $format = $format.validate;      } +    if ($formatType != $ruleType) { +      if ($breakOnError) { +        out += ' if (true) { '; +      } +      return out; +    }      if ($async) {        if (!it.async) throw new Error('async format in sync schema');        var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; diff --git a/node_modules/ajv/lib/dotjs/items.js b/node_modules/ajv/lib/dotjs/items.js index b7431b72d..77be5e214 100644 --- a/node_modules/ajv/lib/dotjs/items.js +++ b/node_modules/ajv/lib/dotjs/items.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_items(it, $keyword) { +module.exports = function generate_items(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -130,11 +130,7 @@ module.exports = function generate_items(it, $keyword) {      if ($breakOnError) {        out += ' if (!' + ($nextValid) + ') break; ';      } -    out += ' }  '; -    if ($breakOnError) { -      out += ' if (' + ($nextValid) + ') { '; -      $closingBraces += '}'; -    } +    out += ' }';    }    if ($breakOnError) {      out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; diff --git a/node_modules/ajv/lib/dotjs/multipleOf.js b/node_modules/ajv/lib/dotjs/multipleOf.js index d0e43daa3..df5a31544 100644 --- a/node_modules/ajv/lib/dotjs/multipleOf.js +++ b/node_modules/ajv/lib/dotjs/multipleOf.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_multipleOf(it, $keyword) { +module.exports = function generate_multipleOf(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -8,7 +8,7 @@ module.exports = function generate_multipleOf(it, $keyword) {    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;    var $breakOnError = !it.opts.allErrors;    var $data = 'data' + ($dataLvl || ''); -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; @@ -41,7 +41,7 @@ module.exports = function generate_multipleOf(it, $keyword) {        if ($isData) {          out += '\' + ' + ($schemaValue);        } else { -        out += '' + ($schema) + '\''; +        out += '' + ($schemaValue) + '\'';        }      }      if (it.opts.verbose) { diff --git a/node_modules/ajv/lib/dotjs/not.js b/node_modules/ajv/lib/dotjs/not.js index 2cb2a4765..67add9f67 100644 --- a/node_modules/ajv/lib/dotjs/not.js +++ b/node_modules/ajv/lib/dotjs/not.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_not(it, $keyword) { +module.exports = function generate_not(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; diff --git a/node_modules/ajv/lib/dotjs/oneOf.js b/node_modules/ajv/lib/dotjs/oneOf.js index 39f60e620..b4cd46065 100644 --- a/node_modules/ajv/lib/dotjs/oneOf.js +++ b/node_modules/ajv/lib/dotjs/oneOf.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_oneOf(it, $keyword) { +module.exports = function generate_oneOf(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -41,10 +41,7 @@ module.exports = function generate_oneOf(it, $keyword) {      }    }    it.compositeRule = $it.compositeRule = $wasComposite; -  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   '; -  var $$outStack = $$outStack || []; -  $$outStack.push(out); -  out = ''; /* istanbul ignore else */ +  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */    if (it.createErrors !== false) {      out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';      if (it.opts.messages !== false) { @@ -57,16 +54,13 @@ module.exports = function generate_oneOf(it, $keyword) {    } else {      out += ' {} ';    } -  var __err = out; -  out = $$outStack.pop(); +  out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */      if (it.async) { -      out += ' throw new ValidationError([' + (__err) + ']); '; +      out += ' throw new ValidationError(vErrors); ';      } else { -      out += ' validate.errors = [' + (__err) + ']; return false; '; +      out += ' validate.errors = vErrors; return false; ';      } -  } else { -    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';    }    out += '} else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';    if (it.opts.allErrors) { diff --git a/node_modules/ajv/lib/dotjs/pattern.js b/node_modules/ajv/lib/dotjs/pattern.js index 5518152a8..76b7794e0 100644 --- a/node_modules/ajv/lib/dotjs/pattern.js +++ b/node_modules/ajv/lib/dotjs/pattern.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_pattern(it, $keyword) { +module.exports = function generate_pattern(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -8,7 +8,7 @@ module.exports = function generate_pattern(it, $keyword) {    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;    var $breakOnError = !it.opts.allErrors;    var $data = 'data' + ($dataLvl || ''); -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; diff --git a/node_modules/ajv/lib/dotjs/patternRequired.js b/node_modules/ajv/lib/dotjs/patternRequired.js deleted file mode 100644 index 07bf31d29..000000000 --- a/node_modules/ajv/lib/dotjs/patternRequired.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; -module.exports = function generate_patternRequired(it, $keyword) { -  var out = ' '; -  var $lvl = it.level; -  var $dataLvl = it.dataLevel; -  var $schema = it.schema[$keyword]; -  var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -  var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -  var $breakOnError = !it.opts.allErrors; -  var $data = 'data' + ($dataLvl || ''); -  var $valid = 'valid' + $lvl; -  var $key = 'key' + $lvl, -    $matched = 'patternMatched' + $lvl, -    $closingBraces = '', -    $ownProperties = it.opts.ownProperties; -  out += 'var ' + ($valid) + ' = true;'; -  var arr1 = $schema; -  if (arr1) { -    var $pProperty, i1 = -1, -      l1 = arr1.length - 1; -    while (i1 < l1) { -      $pProperty = arr1[i1 += 1]; -      out += ' var ' + ($matched) + ' = false; for (var ' + ($key) + ' in ' + ($data) + ') {  '; -      if ($ownProperties) { -        out += ' if (!Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($key) + ')) continue; '; -      } -      out += ' ' + ($matched) + ' = ' + (it.usePattern($pProperty)) + '.test(' + ($key) + '); if (' + ($matched) + ') break; } '; -      var $missingPattern = it.util.escapeQuotes($pProperty); -      out += ' if (!' + ($matched) + ') { ' + ($valid) + ' = false;  var err =   '; /* istanbul ignore else */ -      if (it.createErrors !== false) { -        out += ' { keyword: \'' + ('patternRequired') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingPattern: \'' + ($missingPattern) + '\' } '; -        if (it.opts.messages !== false) { -          out += ' , message: \'should have property matching pattern \\\'' + ($missingPattern) + '\\\'\' '; -        } -        if (it.opts.verbose) { -          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -        } -        out += ' } '; -      } else { -        out += ' {} '; -      } -      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }   '; -      if ($breakOnError) { -        $closingBraces += '}'; -        out += ' else { '; -      } -    } -  } -  out += '' + ($closingBraces); -  return out; -} diff --git a/node_modules/ajv/lib/dotjs/properties.js b/node_modules/ajv/lib/dotjs/properties.js index 32eafce6a..3c6cecf63 100644 --- a/node_modules/ajv/lib/dotjs/properties.js +++ b/node_modules/ajv/lib/dotjs/properties.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_properties(it, $keyword) { +module.exports = function generate_properties(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -15,8 +15,10 @@ module.exports = function generate_properties(it, $keyword) {    $it.level++;    var $nextValid = 'valid' + $it.level;    var $key = 'key' + $lvl, +    $idx = 'idx' + $lvl,      $dataNxt = $it.dataLevel = it.dataLevel + 1, -    $nextData = 'data' + $dataNxt; +    $nextData = 'data' + $dataNxt, +    $dataProperties = 'dataProperties' + $lvl;    var $schemaKeys = Object.keys($schema || {}),      $pProperties = it.schema.patternProperties || {},      $pPropertyKeys = Object.keys($pProperties), @@ -30,15 +32,19 @@ module.exports = function generate_properties(it, $keyword) {      $currentBaseId = it.baseId;    var $required = it.schema.required;    if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required); -  if (it.opts.v5) { +  if (it.opts.patternGroups) {      var $pgProperties = it.schema.patternGroups || {},        $pgPropertyKeys = Object.keys($pgProperties);    }    out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; +  if ($ownProperties) { +    out += ' var ' + ($dataProperties) + ' = undefined;'; +  }    if ($checkAdditional) { -    out += ' for (var ' + ($key) + ' in ' + ($data) + ') {  ';      if ($ownProperties) { -      out += ' if (!Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($key) + ')) continue; '; +      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; +    } else { +      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';      }      if ($someProperties) {        out += ' var isAdditional' + ($lvl) + ' = !(false '; @@ -68,7 +74,7 @@ module.exports = function generate_properties(it, $keyword) {            }          }        } -      if (it.opts.v5 && $pgPropertyKeys && $pgPropertyKeys.length) { +      if (it.opts.patternGroups && $pgPropertyKeys.length) {          var arr3 = $pgPropertyKeys;          if (arr3) {            var $pgProperty, $i = -1, @@ -208,7 +214,11 @@ module.exports = function generate_properties(it, $keyword) {              out += ' ' + ($code) + ' ';            } else {              if ($requiredHash && $requiredHash[$propertyKey]) { -              out += ' if (' + ($useData) + ' === undefined) { ' + ($nextValid) + ' = false; '; +              out += ' if ( ' + ($useData) + ' === undefined '; +              if ($ownProperties) { +                out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; +              } +              out += ') { ' + ($nextValid) + ' = false; ';                var $currentErrorPath = it.errorPath,                  $currErrSchemaPath = $errSchemaPath,                  $missingProperty = it.util.escapeQuotes($propertyKey); @@ -253,9 +263,17 @@ module.exports = function generate_properties(it, $keyword) {                out += ' } else { ';              } else {                if ($breakOnError) { -                out += ' if (' + ($useData) + ' === undefined) { ' + ($nextValid) + ' = true; } else { '; +                out += ' if ( ' + ($useData) + ' === undefined '; +                if ($ownProperties) { +                  out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; +                } +                out += ') { ' + ($nextValid) + ' = true; } else { ';                } else { -                out += ' if (' + ($useData) + ' !== undefined) { '; +                out += ' if (' + ($useData) + ' !== undefined '; +                if ($ownProperties) { +                  out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; +                } +                out += ' ) { ';                }              }              out += ' ' + ($code) + ' } '; @@ -268,48 +286,51 @@ module.exports = function generate_properties(it, $keyword) {        }      }    } -  var arr5 = $pPropertyKeys; -  if (arr5) { -    var $pProperty, i5 = -1, -      l5 = arr5.length - 1; -    while (i5 < l5) { -      $pProperty = arr5[i5 += 1]; -      var $sch = $pProperties[$pProperty]; -      if (it.util.schemaHasRules($sch, it.RULES.all)) { -        $it.schema = $sch; -        $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); -        $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); -        out += ' for (var ' + ($key) + ' in ' + ($data) + ') {  '; -        if ($ownProperties) { -          out += ' if (!Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($key) + ')) continue; '; -        } -        out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; -        $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); -        var $passData = $data + '[' + $key + ']'; -        $it.dataPathArr[$dataNxt] = $key; -        var $code = it.validate($it); -        $it.baseId = $currentBaseId; -        if (it.util.varOccurences($code, $nextData) < 2) { -          out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; -        } else { -          out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; -        } -        if ($breakOnError) { -          out += ' if (!' + ($nextValid) + ') break; '; -        } -        out += ' } '; -        if ($breakOnError) { -          out += ' else ' + ($nextValid) + ' = true; '; -        } -        out += ' }  '; -        if ($breakOnError) { -          out += ' if (' + ($nextValid) + ') { '; -          $closingBraces += '}'; +  if ($pPropertyKeys.length) { +    var arr5 = $pPropertyKeys; +    if (arr5) { +      var $pProperty, i5 = -1, +        l5 = arr5.length - 1; +      while (i5 < l5) { +        $pProperty = arr5[i5 += 1]; +        var $sch = $pProperties[$pProperty]; +        if (it.util.schemaHasRules($sch, it.RULES.all)) { +          $it.schema = $sch; +          $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); +          $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); +          if ($ownProperties) { +            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; +          } else { +            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; +          } +          out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; +          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); +          var $passData = $data + '[' + $key + ']'; +          $it.dataPathArr[$dataNxt] = $key; +          var $code = it.validate($it); +          $it.baseId = $currentBaseId; +          if (it.util.varOccurences($code, $nextData) < 2) { +            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; +          } else { +            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; +          } +          if ($breakOnError) { +            out += ' if (!' + ($nextValid) + ') break; '; +          } +          out += ' } '; +          if ($breakOnError) { +            out += ' else ' + ($nextValid) + ' = true; '; +          } +          out += ' }  '; +          if ($breakOnError) { +            out += ' if (' + ($nextValid) + ') { '; +            $closingBraces += '}'; +          }          }        }      }    } -  if (it.opts.v5) { +  if (it.opts.patternGroups && $pgPropertyKeys.length) {      var arr6 = $pgPropertyKeys;      if (arr6) {        var $pgProperty, i6 = -1, @@ -322,9 +343,11 @@ module.exports = function generate_properties(it, $keyword) {            $it.schema = $sch;            $it.schemaPath = it.schemaPath + '.patternGroups' + it.util.getProperty($pgProperty) + '.schema';            $it.errSchemaPath = it.errSchemaPath + '/patternGroups/' + it.util.escapeFragment($pgProperty) + '/schema'; -          out += ' var pgPropCount' + ($lvl) + ' = 0; for (var ' + ($key) + ' in ' + ($data) + ') {  '; +          out += ' var pgPropCount' + ($lvl) + ' = 0;  ';            if ($ownProperties) { -            out += ' if (!Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($key) + ')) continue; '; +            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; +          } else { +            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';            }            out += ' if (' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ')) { pgPropCount' + ($lvl) + '++; ';            $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); diff --git a/node_modules/ajv/lib/dotjs/propertyNames.js b/node_modules/ajv/lib/dotjs/propertyNames.js new file mode 100644 index 000000000..0cedcdac9 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/propertyNames.js @@ -0,0 +1,81 @@ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { +  var out = ' '; +  var $lvl = it.level; +  var $dataLvl = it.dataLevel; +  var $schema = it.schema[$keyword]; +  var $schemaPath = it.schemaPath + it.util.getProperty($keyword); +  var $errSchemaPath = it.errSchemaPath + '/' + $keyword; +  var $breakOnError = !it.opts.allErrors; +  var $data = 'data' + ($dataLvl || ''); +  var $errs = 'errs__' + $lvl; +  var $it = it.util.copy(it); +  var $closingBraces = ''; +  $it.level++; +  var $nextValid = 'valid' + $it.level; +  if (it.util.schemaHasRules($schema, it.RULES.all)) { +    $it.schema = $schema; +    $it.schemaPath = $schemaPath; +    $it.errSchemaPath = $errSchemaPath; +    var $key = 'key' + $lvl, +      $idx = 'idx' + $lvl, +      $i = 'i' + $lvl, +      $invalidName = '\' + ' + $key + ' + \'', +      $dataNxt = $it.dataLevel = it.dataLevel + 1, +      $nextData = 'data' + $dataNxt, +      $dataProperties = 'dataProperties' + $lvl, +      $ownProperties = it.opts.ownProperties, +      $currentBaseId = it.baseId; +    out += ' var ' + ($errs) + ' = errors; '; +    if ($ownProperties) { +      out += ' var ' + ($dataProperties) + ' = undefined; '; +    } +    if ($ownProperties) { +      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; +    } else { +      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; +    } +    out += ' var startErrs' + ($lvl) + ' = errors; '; +    var $passData = $key; +    var $wasComposite = it.compositeRule; +    it.compositeRule = $it.compositeRule = true; +    var $code = it.validate($it); +    $it.baseId = $currentBaseId; +    if (it.util.varOccurences($code, $nextData) < 2) { +      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; +    } else { +      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; +    } +    it.compositeRule = $it.compositeRule = $wasComposite; +    out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '<errors; ' + ($i) + '++) { vErrors[' + ($i) + '].propertyName = ' + ($key) + '; }   var err =   '; /* istanbul ignore else */ +    if (it.createErrors !== false) { +      out += ' { keyword: \'' + ('propertyNames') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { propertyName: \'' + ($invalidName) + '\' } '; +      if (it.opts.messages !== false) { +        out += ' , message: \'property name \\\'' + ($invalidName) + '\\\' is invalid\' '; +      } +      if (it.opts.verbose) { +        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +      } +      out += ' } '; +    } else { +      out += ' {} '; +    } +    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; +    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +      if (it.async) { +        out += ' throw new ValidationError(vErrors); '; +      } else { +        out += ' validate.errors = vErrors; return false; '; +      } +    } +    if ($breakOnError) { +      out += ' break; '; +    } +    out += ' } }'; +  } +  if ($breakOnError) { +    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; +  } +  out = it.util.cleanUpCode(out); +  return out; +} diff --git a/node_modules/ajv/lib/dotjs/ref.js b/node_modules/ajv/lib/dotjs/ref.js index e07c70c3b..6fb950546 100644 --- a/node_modules/ajv/lib/dotjs/ref.js +++ b/node_modules/ajv/lib/dotjs/ref.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_ref(it, $keyword) { +module.exports = function generate_ref(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -20,9 +20,9 @@ module.exports = function generate_ref(it, $keyword) {    } else {      var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);      if ($refVal === undefined) { -      var $message = 'can\'t resolve reference ' + $schema + ' from id ' + it.baseId; +      var $message = it.MissingRefError.message(it.baseId, $schema);        if (it.opts.missingRefs == 'fail') { -        console.log($message); +        console.error($message);          var $$outStack = $$outStack || [];          $$outStack.push(out);          out = ''; /* istanbul ignore else */ @@ -53,15 +53,12 @@ module.exports = function generate_ref(it, $keyword) {            out += ' if (false) { ';          }        } else if (it.opts.missingRefs == 'ignore') { -        console.log($message); +        console.warn($message);          if ($breakOnError) {            out += ' if (true) { ';          }        } else { -        var $error = new Error($message); -        $error.missingRef = it.resolve.url(it.baseId, $schema); -        $error.missingSchema = it.resolve.normalizeId(it.resolve.fullPath($error.missingRef)); -        throw $error; +        throw new it.MissingRefError(it.baseId, $schema, $message);        }      } else if ($refVal.inline) {        var $it = it.util.copy(it); @@ -100,11 +97,18 @@ module.exports = function generate_ref(it, $keyword) {      out = $$outStack.pop();      if ($async) {        if (!it.async) throw new Error('async schema referenced by sync schema'); -      out += ' try { ';        if ($breakOnError) { -        out += 'var ' + ($valid) + ' ='; +        out += ' var ' + ($valid) + '; ';        } -      out += ' ' + (it.yieldAwait) + ' ' + (__callValidate) + '; } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; } '; +      out += ' try { ' + (it.yieldAwait) + ' ' + (__callValidate) + '; '; +      if ($breakOnError) { +        out += ' ' + ($valid) + ' = true; '; +      } +      out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; '; +      if ($breakOnError) { +        out += ' ' + ($valid) + ' = false; '; +      } +      out += ' } ';        if ($breakOnError) {          out += ' if (' + ($valid) + ') { ';        } diff --git a/node_modules/ajv/lib/dotjs/required.js b/node_modules/ajv/lib/dotjs/required.js index eb32aeae5..15b36bb7a 100644 --- a/node_modules/ajv/lib/dotjs/required.js +++ b/node_modules/ajv/lib/dotjs/required.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_required(it, $keyword) { +module.exports = function generate_required(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate_required(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $data = 'data' + ($dataLvl || '');    var $valid = 'valid' + $lvl; -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; @@ -39,7 +39,8 @@ module.exports = function generate_required(it, $keyword) {    }    if ($isData || $required.length) {      var $currentErrorPath = it.errorPath, -      $loopRequired = $isData || $required.length >= it.opts.loopRequired; +      $loopRequired = $isData || $required.length >= it.opts.loopRequired, +      $ownProperties = it.opts.ownProperties;      if ($breakOnError) {        out += ' var missing' + ($lvl) + '; ';        if ($loopRequired) { @@ -56,7 +57,11 @@ module.exports = function generate_required(it, $keyword) {          if ($isData) {            out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';          } -        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined; if (!' + ($valid) + ') break; } '; +        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; +        if ($ownProperties) { +          out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; +        } +        out += '; if (!' + ($valid) + ') break; } ';          if ($isData) {            out += '  }  ';          } @@ -98,15 +103,20 @@ module.exports = function generate_required(it, $keyword) {          out += ' if ( ';          var arr2 = $required;          if (arr2) { -          var _$property, $i = -1, +          var $propertyKey, $i = -1,              l2 = arr2.length - 1;            while ($i < l2) { -            _$property = arr2[$i += 1]; +            $propertyKey = arr2[$i += 1];              if ($i) {                out += ' || ';              } -            var $prop = it.util.getProperty(_$property); -            out += ' ( ' + ($data) + ($prop) + ' === undefined && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? _$property : $prop)) + ') ) '; +            var $prop = it.util.getProperty($propertyKey), +              $useData = $data + $prop; +            out += ' ( ( ' + ($useData) + ' === undefined '; +            if ($ownProperties) { +              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; +            } +            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';            }          }          out += ') {  '; @@ -182,7 +192,11 @@ module.exports = function generate_required(it, $keyword) {            }            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';          } -        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined) {  var err =   '; /* istanbul ignore else */ +        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; +        if ($ownProperties) { +          out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; +        } +        out += ') {  var err =   '; /* istanbul ignore else */          if (it.createErrors !== false) {            out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';            if (it.opts.messages !== false) { @@ -208,16 +222,21 @@ module.exports = function generate_required(it, $keyword) {        } else {          var arr3 = $required;          if (arr3) { -          var $reqProperty, i3 = -1, +          var $propertyKey, i3 = -1,              l3 = arr3.length - 1;            while (i3 < l3) { -            $reqProperty = arr3[i3 += 1]; -            var $prop = it.util.getProperty($reqProperty), -              $missingProperty = it.util.escapeQuotes($reqProperty); +            $propertyKey = arr3[i3 += 1]; +            var $prop = it.util.getProperty($propertyKey), +              $missingProperty = it.util.escapeQuotes($propertyKey), +              $useData = $data + $prop;              if (it.opts._errorDataPathProperty) { -              it.errorPath = it.util.getPath($currentErrorPath, $reqProperty, it.opts.jsonPointers); +              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); +            } +            out += ' if ( ' + ($useData) + ' === undefined '; +            if ($ownProperties) { +              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') ';              } -            out += ' if (' + ($data) + ($prop) + ' === undefined) {  var err =   '; /* istanbul ignore else */ +            out += ') {  var err =   '; /* istanbul ignore else */              if (it.createErrors !== false) {                out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } ';                if (it.opts.messages !== false) { diff --git a/node_modules/ajv/lib/dotjs/switch.js b/node_modules/ajv/lib/dotjs/switch.js deleted file mode 100644 index 18f17e487..000000000 --- a/node_modules/ajv/lib/dotjs/switch.js +++ /dev/null @@ -1,128 +0,0 @@ -'use strict'; -module.exports = function generate_switch(it, $keyword) { -  var out = ' '; -  var $lvl = it.level; -  var $dataLvl = it.dataLevel; -  var $schema = it.schema[$keyword]; -  var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -  var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -  var $breakOnError = !it.opts.allErrors; -  var $data = 'data' + ($dataLvl || ''); -  var $valid = 'valid' + $lvl; -  var $errs = 'errs__' + $lvl; -  var $it = it.util.copy(it); -  var $closingBraces = ''; -  $it.level++; -  var $nextValid = 'valid' + $it.level; -  var $ifPassed = 'ifPassed' + it.level, -    $currentBaseId = $it.baseId, -    $shouldContinue; -  out += 'var ' + ($ifPassed) + ';'; -  var arr1 = $schema; -  if (arr1) { -    var $sch, $caseIndex = -1, -      l1 = arr1.length - 1; -    while ($caseIndex < l1) { -      $sch = arr1[$caseIndex += 1]; -      if ($caseIndex && !$shouldContinue) { -        out += ' if (!' + ($ifPassed) + ') { '; -        $closingBraces += '}'; -      } -      if ($sch.if && it.util.schemaHasRules($sch.if, it.RULES.all)) { -        out += ' var ' + ($errs) + ' = errors;   '; -        var $wasComposite = it.compositeRule; -        it.compositeRule = $it.compositeRule = true; -        $it.createErrors = false; -        $it.schema = $sch.if; -        $it.schemaPath = $schemaPath + '[' + $caseIndex + '].if'; -        $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/if'; -        out += '  ' + (it.validate($it)) + ' '; -        $it.baseId = $currentBaseId; -        $it.createErrors = true; -        it.compositeRule = $it.compositeRule = $wasComposite; -        out += ' ' + ($ifPassed) + ' = ' + ($nextValid) + '; if (' + ($ifPassed) + ') {  '; -        if (typeof $sch.then == 'boolean') { -          if ($sch.then === false) { -            var $$outStack = $$outStack || []; -            $$outStack.push(out); -            out = ''; /* istanbul ignore else */ -            if (it.createErrors !== false) { -              out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } '; -              if (it.opts.messages !== false) { -                out += ' , message: \'should pass "switch" keyword validation\' '; -              } -              if (it.opts.verbose) { -                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -              } -              out += ' } '; -            } else { -              out += ' {} '; -            } -            var __err = out; -            out = $$outStack.pop(); -            if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -              if (it.async) { -                out += ' throw new ValidationError([' + (__err) + ']); '; -              } else { -                out += ' validate.errors = [' + (__err) + ']; return false; '; -              } -            } else { -              out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -            } -          } -          out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; '; -        } else { -          $it.schema = $sch.then; -          $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then'; -          $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then'; -          out += '  ' + (it.validate($it)) + ' '; -          $it.baseId = $currentBaseId; -        } -        out += '  } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } } '; -      } else { -        out += ' ' + ($ifPassed) + ' = true;  '; -        if (typeof $sch.then == 'boolean') { -          if ($sch.then === false) { -            var $$outStack = $$outStack || []; -            $$outStack.push(out); -            out = ''; /* istanbul ignore else */ -            if (it.createErrors !== false) { -              out += ' { keyword: \'' + ('switch') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { caseIndex: ' + ($caseIndex) + ' } '; -              if (it.opts.messages !== false) { -                out += ' , message: \'should pass "switch" keyword validation\' '; -              } -              if (it.opts.verbose) { -                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -              } -              out += ' } '; -            } else { -              out += ' {} '; -            } -            var __err = out; -            out = $$outStack.pop(); -            if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -              if (it.async) { -                out += ' throw new ValidationError([' + (__err) + ']); '; -              } else { -                out += ' validate.errors = [' + (__err) + ']; return false; '; -              } -            } else { -              out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -            } -          } -          out += ' var ' + ($nextValid) + ' = ' + ($sch.then) + '; '; -        } else { -          $it.schema = $sch.then; -          $it.schemaPath = $schemaPath + '[' + $caseIndex + '].then'; -          $it.errSchemaPath = $errSchemaPath + '/' + $caseIndex + '/then'; -          out += '  ' + (it.validate($it)) + ' '; -          $it.baseId = $currentBaseId; -        } -      } -      $shouldContinue = $sch.continue -    } -  } -  out += '' + ($closingBraces) + 'var ' + ($valid) + ' = ' + ($nextValid) + '; '; -  out = it.util.cleanUpCode(out); -  return out; -} diff --git a/node_modules/ajv/lib/dotjs/uniqueItems.js b/node_modules/ajv/lib/dotjs/uniqueItems.js index 2f27b0eea..d9b3185fc 100644 --- a/node_modules/ajv/lib/dotjs/uniqueItems.js +++ b/node_modules/ajv/lib/dotjs/uniqueItems.js @@ -1,5 +1,5 @@  'use strict'; -module.exports = function generate_uniqueItems(it, $keyword) { +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) {    var out = ' ';    var $lvl = it.level;    var $dataLvl = it.dataLevel; @@ -9,7 +9,7 @@ module.exports = function generate_uniqueItems(it, $keyword) {    var $breakOnError = !it.opts.allErrors;    var $data = 'data' + ($dataLvl || '');    var $valid = 'valid' + $lvl; -  var $isData = it.opts.v5 && $schema && $schema.$data, +  var $isData = it.opts.$data && $schema && $schema.$data,      $schemaValue;    if ($isData) {      out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; diff --git a/node_modules/ajv/lib/dotjs/validate.js b/node_modules/ajv/lib/dotjs/validate.js index 0c4112e1d..0ff9eda42 100644 --- a/node_modules/ajv/lib/dotjs/validate.js +++ b/node_modules/ajv/lib/dotjs/validate.js @@ -1,27 +1,21 @@  'use strict'; -module.exports = function generate_validate(it, $keyword) { +module.exports = function generate_validate(it, $keyword, $ruleType) {    var out = ''; -  var $async = it.schema.$async === true; +  var $async = it.schema.$async === true, +    $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), +    $id = it.self._getId(it.schema);    if (it.isTop) { -    var $top = it.isTop, -      $lvl = it.level = 0, -      $dataLvl = it.dataLevel = 0, -      $data = 'data'; -    it.rootId = it.resolve.fullPath(it.root.schema.id); -    it.baseId = it.baseId || it.rootId;      if ($async) {        it.async = true;        var $es7 = it.opts.async == 'es7';        it.yieldAwait = $es7 ? 'await' : 'yield';      } -    delete it.isTop; -    it.dataPathArr = [undefined];      out += ' var validate = ';      if ($async) {        if ($es7) {          out += ' (async function ';        } else { -        if (it.opts.async == 'co*') { +        if (it.opts.async != '*') {            out += 'co.wrap';          }          out += '(function* '; @@ -29,14 +23,87 @@ module.exports = function generate_validate(it, $keyword) {      } else {        out += ' (function ';      } -    out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; var vErrors = null; '; +    out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; +    if ($id && (it.opts.sourceCode || it.opts.processCode)) { +      out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; +    } +  } +  if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { +    var $keyword = 'false schema'; +    var $lvl = it.level; +    var $dataLvl = it.dataLevel; +    var $schema = it.schema[$keyword]; +    var $schemaPath = it.schemaPath + it.util.getProperty($keyword); +    var $errSchemaPath = it.errSchemaPath + '/' + $keyword; +    var $breakOnError = !it.opts.allErrors; +    var $errorKeyword; +    var $data = 'data' + ($dataLvl || ''); +    var $valid = 'valid' + $lvl; +    if (it.schema === false) { +      if (it.isTop) { +        $breakOnError = true; +      } else { +        out += ' var ' + ($valid) + ' = false; '; +      } +      var $$outStack = $$outStack || []; +      $$outStack.push(out); +      out = ''; /* istanbul ignore else */ +      if (it.createErrors !== false) { +        out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; +        if (it.opts.messages !== false) { +          out += ' , message: \'boolean schema is false\' '; +        } +        if (it.opts.verbose) { +          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +        } +        out += ' } '; +      } else { +        out += ' {} '; +      } +      var __err = out; +      out = $$outStack.pop(); +      if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +        if (it.async) { +          out += ' throw new ValidationError([' + (__err) + ']); '; +        } else { +          out += ' validate.errors = [' + (__err) + ']; return false; '; +        } +      } else { +        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; +      } +    } else { +      if (it.isTop) { +        if ($async) { +          out += ' return data; '; +        } else { +          out += ' validate.errors = null; return true; '; +        } +      } else { +        out += ' var ' + ($valid) + ' = true; '; +      } +    } +    if (it.isTop) { +      out += ' }); return validate; '; +    } +    return out; +  } +  if (it.isTop) { +    var $top = it.isTop, +      $lvl = it.level = 0, +      $dataLvl = it.dataLevel = 0, +      $data = 'data'; +    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); +    it.baseId = it.baseId || it.rootId; +    delete it.isTop; +    it.dataPathArr = [undefined]; +    out += ' var vErrors = null; ';      out += ' var errors = 0;     '; -    out += ' if (rootData === undefined) rootData = data;'; +    out += ' if (rootData === undefined) rootData = data; ';    } else {      var $lvl = it.level,        $dataLvl = it.dataLevel,        $data = 'data' + ($dataLvl || ''); -    if (it.schema.id) it.baseId = it.resolve.url(it.baseId, it.schema.id); +    if ($id) it.baseId = it.resolve.url(it.baseId, $id);      if ($async && !it.async) throw new Error('async schema in sync schema');      out += ' var errs_' + ($lvl) + ' = errors;';    } @@ -44,111 +111,160 @@ module.exports = function generate_validate(it, $keyword) {      $breakOnError = !it.opts.allErrors,      $closingBraces1 = '',      $closingBraces2 = ''; +  var $errorKeyword;    var $typeSchema = it.schema.type,      $typeIsArray = Array.isArray($typeSchema); -  if ($typeSchema && it.opts.coerceTypes) { -    var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); -    if ($coerceToTypes) { +  if ($typeIsArray && $typeSchema.length == 1) { +    $typeSchema = $typeSchema[0]; +    $typeIsArray = false; +  } +  if (it.schema.$ref && $refKeywords) { +    if (it.opts.extendRefs == 'fail') { +      throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); +    } else if (it.opts.extendRefs !== true) { +      $refKeywords = false; +      console.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); +    } +  } +  if ($typeSchema) { +    if (it.opts.coerceTypes) { +      var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); +    } +    var $rulesGroup = it.RULES.types[$typeSchema]; +    if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { +      var $schemaPath = it.schemaPath + '.type', +        $errSchemaPath = it.errSchemaPath + '/type';        var $schemaPath = it.schemaPath + '.type',          $errSchemaPath = it.errSchemaPath + '/type',          $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; -      out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') {  '; -      var $dataType = 'dataType' + $lvl, -        $coerced = 'coerced' + $lvl; -      out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; -      if (it.opts.coerceTypes == 'array') { -        out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; -      } -      out += ' var ' + ($coerced) + ' = undefined; '; -      var $bracesCoercion = ''; -      var arr1 = $coerceToTypes; -      if (arr1) { -        var $type, $i = -1, -          l1 = arr1.length - 1; -        while ($i < l1) { -          $type = arr1[$i += 1]; -          if ($i) { -            out += ' if (' + ($coerced) + ' === undefined) { '; -            $bracesCoercion += '}'; +      out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { '; +      if ($coerceToTypes) { +        var $dataType = 'dataType' + $lvl, +          $coerced = 'coerced' + $lvl; +        out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; '; +        if (it.opts.coerceTypes == 'array') { +          out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \'array\'; '; +        } +        out += ' var ' + ($coerced) + ' = undefined; '; +        var $bracesCoercion = ''; +        var arr1 = $coerceToTypes; +        if (arr1) { +          var $type, $i = -1, +            l1 = arr1.length - 1; +          while ($i < l1) { +            $type = arr1[$i += 1]; +            if ($i) { +              out += ' if (' + ($coerced) + ' === undefined) { '; +              $bracesCoercion += '}'; +            } +            if (it.opts.coerceTypes == 'array' && $type != 'array') { +              out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + ';  } '; +            } +            if ($type == 'string') { +              out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; +            } else if ($type == 'number' || $type == 'integer') { +              out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; +              if ($type == 'integer') { +                out += ' && !(' + ($data) + ' % 1)'; +              } +              out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; +            } else if ($type == 'boolean') { +              out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; +            } else if ($type == 'null') { +              out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; +            } else if (it.opts.coerceTypes == 'array' && $type == 'array') { +              out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; +            }            } -          if (it.opts.coerceTypes == 'array' && $type != 'array') { -            out += ' if (' + ($dataType) + ' == \'array\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + ';  } '; +        } +        out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) {   '; +        var $$outStack = $$outStack || []; +        $$outStack.push(out); +        out = ''; /* istanbul ignore else */ +        if (it.createErrors !== false) { +          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; +          if ($typeIsArray) { +            out += '' + ($typeSchema.join(",")); +          } else { +            out += '' + ($typeSchema);            } -          if ($type == 'string') { -            out += ' if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; -          } else if ($type == 'number' || $type == 'integer') { -            out += ' if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; -            if ($type == 'integer') { -              out += ' && !(' + ($data) + ' % 1)'; +          out += '\' } '; +          if (it.opts.messages !== false) { +            out += ' , message: \'should be '; +            if ($typeIsArray) { +              out += '' + ($typeSchema.join(",")); +            } else { +              out += '' + ($typeSchema);              } -            out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; -          } else if ($type == 'boolean') { -            out += ' if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; -          } else if ($type == 'null') { -            out += ' if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; -          } else if (it.opts.coerceTypes == 'array' && $type == 'array') { -            out += ' if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; +            out += '\' '; +          } +          if (it.opts.verbose) { +            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';            } +          out += ' } '; +        } else { +          out += ' {} ';          } -      } -      out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) {   '; -      var $$outStack = $$outStack || []; -      $$outStack.push(out); -      out = ''; /* istanbul ignore else */ -      if (it.createErrors !== false) { -        out += ' { keyword: \'' + ('type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; -        if ($typeIsArray) { -          out += '' + ($typeSchema.join(",")); +        var __err = out; +        out = $$outStack.pop(); +        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +          if (it.async) { +            out += ' throw new ValidationError([' + (__err) + ']); '; +          } else { +            out += ' validate.errors = [' + (__err) + ']; return false; '; +          }          } else { -          out += '' + ($typeSchema); +          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';          } -        out += '\' } '; -        if (it.opts.messages !== false) { -          out += ' , message: \'should be '; +        out += ' } else {  '; +        var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', +          $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; +        out += ' ' + ($data) + ' = ' + ($coerced) + '; '; +        if (!$dataLvl) { +          out += 'if (' + ($parentData) + ' !== undefined)'; +        } +        out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; +      } else { +        var $$outStack = $$outStack || []; +        $$outStack.push(out); +        out = ''; /* istanbul ignore else */ +        if (it.createErrors !== false) { +          out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';            if ($typeIsArray) {              out += '' + ($typeSchema.join(","));            } else {              out += '' + ($typeSchema);            } -          out += '\' '; -        } -        if (it.opts.verbose) { -          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +          out += '\' } '; +          if (it.opts.messages !== false) { +            out += ' , message: \'should be '; +            if ($typeIsArray) { +              out += '' + ($typeSchema.join(",")); +            } else { +              out += '' + ($typeSchema); +            } +            out += '\' '; +          } +          if (it.opts.verbose) { +            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; +          } +          out += ' } '; +        } else { +          out += ' {} ';          } -        out += ' } '; -      } else { -        out += ' {} '; -      } -      var __err = out; -      out = $$outStack.pop(); -      if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -        if (it.async) { -          out += ' throw new ValidationError([' + (__err) + ']); '; +        var __err = out; +        out = $$outStack.pop(); +        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ +          if (it.async) { +            out += ' throw new ValidationError([' + (__err) + ']); '; +          } else { +            out += ' validate.errors = [' + (__err) + ']; return false; '; +          }          } else { -          out += ' validate.errors = [' + (__err) + ']; return false; '; +          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';          } -      } else { -        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';        } -      out += ' } else {  '; -      var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', -        $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; -      out += ' ' + ($data) + ' = ' + ($coerced) + '; '; -      if (!$dataLvl) { -        out += 'if (' + ($parentData) + ' !== undefined)'; -      } -      out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } } '; -    } -  } -  var $refKeywords; -  if (it.schema.$ref && ($refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'))) { -    if (it.opts.extendRefs == 'fail') { -      throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '"'); -    } else if (it.opts.extendRefs == 'ignore') { -      $refKeywords = false; -      console.log('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); -    } else if (it.opts.extendRefs !== true) { -      console.log('$ref: all keywords used in schema at path "' + it.errSchemaPath + '". It will change in the next major version, see issue #260. Use option { extendRefs: true } to keep current behaviour'); +      out += ' } ';      }    }    if (it.schema.$ref && !$refKeywords) { @@ -164,6 +280,9 @@ module.exports = function generate_validate(it, $keyword) {        $closingBraces2 += '}';      }    } else { +    if (it.opts.v5 && it.schema.patternGroups) { +      console.warn('keyword "patternGroups" is deprecated and disabled. Use option patternGroups: true to enable.'); +    }      var arr2 = it.RULES;      if (arr2) {        var $rulesGroup, i2 = -1, @@ -225,9 +344,12 @@ module.exports = function generate_validate(it, $keyword) {              while (i5 < l5) {                $rule = arr5[i5 += 1];                if ($shouldUseRule($rule)) { -                out += ' ' + ($rule.code(it, $rule.keyword)) + ' '; -                if ($breakOnError) { -                  $closingBraces1 += '}'; +                var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); +                if ($code) { +                  out += ' ' + ($code) + ' '; +                  if ($breakOnError) { +                    $closingBraces1 += '}'; +                  }                  }                }              } @@ -239,7 +361,6 @@ module.exports = function generate_validate(it, $keyword) {            if ($rulesGroup.type) {              out += ' } ';              if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { -              var $typeChecked = true;                out += ' else { ';                var $schemaPath = it.schemaPath + '.type',                  $errSchemaPath = it.errSchemaPath + '/type'; @@ -247,7 +368,7 @@ module.exports = function generate_validate(it, $keyword) {                $$outStack.push(out);                out = ''; /* istanbul ignore else */                if (it.createErrors !== false) { -                out += ' { keyword: \'' + ('type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; +                out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \'';                  if ($typeIsArray) {                    out += '' + ($typeSchema.join(","));                  } else { @@ -298,57 +419,12 @@ module.exports = function generate_validate(it, $keyword) {        }      }    } -  if ($typeSchema && !$typeChecked && !$coerceToTypes) { -    var $schemaPath = it.schemaPath + '.type', -      $errSchemaPath = it.errSchemaPath + '/type', -      $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; -    out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') {   '; -    var $$outStack = $$outStack || []; -    $$outStack.push(out); -    out = ''; /* istanbul ignore else */ -    if (it.createErrors !== false) { -      out += ' { keyword: \'' + ('type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; -      if ($typeIsArray) { -        out += '' + ($typeSchema.join(",")); -      } else { -        out += '' + ($typeSchema); -      } -      out += '\' } '; -      if (it.opts.messages !== false) { -        out += ' , message: \'should be '; -        if ($typeIsArray) { -          out += '' + ($typeSchema.join(",")); -        } else { -          out += '' + ($typeSchema); -        } -        out += '\' '; -      } -      if (it.opts.verbose) { -        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -      } -      out += ' } '; -    } else { -      out += ' {} '; -    } -    var __err = out; -    out = $$outStack.pop(); -    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */ -      if (it.async) { -        out += ' throw new ValidationError([' + (__err) + ']); '; -      } else { -        out += ' validate.errors = [' + (__err) + ']; return false; '; -      } -    } else { -      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -    } -    out += ' }'; -  }    if ($breakOnError) {      out += ' ' + ($closingBraces2) + ' ';    }    if ($top) {      if ($async) { -      out += ' if (errors === 0) return true;           '; +      out += ' if (errors === 0) return data;           ';        out += ' else throw new ValidationError(vErrors); ';      } else {        out += ' validate.errors = vErrors; '; @@ -359,17 +435,24 @@ module.exports = function generate_validate(it, $keyword) {      out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';    }    out = it.util.cleanUpCode(out); -  if ($top && $breakOnError) { -    out = it.util.cleanUpVarErrors(out, $async); +  if ($top) { +    out = it.util.finalCleanUpCode(out, $async);    }    function $shouldUseGroup($rulesGroup) { -    for (var i = 0; i < $rulesGroup.rules.length; i++) -      if ($shouldUseRule($rulesGroup.rules[i])) return true; +    var rules = $rulesGroup.rules; +    for (var i = 0; i < rules.length; i++) +      if ($shouldUseRule(rules[i])) return true;    }    function $shouldUseRule($rule) { -    return it.schema[$rule.keyword] !== undefined || ($rule.keyword == 'properties' && (it.schema.additionalProperties === false || typeof it.schema.additionalProperties == 'object' || (it.schema.patternProperties && Object.keys(it.schema.patternProperties).length) || (it.opts.v5 && it.schema.patternGroups && Object.keys(it.schema.patternGroups).length))); +    return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImlementsSomeKeyword($rule)); +  } + +  function $ruleImlementsSomeKeyword($rule) { +    var impl = $rule.implements; +    for (var i = 0; i < impl.length; i++) +      if (it.schema[impl[i]] !== undefined) return true;    }    return out;  } diff --git a/node_modules/ajv/lib/keyword.js b/node_modules/ajv/lib/keyword.js index 1c9cccfe6..85e64c600 100644 --- a/node_modules/ajv/lib/keyword.js +++ b/node_modules/ajv/lib/keyword.js @@ -1,6 +1,6 @@  'use strict'; -var IDENTIFIER = /^[a-z_$][a-z0-9_$\-]*$/i; +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;  var customRuleCode = require('./dotjs/custom');  module.exports = { @@ -40,7 +40,7 @@ function addKeyword(keyword, definition) {        _addRule(keyword, dataType, definition);      } -    var $data = definition.$data === true && this._opts.v5; +    var $data = definition.$data === true && this._opts.$data;      if ($data && !definition.validate)        throw new Error('$data support: "validate" function is not defined'); @@ -50,7 +50,7 @@ function addKeyword(keyword, definition) {          metaSchema = {            anyOf: [              metaSchema, -            { '$ref': 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#/definitions/$data' } +            { '$ref': 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#' }            ]          };        } @@ -80,7 +80,8 @@ function addKeyword(keyword, definition) {        keyword: keyword,        definition: definition,        custom: true, -      code: customRuleCode +      code: customRuleCode, +      implements: definition.implements      };      ruleGroup.rules.push(rule);      RULES.custom[keyword] = rule; diff --git a/node_modules/ajv/lib/patternGroups.js b/node_modules/ajv/lib/patternGroups.js new file mode 100644 index 000000000..531a8d004 --- /dev/null +++ b/node_modules/ajv/lib/patternGroups.js @@ -0,0 +1,36 @@ +'use strict'; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-06/schema'; + +module.exports = function (ajv) { +  var defaultMeta = ajv._opts.defaultMeta; +  var metaSchemaRef = typeof defaultMeta == 'string' +                      ? { $ref: defaultMeta } +                      : ajv.getSchema(META_SCHEMA_ID) +                        ? { $ref: META_SCHEMA_ID } +                        : {}; + +  ajv.addKeyword('patternGroups', { +    // implemented in properties.jst +    metaSchema: { +      type: 'object', +      additionalProperties: { +        type: 'object', +        required: [ 'schema' ], +        properties: { +          maximum: { +            type: 'integer', +            minimum: 0 +          }, +          minimum: { +            type: 'integer', +            minimum: 0 +          }, +          schema: metaSchemaRef +        }, +        additionalProperties: false +      } +    } +  }); +  ajv.RULES.all.properties.implements.push('patternGroups'); +}; diff --git a/node_modules/ajv/lib/refs/$data.json b/node_modules/ajv/lib/refs/$data.json new file mode 100644 index 000000000..4a2edec55 --- /dev/null +++ b/node_modules/ajv/lib/refs/$data.json @@ -0,0 +1,17 @@ +{ +    "$schema": "http://json-schema.org/draft-06/schema#", +    "$id": "https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#", +    "description": "Meta-schema for $data reference (JSON-schema extension proposal)", +    "type": "object", +    "required": [ "$data" ], +    "properties": { +        "$data": { +            "type": "string", +            "anyOf": [ +                { "format": "relative-json-pointer" },  +                { "format": "json-pointer" } +            ] +        } +    }, +    "additionalProperties": false +} diff --git a/node_modules/ajv/lib/refs/json-schema-draft-06.json b/node_modules/ajv/lib/refs/json-schema-draft-06.json new file mode 100644 index 000000000..621cc5102 --- /dev/null +++ b/node_modules/ajv/lib/refs/json-schema-draft-06.json @@ -0,0 +1,150 @@ +{ +    "$schema": "http://json-schema.org/draft-06/schema#", +    "$id": "http://json-schema.org/draft-06/schema#", +    "title": "Core schema meta-schema", +    "definitions": { +        "schemaArray": { +            "type": "array", +            "minItems": 1, +            "items": { "$ref": "#" } +        }, +        "nonNegativeInteger": { +            "type": "integer", +            "minimum": 0 +        }, +        "nonNegativeIntegerDefault0": { +            "allOf": [ +                { "$ref": "#/definitions/nonNegativeInteger" }, +                { "default": 0 } +            ] +        }, +        "simpleTypes": { +            "enum": [ +                "array", +                "boolean", +                "integer", +                "null", +                "number", +                "object", +                "string" +            ] +        }, +        "stringArray": { +            "type": "array", +            "items": { "type": "string" }, +            "uniqueItems": true, +            "default": [] +        } +    }, +    "type": ["object", "boolean"], +    "properties": { +        "$id": { +            "type": "string", +            "format": "uri-reference" +        }, +        "$schema": { +            "type": "string", +            "format": "uri" +        }, +        "$ref": { +            "type": "string", +            "format": "uri-reference" +        }, +        "title": { +            "type": "string" +        }, +        "description": { +            "type": "string" +        }, +        "default": {}, +        "multipleOf": { +            "type": "number", +            "exclusiveMinimum": 0 +        }, +        "maximum": { +            "type": "number" +        }, +        "exclusiveMaximum": { +            "type": "number" +        }, +        "minimum": { +            "type": "number" +        }, +        "exclusiveMinimum": { +            "type": "number" +        }, +        "maxLength": { "$ref": "#/definitions/nonNegativeInteger" }, +        "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, +        "pattern": { +            "type": "string", +            "format": "regex" +        }, +        "additionalItems": { "$ref": "#" }, +        "items": { +            "anyOf": [ +                { "$ref": "#" }, +                { "$ref": "#/definitions/schemaArray" } +            ], +            "default": {} +        }, +        "maxItems": { "$ref": "#/definitions/nonNegativeInteger" }, +        "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, +        "uniqueItems": { +            "type": "boolean", +            "default": false +        }, +        "contains": { "$ref": "#" }, +        "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" }, +        "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, +        "required": { "$ref": "#/definitions/stringArray" }, +        "additionalProperties": { "$ref": "#" }, +        "definitions": { +            "type": "object", +            "additionalProperties": { "$ref": "#" }, +            "default": {} +        }, +        "properties": { +            "type": "object", +            "additionalProperties": { "$ref": "#" }, +            "default": {} +        }, +        "patternProperties": { +            "type": "object", +            "additionalProperties": { "$ref": "#" }, +            "default": {} +        }, +        "dependencies": { +            "type": "object", +            "additionalProperties": { +                "anyOf": [ +                    { "$ref": "#" }, +                    { "$ref": "#/definitions/stringArray" } +                ] +            } +        }, +        "propertyNames": { "$ref": "#" }, +        "const": {}, +        "enum": { +            "type": "array", +            "minItems": 1, +            "uniqueItems": true +        }, +        "type": { +            "anyOf": [ +                { "$ref": "#/definitions/simpleTypes" }, +                { +                    "type": "array", +                    "items": { "$ref": "#/definitions/simpleTypes" }, +                    "minItems": 1, +                    "uniqueItems": true +                } +            ] +        }, +        "format": { "type": "string" }, +        "allOf": { "$ref": "#/definitions/schemaArray" }, +        "anyOf": { "$ref": "#/definitions/schemaArray" }, +        "oneOf": { "$ref": "#/definitions/schemaArray" }, +        "not": { "$ref": "#" } +    }, +    "default": {} +} diff --git a/node_modules/ajv/lib/refs/json-schema-v5.json b/node_modules/ajv/lib/refs/json-schema-v5.json index 5964042bb..cc679a459 100644 --- a/node_modules/ajv/lib/refs/json-schema-v5.json +++ b/node_modules/ajv/lib/refs/json-schema-v5.json @@ -1,7 +1,7 @@  {      "id": "https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json#",      "$schema": "http://json-schema.org/draft-04/schema#", -    "description": "Core schema meta-schema (v5 proposals)", +    "description": "Core schema meta-schema (v5 proposals - deprecated)",      "definitions": {          "schemaArray": {              "type": "array", @@ -234,95 +234,17 @@                  { "$ref": "#/definitions/$data" }              ]          }, -        "formatMaximum": { -            "anyOf": [ -                { "type": "string" }, -                { "$ref": "#/definitions/$data" } -            ] -        }, -        "formatMinimum": { -            "anyOf": [ -                { "type": "string" }, -                { "$ref": "#/definitions/$data" } -            ] -        }, -        "formatExclusiveMaximum": { -            "anyOf": [ -                { -                    "type": "boolean", -                    "default": false -                }, -                { "$ref": "#/definitions/$data" } -            ] -        }, -        "formatExclusiveMinimum": { -            "anyOf": [ -                { -                    "type": "boolean", -                    "default": false -                }, -                { "$ref": "#/definitions/$data" } -            ] -        },          "constant": {              "anyOf": [                  {},                  { "$ref": "#/definitions/$data" }              ]          }, -        "contains": { "$ref": "#" }, -        "patternGroups": { -            "type": "object", -            "additionalProperties": { -                "type": "object", -                "required": [ "schema" ], -                "properties": { -                    "maximum": { -                        "anyOf": [ -                            { "$ref": "#/definitions/positiveInteger" }, -                            { "$ref": "#/definitions/$data" } -                        ] -                    }, -                    "minimum": { -                        "anyOf": [ -                            { "$ref": "#/definitions/positiveIntegerDefault0" }, -                            { "$ref": "#/definitions/$data" } -                        ] -                    }, -                    "schema": { "$ref": "#" } -                }, -                "additionalProperties": false -            }, -            "default": {} -        }, -        "switch": { -            "type": "array", -            "items": { -                "required": [ "then" ], -                "properties": { -                    "if": { "$ref": "#" }, -                    "then": { -                        "anyOf": [ -                            { "type": "boolean" }, -                            { "$ref": "#" } -                        ] -                    }, -                    "continue": { "type": "boolean" } -                }, -                "additionalProperties": false, -                "dependencies": { -                    "continue": [ "if" ] -                } -            } -        } +        "contains": { "$ref": "#" }      },      "dependencies": {          "exclusiveMaximum": [ "maximum" ], -        "exclusiveMinimum": [ "minimum" ], -        "formatMaximum": [ "format" ], -        "formatMinimum": [ "format" ], -        "formatExclusiveMaximum": [ "formatMaximum" ], -        "formatExclusiveMinimum": [ "formatMinimum" ] +        "exclusiveMinimum": [ "minimum" ]      },      "default": {}  } diff --git a/node_modules/ajv/lib/v5.js b/node_modules/ajv/lib/v5.js deleted file mode 100644 index 8f6e53f0f..000000000 --- a/node_modules/ajv/lib/v5.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -var META_SCHEMA_ID = 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/json-schema-v5.json'; - -module.exports = { -  enable: enableV5, -  META_SCHEMA_ID: META_SCHEMA_ID -}; - - -function enableV5(ajv) { -  var inlineFunctions = { -    'switch': require('./dotjs/switch'), -    'constant': require('./dotjs/constant'), -    '_formatLimit': require('./dotjs/_formatLimit'), -    'patternRequired': require('./dotjs/patternRequired') -  }; - -  if (ajv._opts.meta !== false) { -    var metaSchema = require('./refs/json-schema-v5.json'); -    ajv.addMetaSchema(metaSchema, META_SCHEMA_ID); -  } -  _addKeyword('constant'); -  ajv.addKeyword('contains', { type: 'array', macro: containsMacro }); - -  _addKeyword('formatMaximum', 'string', inlineFunctions._formatLimit); -  _addKeyword('formatMinimum', 'string', inlineFunctions._formatLimit); -  ajv.addKeyword('formatExclusiveMaximum'); -  ajv.addKeyword('formatExclusiveMinimum'); - -  ajv.addKeyword('patternGroups'); // implemented in properties.jst -  _addKeyword('patternRequired', 'object'); -  _addKeyword('switch'); - - -  function _addKeyword(keyword, types, inlineFunc) { -    var definition = { -      inline: inlineFunc || inlineFunctions[keyword], -      statements: true, -      errors: 'full' -    }; -    if (types) definition.type = types; -    ajv.addKeyword(keyword, definition); -  } -} - - -function containsMacro(schema) { -  return { -    not: { items: { not: schema } } -  }; -}  | 
