Détail du package

mol_data_all

jin4.2k1.1.1511

Defines static typed DTO with strict runtime validation and user friendly error messages like:

$mol_data_all, $mol_data, $mol, $mol_data_array

readme

$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

// Base Type
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 ) ,
})

// Derived Type
const UserDTO = $mol_data_record({
    ... PersonDTO.config,
    phone: $mol_data_variant( $mol_data_string , $mol_data_integer ),
    mail: $mol_data_email,
})

// Ensure this is a User
const jin = UserDTO({
    name : 'Jin' ,
    age : 33 ,
    birthday : '1984-08-04T12:00:00Z' ,
    phone : 791234567890,
    mail : 'foo@example.org' ,
})

// typeof jin === {
//     readonly name: string;
//     readonly age?: number | undefined;
//     readonly birthday: $mol_time_moment;
//     readonly phone: string | number;
//     readonly mail: string;
// }

// Allow only Users
function printName( user : typeof UserDTO.Value ) {
    console.log( user.name )
}

printName( jin )

// Wrong json from server
const json = {
    name : 'Jin' ,
    age : 33 ,
    birthday : '1984-08-04T12:00:00Z' ,
    phone : 791234567890,
    mail : '</script>' , // !
} as any

// Runtime error: ["mail"] </script> is not a /.+@.+/
printName( UserDTO( json ) )

Units

const { Weight, Length } = $mol_data_tagged({
    Weight: $mol_data_integer,
    Length: $mol_data_integer,
})

Length( 20 ) // Validate
let len = Length( 10 ) // Inferred type
let kg: typeof Weight.Value = Weight( 1000 ) // Explicit type

len = 20 // Implicit Cast
let num: number = len // Implicit Cast
len = Length( Weight( 20 ) ) // Explicit Cast

len = Weight( 20 ) // Compile time error
len = Length( 20.1 ) // Run time error

(De)Serialization

const Duration = $mol_data_pipe(
    $mol_data_variant(
        $mol_data_string ,
        $mol_data_integer ,
    ) ,
    $mol_time_duration ,
)

JSON.stringify( Duration( 'P1D' ) ) // "P1DT"
JSON.stringify( Duration( 1000 ) ) // "PT1S"

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 ) // ❌ 123 is not a string
Password( 'qwerty' ) // ❌ qwerty have length less than 8
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 ) // ❌ 123 is not a string
Password( 'qwerty' ) // ❌ qwerty have length less than 8
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