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

xns

v2.0.7

Published

Execute a JavaScript function

Readme

xns

Turn any function into a script that can be invoked from the command line.

xns stands for eXecute Node Script!

Problem

Let's say you have written a cool JavaScript (or TypeScript) function!

get-bitcoin-price.ts:

import got from 'got';

export default async (): Promise<string> => {
  const res = await got('https://api.coinbase.com/v2/prices/spot');
  const {currency, amount} = JSON.parse(res.body).data;
  return `1 Bitcoin is worth ${currency} ${amount}`;
};

Now you would like to execute this function in your terminal. Current options are not ideal:

  • You could make the function self-invoking, but then it also executes by itself as soon as it's imported somewhere else.
  • You could make another file, import the function and execute it, then run that file, but it's cumbersome.

Solution

Wrap your function in xns():

get-bitcoin-price.ts:

import xns from 'xns';
import got from 'got';

export default xns(async (): Promise<string> => {
  const res = await got('https://api.coinbase.com/v2/prices/spot');
  const {currency, amount} = JSON.parse(res.body).data;
  return `1 Bitcoin is worth ${currency} ${amount}`;
});

Now you can execute the function from your terminal:

ts-node get-bitcoin-price
1 Bitcoin is worth USD 7767.655

You can also still import the function from somewhere else as usual and it will not execute itself 👌

Why xns?

  • Works with node and transpiled languages: ts-node, babel-node...
  • Can still be imported as normal
  • Prints out the return value
  • Fully typed, keep Typescript typings
  • Wrapping function in xns does not change behavior of your app
  • Exit code 1 on error, exit code 0 on success, perfect for CRON jobs
  • No Unhandled promise rejection errors, proper catch handler built in
  • Works with synchronous and asynchronous functions
  • Works with ES Modules and CommonJS import style
    • Use named export for CommonJS: const {xns} = require('xns')

Old version of xns

This is version 2 of xns. Version 1 worked completely different, it compiled a file using babel and called the default export. It's still supported if you have Babel. See here for the old API.

License

MIT

Author

Jonny Burger