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

askr

v0.2.7

Published

A simple utility to ask questions on the command line with node.js.

Readme

askr Build Status Code Climate

A simple utility to ask questions on the command line with node.js.

Example

var
  ask = require('askr').ask,
  questions;

questions = {};

// Simple required question
//
// Hello there!
// What's your name?
questions.name = {
  text: 'Hello there!\nWhat\'s you name? ',
  required: true
};

// This question won't be called as the answer is already provided
// Useful when you gather some data before hand and want to ask more questions
// to fill in missing answers.
questions.age = {
  text: 'How old are you?'
};

// A question with options
// Will output the options at the end of the question into parenthesis
// separated by a comma.
// {{{options}}} in the text of the question to customise the display of the
// options.
// optionsSeparator to change the separator.
//
// Would you rather live in Paris or San Francisco?
questions.travel = {
  text: 'Would you rather live in {{{options}}}? ',
  optionsSeparator: ' or ',
  options: [
    'Paris',
    'San Francisco'
  ]
};

// A question with a default answer
// Will output the default at the end of the questions into brackets unless you
// provide a template with {{{default}}} in the text of the question.
//
// Do you like askr? [yes]
questions.like = {
  text: 'Do you like askr?',
  default: 'yes'
};
  
ask(questions, {age: 24}, function (err, answers) {
  // Do something with the answers
});

Usage

Questions

Questions are setup in a dictionary and answers are provided in another dictionary with the same keys as the questions.

var questions = {
  q1: { ... },
  q2: { ... },
  ...
};

Question

A question is an object with various keys.

  • text (required, string): the body of the question,
  • required (boolean): whether the question is required; will keep asking the question until it gets an answer,
  • optionsSeparator (string): the separator for displaying the options list,
  • options (array): the options list from which to choose an answer; will keep asking the question until it gets an answer matching one of the options,
  • default (string): the default value when there is no answer provided.
var question = {
  text: 'Question body ',
  required: true,
  optionsSeparator: ',',
  options: ['y', 'n'],
  default: 'n'
};

Options and default

Control the display of the options and default.
By default options are displayed at the end of the question into parenthesis.
The placement of the options can be changed using {{{options}}} in the question text.
The options are automatically concatenated using a comma. This can be changed by providing the option optionsSeparator to the question dictionary.
By default default is displayed at the end of the question into brackets.
The placement of the default can be changed using {{{default}}} in the question text.

Then this is the default question template when options and default are provided

'Question body ({{{options}}}) [{{{default}}}] ';

Already answered questions

If some answers are already answered, they can be provided as the second argument of the ask function.

Ask questions

ask(questions, callback);
ask(questions, givenAnswers, callback);

The callback takes two arguments:

var callback = function (err, answers) {
  ...
};