import createValidator = require('../') /** Static assertion that `value` has type `T` */ // Disable tslint here b/c the generic is used to let us do a type coercion and // validate that coercion works for the type value "passed into" the function. // tslint:disable-next-line:no-unnecessary-generics function assertType(value: T): void {} const input = null as unknown const nullValidator = createValidator({ type: 'null' }) if (nullValidator(input)) { assertType(input) } assertType(nullValidator.errors) assertType(nullValidator.errors[0]) assertType(nullValidator.errors[0].field) assertType(nullValidator.errors[0].message) assertType(nullValidator.errors[0].type) assertType(nullValidator.errors[0].value) const numberValidator = createValidator({ type: 'number' }) if (numberValidator(input)) { assertType(input) } const stringValidator = createValidator({ type: 'string' }) if (stringValidator(input)) { assertType(input) } const personValidator = createValidator({ type: 'object', properties: { name: { type: 'string' }, age: { type: 'number' }, }, required: [ 'name' ] }) if (personValidator(input)) { assertType(input.name) assertType(input.age) input.age === undefined input.age === 1 } const namesValidator = createValidator({ type: 'array', items: { type: 'string' } }) if (namesValidator(input)) { assertType(input.length) assertType(input[0]) } const boxValidator = createValidator({ type: 'object', properties: { name: { type: 'string' }, items: { type: 'array', items: { type: 'boolean' } }, }, required: [ 'name', 'items', ] }) if (boxValidator(input)) { assertType(input.name) assertType(input.items.length) assertType(input.items[0]) } const matrixValidator = createValidator({ type: 'array', items: { type: 'array', items: { type: 'number' } } }) if (matrixValidator(input)) { assertType(input[0][0]) } const userValidator = createValidator({ type: 'object', properties: { name: { type: 'string' }, items: { type: 'array', items: { type: 'string' } }, }, required: [ 'name', 'items', ] }) if (userValidator(input)) { assertType(input.name) assertType(input.items.length) assertType(input.items[0]) } const user2Validator = createValidator({ type: 'object', properties: { name: { type: 'object', properties: { first: { type: 'string' }, last: { type: 'string' }, }, required: [ 'last' as 'last' ] }, items: { type: 'array', items: { type: 'string' }, } }, required: [ 'name' ] }) if (user2Validator(input)) { assertType<{ first: string | undefined, last: string }>(input.name) assertType(input.name.first) assertType(input.name.last) if (input.items !== undefined) { assertType(input.items.length) assertType(input.items[0]) } }