Skip to content

Add AnyOf assert#276

Open
josecarlosbrandao wants to merge 1 commit intofeature/add-one-of-assertfrom
feature/add-any-of-assert
Open

Add AnyOf assert#276
josecarlosbrandao wants to merge 1 commit intofeature/add-one-of-assertfrom
feature/add-any-of-assert

Conversation

@josecarlosbrandao
Copy link
Contributor

@josecarlosbrandao josecarlosbrandao commented Feb 12, 2026

Add new assert to allow any of constraints (1 or more matches)

Added this here because https://github.com/uphold/paypal-client/pull/60 required this type of validation to have more readable code

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new AnyOf assert to validator.js-asserts to allow validating that a value matches at least one of multiple constraint sets (similar to existing OneOf, but allowing multiple matches).

Changes:

  • Introduced AnyOf assert implementation that short-circuits on first matching constraint set and aggregates violations otherwise.
  • Exported AnyOf from the library entrypoint and updated the exported-asserts ordering/count test.
  • Added TypeScript typings and a dedicated test suite for AnyOf.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
test/index.test.js Updates exported asserts count and expected ordering to include AnyOf.
test/asserts/any-of-assert.test.js Adds comprehensive tests for AnyOf behavior and violation reporting.
src/types/index.d.ts Adds TS typing for anyOf(...constraintSets) on the asserts interface.
src/index.js Exports the new AnyOf assert in stable alphabetical order.
src/asserts/any-of-assert.js Implements the new AnyOf assert using validator.validate with deepRequired.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@cristianooliveira cristianooliveira left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the README

@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from ffc4601 to 76221ba Compare February 19, 2026 10:07
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from 80183db to c488d6c Compare February 19, 2026 10:11
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from 76221ba to ea44b70 Compare February 19, 2026 10:14
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from c488d6c to 5878602 Compare February 19, 2026 10:14
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from ea44b70 to cca021b Compare February 19, 2026 10:18
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from 5878602 to 39fab7e Compare February 19, 2026 10:18
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from cca021b to 039afc7 Compare February 19, 2026 10:23
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from 39fab7e to c8af1a3 Compare February 19, 2026 10:24
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from 039afc7 to 4f96195 Compare February 19, 2026 10:33
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from c8af1a3 to ced70bf Compare February 19, 2026 10:34
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from 4f96195 to 6a7d98b Compare February 20, 2026 11:56
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from ced70bf to 819a49c Compare February 20, 2026 11:56
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-one-of-assert branch from 6a7d98b to 2fbe1f3 Compare February 24, 2026 12:32
@josecarlosbrandao josecarlosbrandao force-pushed the feature/add-any-of-assert branch from 819a49c to d7c2806 Compare February 24, 2026 12:33
Comment on lines +28 to +38
this.validator = new Validator();

/**
* Validation algorithm.
*/

this.validate = value => {
const violations = [];

for (const constraintSet of constraintSets) {
const result = this.validator.validate(value, new Constraint(constraintSet, { deepRequired: true }));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
this.validator = new Validator();
/**
* Validation algorithm.
*/
this.validate = value => {
const violations = [];
for (const constraintSet of constraintSets) {
const result = this.validator.validate(value, new Constraint(constraintSet, { deepRequired: true }));
/**
* Validation algorithm.
*/
this.validate = value => {
const violations = [];
for (const constraintSet of constraintSets) {
const result = constraintSet.validate(value, new Constraint(constraintSet, { deepRequired: true }));

From my point of view, I’d use it like this, just a dummy example:

validate(someObject, { 
  foobar: is.anyOf(is.ofLength({ max: 254 }), is.ofLength({ min: 10 }))
})

So if I’m seeding an instance of is.ofLength({ max: 254 }) into the constraints set, this method returns an object that has a validate method, so no need to redeclare new Validator(); everytime we want to do any of.

I should be able to call it directly like this, right? is.ofLength({ max: 254 }).validate(value);

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

Successfully merging this pull request may close these issues.

4 participants