Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pattern does not work when use a regexp with attributes #387

Open
yhojann-cl opened this issue Sep 1, 2023 · 1 comment
Open

pattern does not work when use a regexp with attributes #387

yhojann-cl opened this issue Sep 1, 2023 · 1 comment

Comments

@yhojann-cl
Copy link

yhojann-cl commented Sep 1, 2023

By example:

const jsonschema = require('jsonschema');

const results = (new jsonschema.Validator()).validate(
  { uuid: 'f9d15cc5-1a53-4733-9ae7-f1675c8428a7' }, // Object to validate
  { // Schema
    type: 'object',
    properties: {
      uuid: {
        type: 'string',
        pattern: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
      }
    },
    required: [ 'uuid' ]
  },
  { required: true, allowUnknownAttributes: false }); // Settings

console.log(results.errors);

Says:

[
    ValidationError {
      path: [Array],
      property: 'instance.uuid',
      message: 'does not match pattern "/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i"',
      schema: [Object],
      instance: 'f9d15cc5-1a53-4733-9ae7-f1675c8428a7',
      name: 'pattern',
      argument: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
      stack: 'instance.uuid does not match pattern "/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i"'
    }
  ]

But the expression and value are valid:

$ node
Welcome to Node.js v18.16.1.
Type ".help" for more information.
> 'f9d15cc5-1a53-4733-9ae7-f1675c8428a7'.match(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i)
[
  'f9d15cc5-1a53-4733-9ae7-f1675c8428a7',
  index: 0,
  input: 'f9d15cc5-1a53-4733-9ae7-f1675c8428a7',
  groups: undefined
]
@yhojann-cl
Copy link
Author

I found the problem in lib/attribute.js:687:

/**
 * Validates whether the instance value matches the regular expression, when the instance value is a string.
 * @param instance
 * @param schema
 * @return {String|null}
 */
validators.pattern = function validatePattern (instance, schema, options, ctx) {
  if (!this.types.string(instance)) return;
  var result = new ValidatorResult(instance, schema, options, ctx);
  var pattern = schema.pattern;
  try {
    var regexp = new RegExp(pattern, 'u');
  } catch(_e) {
    // In the event the stricter handling causes an error, fall back on the forgiving handling
    // DEPRECATED
    regexp = new RegExp(pattern);
  }
  if (!instance.match(regexp)) {
    result.addError({
      name: 'pattern',
      argument: schema.pattern,
      message: "does not match pattern " + JSON.stringify(schema.pattern.toString()),
    });
  }
  return result;
};

The code var regexp = new RegExp(pattern, 'u'); override the i modificator as case sensitive ignore.

    regexp = new RegExp(pattern);
  }
  console.log(regexp); // <<-- Test output final regexp
  if (!instance.match(regexp)) {
  • The old regexp: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • The new regexp: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/u

In the examples says can use regexp in plain method https://github.com/tdegrunt/jsonschema/blob/master/examples/all.js#L207 :

"validatePattern2": {
      "type": "string",
      "pattern": /str/
    },

But the documentation does not indicate that in these cases you can or cannot use modifiers like case insensitive in pattern object.

@yhojann-cl yhojann-cl changed the title Regexp does not work for strings validation pattern does not work when use a regexp representation with attributes Sep 1, 2023
@yhojann-cl yhojann-cl changed the title pattern does not work when use a regexp representation with attributes pattern does not work when use a regexp with attributes Sep 1, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant