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

@olaolum/scaffy

v1.1.2

Published

This is a simple CLI tool that allows you to bootstrap your projects with your own custom configuration. Sure we have CRA, and whatever the Vue equivalent of that is, but sometimes we have configuration files we would like to reuse. For instance, eslint,

Readme

Scaffy

Logo

Description

Configuring tools can suck. That's why we customize them once, then store them in some repo for reuse. This works, but most tools require a set of dependencies, alongside your custom configurations, to work. This can be a pain, but scaffy is here to help.

I built scaffy because I didn't enjoy constantly browsing for the right combination of dependencies to get my configurations to work. Furthermore, I'd sometimes use other people's configs but they would almost always get buried in my abyss of Github stars/bookmarks which would make searching for them such a hassle.

But with scaffy, I can aggregate all related dependencies and configurations under an alias and, with that alias, bootstrap my projects with a single command.

Demo

Built with :boxing_glove:

Scaffy is built with Typescript and it is meant to be used as a standalone CLI utility

Perquisites

Scaffy doesn't ask much :smile:. All it needs is for node (v16+) and npm to be installed

Installation

  npm i -g @olaolum/scaffy

Configuration

Taking inspiration from the tsconfig.json, any json file that ends in .scaffy.json is a valid configuration file.

Scaffy will search the root of your project directory for a your configuration file. If it stumbles upon many, it will give you the option to choose.

The schema for the configuration file is as follows:

interface ConfigSchema {
  [name: string]: {
    readonly extends:
      | string
      | {
          readonly from: string;
          readonly merge: (
            | 'depNames'
            | 'devDepNames'
            | 'remoteConfigurationUrls'
            | 'localConfigurationPaths'
          )[];
        };
    depNames?: string[];
    devDepNames?: string[];
    remoteConfigurationUrls?: string[];
    localConfigurationPaths?: string[];
  };
}

The schema above states that each entry in the scaffy configuration file must be given a name. This name can be anything you desire, literally anything-you-desire. The names are naught but a means by which scaffy groups dependencies and configuration files.

All entry members are optional, but at least one member must be valid for the entry to not be ignored.

Here is an example scaffy config entry

{
  "some-other-config": {
    "devDepNames": ["eslint@latest", "[email protected]"]
  },
  "cra-eslint": {
    "extends": "some-other-config",
    "devDepNames": ["eslint-plugin-better-styled-components", "eslint-plugin-prettier"],
    "remoteConfigurationUrls": [
      "https://raw.githubusercontent.com/OlaoluwaM/planets-facts-challenge/main/.eslintrc.js",
      "https://raw.githubusercontent.com/OlaoluwaM/planets-facts-challenge/main/.prettierrc"
    ]
  }
}

You can also add version information like @latest or specific version number like @7.3.0 to any of the dependencies listed in the depNames or devDepNames options

Additionally, in the spirit of DRY, scaffy allows you to extend other configs in whole or in part. When extending one entry from another, a merge will occur with all properties of the entries involved (excluding the merging of the extends property of course).

To have an entry extend from another, simply add an extends key to the extending entry with the value being the name of the entry to be extended from. An example has been provided above

For more specific extensions, where you only wish to extend part of an entry, scaffy's got your back with that too! Here is an example

{
  "sample-parent": {
    "devDepNames": ["eslint", "jest"],
    "remoteConfigurationUrls": [
      "https://raw.githubusercontent.com/OlaoluwaM/configs-deperacated-/master/jsconfig.json"
    ]
  },

  "extending-entry": {
    "extends": {
      "from": "sample-parent",
      "merge": ["devDepNames", "remoteConfigurationUrls"]
    },
    "devDepNames": ["zod"],
    "depNames": ["eslint-plugin-react", "emotion", "yup"],
    "remoteConfigurationUrls": [
      "https://raw.githubusercontent.com/OlaoluwaM/configs/old-do-not-delete/typescript/.eslintrc.js"
    ],
    "localConfigurationPaths": ["../local-configs/.prettierrc"]
  }
}

Here, we have the entry extending-entry extending only the devDepNames and remoteConfigurationUrls from the sample-parent entry

Usage

With the example configuration above, here is how scaffy is used

  # To bootstrap cra-eslint we can do
  scaffy bootstrap cra-eslint

  # If we feel cra-eslint doesn't do what we want we can remove it using
  scaffy remove cra-eslint

  # For the version
  scaffy -v

  # You can also specify a config file with the following option
  scaffy bootstrap cra-eslint -c ./example.scaffy.json

  # You can get more info run
  scaffy -h

LICENSE

Copyright © 2022 Olaoluwa Mustapha Released under the MIT license.