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

loop

v3.3.6

Published

loop through commands in fun and amazing ways!

Downloads

10,185

Readme

loop

Build Status

loop expands commands to work simultaneously against any number of subdirectories in your current working path. Want to perform a git status on 15 projects at once? With loop, you can do it!

    loop executes a command against child directories within its current working directory

    usage:

      loop [command]                                      - execute a command against all child dirs
      loop ["command with multiple words in quotes"]      - execute a multi-word command against all child dirs
      loop --cwd ../other/working/directory               - execute a command against all child dirs, setting the working directory to another directory
      loop --include comma,delimited,list,of,dirs         - execute a command against all child dirs including a number of directories which might otherwise be ignored, for instance, in .looprc
      loop --include-only comma,delimited,list,of,dirs    - execute a command against all child dirs, ignoring .looprc, and only including the specified directories
      loop --include-pattern 'regexp'                     - execute a command against all child dirs that match the regular expression
      loop --exclude comma,delimited,list,of,dirs         - execute a command against all child dirs, excluding the specified directories
      loop --exclude-only comma,delimited,list,of,dirs    - execute a command against all child dirs, excluding only the specified directories
      loop --exclude-pattern 'regexp'                     - execute a command against all child dirs, excluding directories that match the regular expression
      loop --init                                         - creates a .looprc in the current working directory

    examples:

      loop pwd
      loop "git status"
      loop "git checkout -b feature/new-feature"
      loop "git push origin feature/new-feature"

    .looprc:

      directories containing a .looprc json file may have extra behavior, determined by properties within the file:

        ignore (type Array) any child directory names listed in ignore will be ignored and skipped from execution

    example .looprc:

    {
      "ignore": [ ".git", ".vagrant", ".vscode", "ansible", "node_modules", "scripts" ]
    }

Installation

npm install -g loop

Basic Usage

loop installs a loop command which you can leverage from the command line, in your package.json scripts, etc. The syntax is super simple. Just loop [your command]. If the command you wish to run consists of multiple words, place the command in quotes: loop "your --you | really -R | long -o | command".

In a folder with the following structure:

./git
./bin
./lib
./node_modules
./test
./index.js
./package.json

executing loop pwd yields the following results:

➜  nycnode-site git:(master) loop pwd

.git
/Users/mateodelnorte/development/nycnode/nycnode-site/.git

lib
/Users/mateodelnorte/development/nycnode/nycnode-site/lib

node_modules
/Users/mateodelnorte/development/nycnode/nycnode-site/node_modules

test
/Users/mateodelnorte/development/nycnode/nycnode-site/test

.looprc

loop can use a .looprc file to customize how loop behaves in a particular folder. Installing a .looprc file to a folder is simple:

loop --init results in the following file being created:

{
  "ignore": [ ".git", ".vagrant", ".vscode", "node_modules" ]
}

Now, when we perform the same command we did previously loop pwd, loop will recognize the .looprc file and see the .git folder is ignored - excluding it from the results:

➜  nycnode-site git:(master) loop pwd

lib
/Users/mateodelnorte/development/nycnode/nycnode-site/lib

node_modules
/Users/mateodelnorte/development/nycnode/nycnode-site/node_modules

test
/Users/mateodelnorte/development/nycnode/nycnode-site/test

On to the Fun Stuff

Neat, so now we can ignore folders that we don't work with directly. Imagine having a folder that contains all your project repositories for work. Wish you could find out how many files are in each?

➜  nycnode git:(master) ✗ loop "find . -path ./node_modules -prune -o -type f  | wc -l"

nycnode-denormalizer
125

nycnode-meetup-ingestor
148

nycnode-site
1106

nycnode-user-ingestor
103

nycnode-youtube-ingestor
81

Better yet, what if you're starting a new feature that spans a distributed system composed of many microservices and a site or two?

➜  nycnode git:(master) ✗ loop "git checkout master"

nycnode-denormalizer
Already on 'master'

nycnode-meetup-ingestor
Already on 'master'

nycnode-site
Already on 'master'

nycnode-user-ingestor
Already on 'master'

nycnode-youtube-ingestor
Already on 'master'

➜  nycnode git:(master) ✗ loop "git pull origin master"

nycnode-denormalizer
From github.com:mateodelnorte/nycnode-denormalizer
 * branch            master     -> FETCH_HEAD

nycnode-meetup-ingestor
From github.com:mateodelnorte/nycnode-meetup-ingestor
 * branch            master     -> FETCH_HEAD

nycnode-site
From github.com:mateodelnorte/nycnode-site
 * branch            master     -> FETCH_HEAD

nycnode-user-ingestor
From github.com:mateodelnorte/nycnode-user-ingestor
 * branch            master     -> FETCH_HEAD

nycnode-youtube-ingestor
From github.com:mateodelnorte/nycnode-youtube-ingestor
 * branch            master     -> FETCH_HEAD
 
➜  nycnode git:(master) ✗ loop "git checkout -b feature/my-new-feature"

nycnode-denormalizer
Switched to a new branch 'feature/my-new-feature'

nycnode-meetup-ingestor
Switched to a new branch 'feature/my-new-feature'

nycnode-site
Switched to a new branch 'feature/my-new-feature'

nycnode-user-ingestor
Switched to a new branch 'feature/my-new-feature'

nycnode-youtube-ingestor
Switched to a new branch 'feature/my-new-feature'

Now you're ready to code away across your whole system! loop "git status" will show you your status across all repos. loop "git diff", loop "git push origin feature/my-new-feature", and other commands all work like you'd think!

TODO:

  • plugins