npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

kontrakt

v1.1.0

Published

A functional contract library for Javascript

Downloads

4

Readme

kontrakt

A functional contract library for Javascript.

Even though examples on this page will use ES6 features for brevity, this library does not require it and is backwards compatible with earlier versions.

Installation

npm install kontrakt --save

Basic use

Call kontrakt(opts)(fn) to get a wrapper function that will inject constraints into any given function.

var kontrakt = require('kontrakt'),
    fn = function(x) { return x + 2 }

var fn2 = kontrakt({
    pre: function(x) {
      return x < 2
    },
    post: function(x, y) {
      return y > 0
    }
})(fn)

fn2(0) // works
fn2(-3) // throws a kontrakt.CalleeViolation
fn2(4)  // throws a kontrakt.CallerViolation

Constraint functions should be pure functions that return boolean values. A falsy return value from a constraint function is interpreted as a contract violation, and a suitable error will be thrown. Errors thrown from constraints are either instances of CalleeViolation or CallerViolation, indicating respectively that either the calling code or called function is to blame.

Both pre- and post-constraints are optional. A pre-constraint receives all arguments given in the function call as parameters. A post-constraint will receive the function return value as the first argument, followed by original function call parameters.

Combinators

A set of combinators is included in kontrakt/combinators module. These include the most basic combinators:

The and() combinator subjects all argument constraint return values to the boolean AND operation and returns the result. or() combinator works in similar fashion, using a boolean OR operator instead. Both combinators accept 1-N constraint functions as arguments.

The not() combinator inverts the return value from any one constraint function.

const kontrakt = require('kontrakt'),
    { and, or } = require('kontrakt/combinators'),
    gt = (x) => (y) => x > y,
    lt = (x) => (y) => x > y,
    fn = (x) => x + 2

const fn2 = kontrakt({
    pre: and(
      gt(2),
      lt(5)
    ),
    post: or(
      lt(-2),
      gt(10)
    )
})(fn)