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

@streamyflow/each

v1.1.0

Published

Line processing with a lambda

Readme

Introduction

If you use sed and awk a lot and dream of writing processing logic in JavaScript, this tool is for you.

Usage is pretty straightforward. Type the following to see the full description.

$ each --help

Basically you get to define 3 JavaScript lambdas to process a text input line-by-line

  1. A prologue lambda (optional)
  2. A line-processing lambda (optional)
  3. An epilogue lambda (optional)

If you only need the line-processing lambda, provide that as the sole argument to the command.

$ cat input.txt | each 't => t.replace(/,/g, ";")'

If you need at least 2 of the above, provide an array of 3 lambdas: [ prelogue, processing, epilogue]. Please note that the positions are significant.

$ cat input.txt | each '[
    () => ({skipping: true}),

    (t, n, c) => {
        if (t.startsWith("begin")) {
            c.skipping = false
            return undefined
        }
        if (!c.skipping) return t
    },

    /* no need for an epilogue */
]'

Usage

Prologue Lambda

If provided, the prologue lambda is invoked only once, before any lines are processed. The return value of this invocation is passed to the line processing lambda as the third argument, and the epilogue lambda as the only argument.

() => ({ anything: "Any Value" })

Line-processing Lambda

Each invocation of the line-processing lambda is passed 3 arguments:

  1. the text line as a string
  2. the line number as a number
  3. the value returned from the prologue lambda or undefined if no prologue lambda is provided.

Returned value from each invocation is printed to the stdout immediately unless it is undefined.

If no line-processing lambda is defined, the input is copied to the output directly.

Epilogue Lambda

If provided, the epilogue lambda is invoked only once, after all lines have been processed. It is passed the value returned from the prologue lambda. Returned value from this invocation is printed to the stdout unless it is undefined.

Example Uses

Joining lines together

$ cat README.md|each '[ () => ({s: ""}), (t,n,m) => (m.s+=t, undefined), m => m.s ]'

Simple templating

Here we use shell environment variables but you can get more creative.

$ cat template.txt
Hello ${USER}
Your home is at ${HOME}
$ cat template.txt|each 't => t.replace(/\${([^{}]{1,})}/, (m,g) => process.env[g])'
Hello steve
Your home is at /Users/steve