/contracts

Primary LanguageJavaScript

contracts

Library for https://en.wikipedia.org/wiki/Design_by_contract

Example

import { asserts, decorators, contract } from 'contracts';

class Robot {
    constructor( name ) {
        asserts.string( 'Robot#constructor', name );
        this.name = name;
    }
    
    @decorators.post( 'Robot#say length', x => x.length > 0 )
    say() {
        return `Hi! My name is ${this.name}`;
    }
    
    @decorators.pre( 'Robot#goTo direction', direction => [ 'up', 'down', 'left', 'right' ].includes( direction ) )
    @decorators.pre( 'Robot#goTo distance', ( x, distance ) => distance > 0 )
    goTo( direction, distance ) {
        contract`Distance must be < 10${ distance < 10}`;
        return 42;
    }
}

new Robot( 42 ); // Throw exception '[ContractError]: Expected string, but given "42", with type "number". Robot#constructor'
( new Robot( 'Logo' ) ).goTo( 'south', 10 ) // Throw exception '[ContractError]: Robot#goTo direction'
( new Robot( 'Logo' ) ).goTo( 'up', -1 ) // Throw exception '[ContractError]: Robot#goTo distance'
( new Robot( 'Logo' ) ).goTo( 'up', 11 ) // Throw exception '[ContractError]: Distance must be < 10'
( new Robot( 'Logo' ) ).goTo( 'down', 7 ) // Return 42

Install

API

Precondition

import { decorators } from 'contracts';
@decorators.pre( 'Message', () => { ... } )