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 🙏

© 2026 – Pkg Stats / Ryan Hefner

expressive-test-util

v0.0.2

Published

Utilities for writing promise-based asynchronous code used by expressive-test

Readme

expressive-test-util

A set of utility functions used by expressive-test. Are all of these necessary? Might there already be something else out there that does exactly this? No and probably, but having these made me less frustrated while writing Javascript and writing the routines was faster than searching for existing solutions, so here we are.

Installation

Using npm:

npm install expressive-test-util

API

This module exports the following top-level properties:

exec

The exec module includes utility routines related to executing other processes.

It exports the following functions:

exec.exec(command)

Parameters

  • command: String The command to execute

Return Value

Returns a promise. When the promise resolves, the resolved value is an object containing the following properties:

  • stdout: String Anything the process wrote to standard out
  • stderr: String Anything the process wrote to standard error

If the promise rejects, stdout and stderr are provided as properties on the error.

Description

Spawns a shell and executes command. This is a wrapper for child_process.exec that returns a promise instead of requiring a callback.

exec.quote(str)

Parameters

  • str: String The value to quote

Return Value

Returns a string containing str wrapped in single quotes.

Description

Wraps the provided value in single quotation marks ('). Any single quote characters in the input are escaped in Unix shell style. Specifically, any instance of ' is replaced with the value '"'"'.

This is useful for sanitizing values to pass to exec.

file

The file module includes utility routines for working with the file system.

It exports the following functions:

file.access(path, mode)

Parameters

  • path: String Path to the directory or file to test
  • mode: Integer The access permissions to test. May be a value from fs.constants or an OR (|) of two or more values.

Return Value

A promise. If the promise resolves, the tested mode is available. Otherwise, it rejects.

Description

Tests the current user's permissions for a file or directory. This is a wrapper for fs.access that returns a promise instead of requiring a callback.

file.exists(path)

Parameters

  • path: String Path to the directory or file to test

Return Value

Returns a promise. If a file or directory exists at the given path, resolves true. Otherwise, it resolves false. It only rejects if an error other than ENOENT occurred, such as a device or name too long error.

Description

Tests for the existence of a file or directory at the given path.

file.isDirectory(path)

Parameters

  • path: String Path to the directory or file to test

Return Value

Returns a promise. If a directory exists at the given path, resolves true. If no file exists at path or it is not a directory, resolves false.

Description

Tests for a directory at the given path.

file.readdir(path)

Parameters

  • path: String Path to the directory to read

Return Value

Returns a promise. The resolve value of the promise is an array containing the names of the files in the directory, excluding . and ...

Description

Reads the contents of a directory at the given path. This is a wrapper for fs.readdir that returns a promise instead of requiring a callback.

file.rmdir(path)

Parameters

  • path: String Path to the directory to remove

Return Value

Returns a promise that resolves when the directory is removed.

Description

Removes the directory named by path. The provided path must be a directory an must be empty. This is a wrapper for fs.rmdir.

file.rmTree(path)

Parameters

  • path: String Path to the file or directory to remove

Return Value

Returns a promise that resolves when all files at path have been removed.

Description

Recursively removes the contents of the file system at path. If path is a regular file, it is removed. If path is a directory, it's contents are first removed and then it is removed. Any error encountered will result in a rejection. Unlike fs.rmdir, all errors are reported and no retries are attempted.

file.stat(path)

Parameters

  • path: String Path to the file or directory to retrieve information on

Return Value

Returns a promise that resolves to an fs.Stats object.

Description

Returns information about the file or directory at path. This is a wrapper for fs.stat.

file.unlink(path)

Parameters

  • path: String Path to the file to remove

Return Value

Returns a promise that resolves when the file is removed.

Description

Removes the file at path. The provided path must be a file, not a directory. This is a wrapper for fs.unlink.

promise

The promise module includes utility routines for working with promises.

It exports the following functions:

promise.asPromise(fn)

Parameters

  • fn: Function A function that invokes a callback-style asynchronous function.

    fn is called with the the following parameters:

    • callback: Function A function which accepts an error as its first argument and a result as the second.

    Any value returned by fn is ignored.

Return Value

A promise which resolves to the result passed to callback. If callback is passed an error, the promise rejects with that error.

Description

This is an alternative to util.promisify. Instead of defining a promisified function, it invokes a callback style function immediately and makes its outcome available as a promise.

For example, to read the contents of a file, you could do the following:

let contents = await promise.asPromise(callback => fs.readFile('/etc/hosts', 'utf8', callback));

promise.promiseEach(items, fn)

Parameters

  • items: Array A list of inputs to iterate over

  • fn: Function A function that will be invoke for each item.

    For each entry in items, fn is invoked with the following parameters:

    • item: Any The current item being processed

    If fn returns a promise, the next item will not be processed until it resolves. If a returned promise rejects, promiseEach also rejects.

Return Value

A promise. When the promise resolves, its value is the value of the last item in the list or undefined for an empty list.

Description

A utility for performing a collection of asynchronous work serially. It chains the items in the collection together as a series of promises. This makes it possible to invoke a list of promises one at a time. It can also be used to call functions that may result in either a promise or a value one after another.

As an example, here is how you could use promiseEach to make three post requests one after the other:

const put = util.promisify(request.put);

const docs = [
  {path: 'one', content: {message: 'hello'}},
  {path: 'two', content: {see: '/one'}},
  {path: 'three', content: {see: '/two'}}
];

promise.promiseEach(docs, (doc) => {
  return put(`http://example.com/${doc.path}`, {json: doc.content});
});

promise.withinTimeout(ms, promise)

Parameters

  • ms: Integer Time limit for promise to resolve in milliseconds
  • promise: Promise The promise to await

Return Value

Returns a promise. If the promise passed to the function resolves before time expires, the returned promise resolves with its value. If it rejects or time elapses, the returned promise rejects.

Description

Awaits a promise for up to ms milliseconds. If the promise does not resolve within ms milliseconds, it rejects with the error 'Timed out'.

string

The string module includes utility routines for working with strings. It is inspired by functionality in the Rails Inflector module.

It exports the following functions:

string.pluralize(str)

Parameters

  • str: String The value to pluralize

Return Value

A string containing the (hopefully) pluralized version of the input.

Description

Attempts to pluralize an input string using simple English pluralization rules. This appends an "s" to the input. It correctly handles the case for words that end in a "ch", "s", "y", or "x". It does not handle any other exceptions, so don't expect a correct plural for "deer", "fish", or "tooth".

string.underscore(str)

Parameters

  • str: String The value to format

Return Value

A string containing the underscore formatted version of the input.

Description

Formats a name using lower case underscore-separated formatting. This is intended for converting camel case or dash-separated names into an underscore equivalent. For example, the input 'FooBar' would be returned as 'foo_bar'.