• Stars
    star
    233
  • Rank 172,230 (Top 4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 8 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

clojure.spec for Javascript

js.spec

clojure.spec for Javascript

Latest build Coverage Status npm version

logo

There is clojure.spec, a part of Clojure's core library that is intended to help with specification, testing and error messages. I recommend you to read the linked rationale, you will get the gist even without knowledge of Clojure. In any case here's my best attempt of a summary:

In a dynamic language like Javascript or Clojure it is common to represent information with data. For instance, you could encode the score of a soccer match with a list of two integers [0, 1]. (In a statically typed language like Java the idiomatic way would be an instance of a SoccerScore class.) This data is passed around between modules of your code or sent to external systems, yet the knowledge about what this list of integers stands for is not available anywhere. Maybe you described it in the project's documentation, which is likely outdated. Most probably it is implicitly assumed in your code (var goals_scored = score[0] + score[1];). If the semantics change (e.g. list contains also teams), your code breaks.

One way to mitigate this is by static analysis tools (Flow) or typed languages (Typescript), but they only get you so far. For instance they don't work at runtime (duh!) and offer limited expressiveness. (They also need more tooling, but that's another story.) So what you're left with is manual parsing and checking, which is repetitive and half-assed at worst (if (!Array.isArray(score)) ...), and non-standard at best, ie. there is no way for users of your function to know where exactly their provided input failed your specification.

Another issue is that schemas get more popular in the Javascript community (JSON Schema, React.PropTypes...), yet there is no uniform way to define them. Error messages differ from system to system. You can't port your schemas, but need to define them multiple times in different syntax.

js.spec tries to solve those problems.

Usage

For a quick usage example see example.js. Otherwise please refer to the documentation.

Documentation

https://prayerslayer.gitbooks.io/js-spec/content/

Installation

npm install js.spec

This will install the current release candidate, as there is no 1.0 yet.

If you want to include it into a web page directly via script, please use the UMD build like this:

<script src="./js.spec.bundle.js" charset="utf-8"></script>
<script type="text/javascript">
  const {spec, valid} = window['js.spec']
  const foo = spec.map("foo", {
    name: spec.string
  })
  alert(valid(foo, {name: 'hugo'}))
</script>

Implementation Status

The 0.0.x published versions should be seen as developer previews. Code may or may not work. API may or may not witness breaking changes.

  • Specs
    • ✅ Primitives
    • ✅ Map
    • ✅ Collection
    • Combination
      • ✅ And
      • ✅ Or
    • ✅ Tuple
    • ✅ Nilable
    • ✅ Enum
  • ✅ Spec Registry Removed after discussion in #21
  • 🚧 Spec Regexes (cat, alt, *, ?, +)
  • 😰 Generator Functions
  • 😫 Function Specs (Not even sure if it's possible the way it works in clojure.spec)

Why not use Clojurescript?

If you already thought about using CLJS, go ahead. clojure.spec is already available there. However if you meant to pull in CLJS as a dependency: clojure.spec is macro-heavy. Macros exist only at compile-time, so all the "functions" (they are macros) are gone.

License

MIT, see LICENSE

More Repositories

1

zxing-wasm

zxing-cpp compiled to Web Assembly
JavaScript
17
star
2

koa-prometheus

Collects simple API metrics and outputs them in prometheus format. Works with koa-router.
JavaScript
9
star
3

zalando-graphql-relay

A small Relay app working with a GraphQL wrapper around the Zalando REST API.
JavaScript
8
star
4

quickdraw-ico

Generate inline SVG icons from "Quick, Draw!" data
HTML
7
star
5

glitch

Image in, corrupted image out
Rust
5
star
6

bpmnio-zoom-control-example

Demo to build custom zoom controls for a BPMN.io viewer
JavaScript
3
star
7

TUD_ADBS_SS12_Timebased

Entwicklung des zeitbasierten Sampling Algorithmus für die ADBS Übung im Sommersemester 2012 an der TU Dresden.
C++
2
star
8

temple.js

Super-simple templating on steroids.
JavaScript
2
star
9

correct-calculator

JS-based calculator with math functions proven by Coq
JavaScript
2
star
10

underlines

A Medium-style underline creator
HTML
1
star
11

react-ssr

Toy app that searches Github repos, with server-side rendering support.
JavaScript
1
star
12

scrape-a-ball

Scraper for basketball-reference.com
JavaScript
1
star
13

travel-with-spotify

Create a playlist from a location
TypeScript
1
star
14

traffic-map

Plotting open data for fun(?)
Python
1
star
15

radio

Wifi Radio w/ Pi + Arduino
Arduino
1
star
16

dotfiles

Configuration files
Shell
1
star
17

material-grid

Bootstrap-compatible, responsive grid adhering to the Material Design spec
HTML
1
star
18

go-tcp

A HTTP/1.0 web server on top of syscalls in Golang. For learning only.
Go
1
star
19

elm-js-promises

Elm Flickr Example with JS Promises
JavaScript
1
star
20

SCPlaylist

A jQuery plugin that turns a bunch links to SC tracks on your website into a simple playlist, regardless of their DOM position.
JavaScript
1
star