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

aha-io-oauth

v0.0.4

Published

A node wrapper to assist in Aha.io's OAuth flow

Readme

Aha.io OAuth2 Wrapper for Javascript

NPM package for fascilitating the OAuth2 flow for the AHA.io API.

Getting Started

Install the NPM package.

$ npm install aha-io-oauth --save

Require the package in your application.

var AhaOAuthClient = require('aha-io-oauth');

Create an App

To start one will need to obtain a client ID and secret. This is done by creating an application in your Aha account at a URL similar to the one below:

https://yourdomain.aha.io/oauth/applications/

Initialization

The OAuth client is instantiated by passing in the Client ID and Secret (as well as your organizations subdomain) that you generated in the previous step.

let ahaOAuth = new AhaOAuthClient(
    process.env.AHA_CLIENT_ID,
    process.env.AHA_CLIENT_SECRET,
    process.env.AHA_SUBDOMAIN
)

Generating the Auth URL

To start the OAuth process, one needs to generate a link to present to the user that will take them to Aha to authorize

let ahaAuthUrl = ahaOAuth.authorizeUri( 'http://example.com/aha/oauth', {
    responseType: 'code',
    state: `${some-id}`
})

Generating a Token

After the user authenticates and authorizes your application by following the link generated in the previous step, Aha will call your Redirect URI. Below is a simple express app for generating an OAuth token.

const express = require('express')
const app = express()
const port = 3000
app.get('/aha/oauth', async (req, res) => {
    const { code, state } = req.query
    await ahaOAuth.authorize({
    	  code: code,
    	  redirectUri: 'http://example.com/aha/oauth'
    })
    const token = ahaOAuth.token()
    // do something with the token
})
app.listen(port, () => console.log(`Examplee app listening on port ${port}!`))

Instantiate a new client. Currently the wrapper uses basic HTTP authentication, so this requires a username, password, your AHA subdomain and an optional options object. In the options you can pass {useSubdomain: false} if you want to use secure.aha.io subdomain instead of your-subdomain.aha.io.

// If you want to specify an API key when creating a client
var client = AhaIO('username', 'password', 'subdomain');

You can also use AHA's secure.aha.io. The subdomain is always required for authentication purposes.

var client = AhaIO('username', 'password', 'subdomain', { useSubdomain: false });