validata
Version:
Type safe data validation and sanitization
88 lines (70 loc) • 2.57 kB
text/typescript
import { isArray } from '../array';
import { asBoolean, isBoolean } from '../boolean';
import { asNumber, isNumber } from '../number';
import { isObject } from '../object';
import { isRecord } from '../record';
import { asString, isString, maybeString } from '../string';
import { isTuple } from '../tuple';
import { isIssue } from '../types';
import { asNullable, isNullable } from './../common';
import { TypeOf } from './../types';
const sampleContract = {
maybeString: maybeString(),
myString: isString(),
numericString: asString(),
};
const sample = isObject(sampleContract);
export type SampleContract = TypeOf<typeof sample>;
interface Sample {
maybeString?: string | undefined;
myString: string;
numericString: string;
}
type SameType<T, U> = T[] extends U[] ? U[] extends T[] ? true : false : false
export type ThisIsTrue = SameType<SampleContract, Sample>;
console.log(JSON.stringify(sample.process({
maybeString: 123,
myString: 123,
numericString: 123,
})));
console.log(JSON.stringify(sample.process({
myString: '123',
numericString: 123,
})));
const sample2 = isArray(isNumber({ min: 17 }), {
minLength: 1,
});
console.log(JSON.stringify(sample2.process([])));
console.log(JSON.stringify(sample2.process([1])));
console.log(sample2.process([102, 123]));
console.log(JSON.stringify(sample2.process([new Date()])));
const result = sample2.process([new Date()]);
if (isIssue(result)) {
console.log('Issues', result.issues);
} else {
console.log('Accepted value', result.value);
}
const sample3 = isBoolean();
const sample31 = asBoolean();
console.log(JSON.stringify(sample3.process(true)));
console.log(JSON.stringify(sample31.process('true')));
const sample4 = isTuple([
isNumber(),
asString(),
]);
console.log(JSON.stringify(sample4.process(['foo', 'bar'])));
console.log(sample4.process([102, '123']));
console.log(sample4.process([102, 123])); // same as above because of asString
console.log(JSON.stringify(sample4.process([345])));
console.log(JSON.stringify(sample4.process([1, 2, 3])));
const sample5 = isRecord(asNumber());
console.log(JSON.stringify(sample5.process({ foo: 'bar' })));
console.log(sample5.process({ foo: '123' }));
console.log(sample5.process({ foo: 123 })); // same as above because of asNumber
const sample6 = isNullable(isString());
console.log(sample6.process(null));
console.log(sample6.process('asd'));
const sample7 = asNullable(isString(), { default: null });
console.log(sample7.process(null));
console.log(sample7.process('asd'));
console.log(sample7.process(undefined));