Topiarist provides tree and shape-based type verification for JavaScript.
JavaScript
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
src
test
.eslintrc
.gitignore
.travis.yml
LICENSE
README.md
ie8-shims.js
karma-debug.conf.js
karma-saucelabs.conf.js
karma.conf.js
package.json
test-performance.js
thirdparty-lib.manifest

README.md

Topiarist

Topiarist provides tree and shape-based type verification for JavaScript.

Build Status

You can read the introductory blog post for more information.

A Note on implementation

This library makes liberal use of nonenumerable attributes and Object.getPrototypeOf. It is therefore suitable only for Ecmascript 5 engines. It will work in Ecmascript 6 engines but there would be a much nicer implementation in that case, using Map and private symbols.

Getting It

In Node.js:

npm install --save topiarist

then:

var topiarist = require('topiarist');

For the browser, download the latest release, and refer to it from your script tag:

<script type="text/javascript" src="dist/topiarist.js"></script>

Usage

This library provides the following action methods:

  • topiarist.extend(subclass, superclass) which implements classical single inheritance by setting up the prototype chain.
  • topiarist.implement(class, interface) which declares a classes intention to implement an interface, where verification is delayed until after the class has been finalized.
  • topiarist.hasImplemented(class, interface) which declares that a class implements an interface and throws an exception if it does not.
  • topiarist.inherit(class, parent) which provides multiple inheritance by copying functionality from the parent to the class.
  • topiarist.mixin(class, mixin) which provides mixin inheritance, sandboxing mixin methods that are copied onto the class.

and the following query methods:

  • topiarist.isA(instance, parent) which returns true if the instance is of a type which has been declared to be descended from the parent, e.g. because it's extended or implemented or mixed-in.
  • topiarist.classIsA(class, parent) which returns true if the class has been declared to be descended from the parent, e.g. through extension, implementation, etc.
  • topiarist.fulfills(instance, interface) which returns true if the instance supports everything on the interface.
  • topiarist.classFulfills(class, interface) which returns true if instances of the class will be created supporting everything on the interface.

The following convenience methods are also provided:

  • topiarist.install() which copies the appropriate methods onto the Function and Object prototype, renaming them where appropriate. This lets you do things like Subclass.extends(Superclass)
  • topiarist.exportTo() which copies the appropriate methods onto the global object so they can be accessed directly.