Skip to content

Commit

Permalink
feat: use a schema as when condition
Browse files Browse the repository at this point in the history
  • Loading branch information
vonagam committed Feb 3, 2019
1 parent d02ff5e commit f94498c
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 5 deletions.
17 changes: 13 additions & 4 deletions src/Condition.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ function callOrConcat(schema) {
return base => base.concat(schema);
}

function makeIsFn(refs, predicate) {
return refs.length < 2 ? predicate : (...values) => values.every(predicate);
}

class Conditional {
constructor(refs, options) {
let { is, then, otherwise } = options;
Expand All @@ -26,10 +30,15 @@ class Conditional {
'either `then:` or `otherwise:` is required for `when()` conditions',
);

let isFn =
typeof is === 'function'
? is
: (...values) => values.every(value => value === is);
let isFn;

if (typeof is === 'function') {
isFn = is;
} else if (isSchema(is)) {
isFn = makeIsFn(this.refs, value => is.isValidSync(value));
} else {
isFn = makeIsFn(this.refs, value => value === is);
}

this.fn = function(...values) {
let currentSchema = values.pop();
Expand Down
29 changes: 28 additions & 1 deletion test/mixed.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
import { array, mixed, string, number, object, ref, reach, bool } from '../src';
import {
array,
mixed,
string,
number,
object,
ref,
reach,
bool,
boolean,
ValidationError,
} from '../src';
let noop = () => {};

function ensureSync(fn) {
Expand Down Expand Up @@ -701,6 +712,22 @@ describe('Mixed Types ', () => {
inst.default().should.eql({ prop: undefined });
});

it('should handle conditionals with schema as condition', async function() {
let inst = object({
flag: mixed(),
prop: number().when('flag', {
is: boolean(),
then: number().min(5),
}),
});

await inst.validate({ flag: 'hello', prop: 4 }).should.be.fulfilled();

await inst
.validate({ flag: true, prop: 4 })
.should.be.rejectedWith(ValidationError, /must be greater than/);
});

it('should use label in error message', async function() {
let label = 'Label';
let inst = object({
Expand Down

0 comments on commit f94498c

Please sign in to comment.