$mol_data
Defines static typed DTO with strict runtime validation and user friendly error messages like:
["friends"][0]["phone"] undefined is not any of variants
undefined is not a string
undefined is not a number
Known parsers
Usage examples
Entities
const PersonDTO = $mol_data_record({
name : $mol_data_string ,
age : $mol_data_optional( $mol_data_integer ) ,
birthday : $mol_data_pipe( $mol_data_string , $mol_time_moment ) ,
})
const UserDTO = $mol_data_record({
... PersonDTO.config,
phone: $mol_data_variant( $mol_data_string , $mol_data_integer ),
mail: $mol_data_email,
})
const jin = UserDTO({
name : 'Jin' ,
age : 33 ,
birthday : '1984-08-04T12:00:00Z' ,
phone : 791234567890,
mail : 'foo@example.org' ,
})
function printName( user : typeof UserDTO.Value ) {
console.log( user.name )
}
printName( jin )
const json = {
name : 'Jin' ,
age : 33 ,
birthday : '1984-08-04T12:00:00Z' ,
phone : 791234567890,
mail : '</script>' ,
} as any
printName( UserDTO( json ) )
Units
const { Weight, Length } = $mol_data_tagged({
Weight: $mol_data_integer,
Length: $mol_data_integer,
})
Length( 20 )
let len = Length( 10 )
let kg: typeof Weight.Value = Weight( 1000 )
len = 20
let num: number = len
len = Length( Weight( 20 ) )
len = Weight( 20 )
len = Length( 20.1 )
(De)Serialization
const Duration = $mol_data_pipe(
$mol_data_variant(
$mol_data_string ,
$mol_data_integer ,
) ,
$mol_time_duration ,
)
JSON.stringify( Duration( 'P1D' ) )
JSON.stringify( Duration( 1000 ) )
Custom runtypes
const Password = $mol_data_setup( ( val: string ) => {
const str = $mol_data_string( val )
if( str.length >= 8 ) return str
return $mol_fail(
new $mol_data_error( `${ val } have length less than 8` )
)
} )
Password( 123 )
Password( 'qwerty' )
Password( 'qwertyuiop' )
const MinLength = ( minLength = 8 )=> $mol_data_setup( ( val: string ) => {
const str = $mol_data_string( val )
if( str.length >= minLength ) return str
return $mol_fail(
new $mol_data_error( `${ val } have length less than ${minLength}` )
)
}, minLength )
const Password = MinLength(8)
Password( 123 )
Password( 'qwerty' )
Password( 'qwertyuiop' )
Usage from NPM
npm install mol_data_all
import {
$mol_data_tagged as Tagged,
$mol_data_integer as Integer,
} from "mol_data_all"
const { Age } = Tagged({ Age: Integer })
let age = Age( 17 )
age = Age( age + 1 )
More complex example.
Similar projects