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

checkmark

v0.1.2

Published

A tiny library that may ease writing tests and debugging code a bit

Downloads

34

Readme

checkmark Build Status

A tiny library that may ease writing tests and debugging code a bit.

The primary motivation for the creation of checkmark was to help more easily write automated tests (especially for asynchronous code). However, in general, the library could be useful in all testing or debugging scenarios, as well as in production code. ` It acts as a counter by tracking the number of invocations of an utility function that checkmark provides which you can call at particular points in your code.

Checkmark is tiny in code size, has no dependencies, and can be used in different environmens (CommonJS, AMD, or as a global in the browser) thanks to utilizing the UMD pattern.

Installation

npm (Node.js)

npm install checkmark

Bower

bower install checkmark

Usage

CommonJS (Node.js)

var Checkmark = require("checkmark");

var check = new Checkmark(count, callback);

AMD

require(["checkmark"], function(Checkmark) {
  var check = new Checkmark(count, callback);
});

Browser (exposed as a global)

<script src="checkmark.js"></script>
<script>
  var check = new Checkmark(count, callback);
</script>

API (by example)

  // Create a checkmark function
  //   Argument 1 (count): positive integer (required)
  //   Argument 2 (callback): function (optional); will be invoked when target count is reached
  //   Will throw Error when target count exceeded
  var check = new Checkmark(4, function callback() {
    // when this callback gets called
    // the target of 4 counts will have been just reached
  });

  // get current count value
  check.getCount(); // => 0

  // mark 1
  check();
  check.getCount(); // => 1
  check.getCalls(); // => [ null ]

  // mark 2, with message
  check("2nd mark with message");
  check.getCount(); // => 2
  check.getCalls(); // => [ null, "2nd mark with message" ]

  // mark 3, with data
  check({ message: "3rd mark", now: Date.now() });
  check.getCount(); // => 3
  check.getCalls(); // => [ null, "2nd mark with message", { message: "3rd mark", now: "..." } ]

  // mark 4
  check(); // callback gets called
  check.getCount(); // => 4
  check.getCalls(); // => [ null, "2nd mark with message", { message: "3rd mark", now: "..." }, null ]

  // mark 5, after target has been reached
  check(); // throws Error
  check.getCount(); // => 4
  check.getCalls(); // => [ null, "2nd mark with message", { message: "3rd mark", now: "..." }, null ]

Usage examples

Mocha test (for Sails.js)

decribe("User", function() {
  it("password should be at least 8 characters", function(done) {
    var check = new Checkmark(3, done);
    
    expect(User).to.exist.and.be.an("object");
    check();

    User.create({ password: '1234567' }).exec(function(err, user) {
      expect(err).to.exist;
      expect(user).to.not.exist;
      check();
    });

    User.create({ password: '12345678' }).exec(function(err, user) {
      expect(err).to.not.exist;
      expect(user).to.be.an("object");
      check();
    });
  });
});

Mocha test (for Sails.js)

decribe("Article", function() {
  it("Factory-created article is valid and can be persisted", function(done) {
    var log = new Checkmark(3, function() {
      console.log(log.getCalls()); // for debugging purposes
      done();
    });

    var article = new Factory("article", "Some title", "Some content");

    expect(article).to.exist;
    expect(article).to.be.an("object");
    expect(article).to.have.property("title", "Some title");
    expect(article).to.have.property("content", "Some content");
    log("article was created");

    Article.validate(article, function(err) {
      expect(err).to.not.exist;
      log("article is valid");
    });

    article.save(function(err) {
      expect(err).to.not.exist;
      log("article was persisted");      
    });
  });
});

Wait for two async functions to complete

var result1 = null;
var result2 = null;

var check = new Checkmark(2, function() {
  // both callbacks below have finished executing
  // use result1 and result2
});

asyncFunction1(function(result) {
  // callback for asyncFunction1 has been called
  // ...
  result1 = result;
  check();
});

asyncFunction2(function(result) {
  // callback for asyncFunction2 has been called
  // ...
  result2 = result;
  check();
});

Wait for two async functions to complete

var data = [1, 23, 7, 4, 563, ... ];
var middle = data.length / 2;
var data1 = data.slice(0, middle); // first half of data
var data2 = data.slice(middle, data.length); // second half of data

var callback = new Checkmark(2, function() {
  var count = callback.getCalls();
  // count[0] holds the result from the function that completed first
  // count[1] holds the result from the function that completed second

  console.log('Total count:', count[0] + count[1]);
});

// Imagine these execute in different threads
// so that we achieve some parallelization.
// In general, they may take different
// amount of time to complete.
primeCountAsync(data1, callback); // get the number of prime numbers within data1 array
primeCountAsync(data2, callback); // get the number of prime numbers within data2 array

Ensure an event does not happen more than N times (with jQuery)

var registerEvent = new Checkmark(3);

$(function() {
  $(".vote-button").on("click", function(event) {
    try {
      registerEvent(event);
      submitVote($(this).data("item-id"));
    } catch (e) {
      showUserNotification("You can vote up to 3 times only.");
    }
  });
});

Contributing

Any feedback or pull requests are welcome.

See CONTRIBUTING.md file for more information.

License and Author

MIT © 2014 Radko Dinev

See LICENSE file.