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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@crtr9/runaway

v1.1.2

Published

Foregoing the use of a full-featured task-runner for developing JS applications in favor of simple npm scripts is becoming more and more common. For good reason: *it's simple.*

Downloads

4

Readme

:ghost: Runaway! - NPM Scripts Manager

Foregoing the use of a full-featured task-runner for developing JS applications in favor of simple npm scripts is becoming more and more common. For good reason: it's simple.

The Problem: Any reasonably sized project ends up needing a lot of script commands to lint, build, transpile, optimize, etc., etc. Having an undocumented list of commands in your package.json quickly becomes cumbersome.

A Solution: Runaway! is a very simple way to manage the list of scripts in your package.json. It's not complex. It's not something you couldn't build yourself in an hour or two. But hey, it's here. And I'm writing the documentation so you don't have to keep explaining it to your team.

By organizing your script com/mands in individual .js files, you're able to provide code-level documentation on what's happening and why. All Runaway! does is rewrite the scripts: {} section of your package.json based on the "command files" it finds.

Brief Example

Partial package.json prior to running Runaway!

{
  "scripts": {}
}

(Yes, it's a bit of a contrived example, what with being empty.)

./runaway/build.js

module.exports = {
  command: "tsc src/main.js"
};

Now we run Runaway!

npx runaway --rebuild

Partial package.json after Runningaway! (See what I did there?)

{
  "scripts": {
    "build": "tsc src/main.js"
  }
}

Getting Started

npm install --save-dev @crtr9/runaway  

Or Yarn. If you're using Yarn, I'm sure you already know what to do. :)

It's worth noting that you could npm install -g. However, with the availability of the npx command, it makes more sense to me to install Runaway! as a dev dependency rather than a global. To each their own.

When Runaway! finishes installing, you can get started quickly with:

npx runaway --init

This will create the .runaway/ and .runaway/.bindirectory and initialize a sample command file and .bin script. Depending on your learning style, you can jump in and take a look at those files or you can continue reading the docs.

Also, you can go take a look in the example/ directory for a slightly more involved example than what --init sets you up with.

Documentation

Available Commands/Options

--init

Initializes the basic directory structure and files for using Runaway!

--rebuild

Rebuilds the script: {} section of your package.json with what's discovered in the .runaway/ directory.

--help

Does what you'd expect.

.runaway/ directory

Runaway! asks that you organize your command files in a .runaway/ folder in the root of your project.

<your-project-directory>/
    src/
    package.json
    
    .runaway/  <-- This one right here.  

Command files are simple. At their minimum, they're expected to expose an object with a command property.

Presuming you want to make a command called npm run build (or yarn build) you'd create a build.js file inside .runaway/

<your-project-directory>/
    ...

    .runaway/
        build.js

build.js needs to export an object that has a string command property representing what gets put into your package.json

.runaway/build.js

module.exports = {
    command: "tsc src/main.js"  
};  

Rebuilding package.json

Unfortunately package.json is a JSON file and we can't crawl the .runaway/ directory automatically. If it were package.js we certainly could, and that'd be great because doing so would eliminate the --rebuild command, but as I'm sure you know by now, the world is against you -- it's a scary place. That why you have to... (yes, I'm doing it) Runaway! :grimacing: :woman_facepalming:

Since that happened... Runaway! provides a command for rebuilding the package.json based off what it finds in .runaway/. That command is as follows:

npx runaway --rebuild

The need to run --rebuild means that whenever you change or add command files, you'll have to rerun --rebuild. Again, yes, it's less than ideal. Maybe it's possible to hook into npm run and run rebuild automatically? If y'all know anything about this, make a PR or log an issue, that way we can remove this entire documentation section which also means the joke will disappear as well.

After running --rebuild if you open up your package.json you should see the scripts: {} section reflect what's in .runaway/.

A note on command names

The name of the command that ends up in package.json matches the name of the file that supplied it. build.js turns into npm run build. If you're not a fan of this, you're able to specify a specific name for the command with the name property.

.runaway/build.js

module.exports = {
    command: "tsc src/main.js",
    name: "build/typescript"
};  

.runaway/.bin Directory

Often you need to write small scripts that do fairly specific things for your build process. There's no reason you couldn't just write a command like:

.runaway/do-something.js

module.exports = {
    command: "node build-utils/my-custom-script.js"  
}  

But you've already organized your "build stuff" in .runaway/ so why not those custom scripts too?

Runaway! supports calling custom scripts in the .runaway/.bin/ directory with a nice little shorthand syntax.

Make a new directory .bin/ inside the .runaway/ directory, and move your my-custom-script.js into it.

<your-project-directory>/
    .runaway/ .bin/my-custom-script.js

Now you can change your script command:

.runaway/build.js

module.exports = {
    command: "runaway!my-custom-script.js"  
}  

When you --rebuild, Runaway! will replace "runaway!" with node .runaway/.bin/

Is this necessary? Absolutely not. But it's nice.