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

@nsv-format/nsv

v0.0.3

Published

NSV (Newline-Separated Values) format parser

Readme

NSV - Newline-Separated Values

CI

NSV is a plain text format for sequences of sequences.

name
email

Alice
[email protected]

Bob
[email protected]

Install

npm install @nsv-format/nsv

Basic usage

const nsv = require('@nsv-format/nsv');

// Parse NSV text
const data = nsv.parse('name\nemail\n\nAlice\[email protected]\n');
// => [['name', 'email'], ['Alice', '[email protected]']]

// Serialize to NSV
const text = nsv.stringify([['name', 'email'], ['Alice', '[email protected]']]);
// => 'name\nemail\n\nAlice\[email protected]\n'

Streaming

For large files, one can use Reader and Writer to process data incrementally without loading everything into memory:

const fs = require('fs');

const reader = new nsv.Reader(fs.createReadStream('input.nsv'));
const writer = new nsv.Writer(fs.createWriteStream('output.nsv'));

for await (const row of reader) {
  const processed = row.map(cell => cell.toUpperCase());
  await writer.writeRow(processed);
}

The Reader parses incrementally as data arrives—it handles infinite streams and maintains bounded memory usage.

Stream API:

  • read(stream) - read entire stream into memory as array
  • write(data, stream) - write entire array to stream
  • reader.readRow() - read next row (returns null when done)
  • reader.readRows() - read all remaining rows into array
  • writer.writeRow(row) - write a single row
  • writer.writeRows(rows) - write multiple rows

Spill/unspill

Flatten/recover seqseq dimension with terminators.

const flat = nsv.spill('', [['a', 'b'], ['c']]);
// => ['a', 'b', '', 'c', '']

const structured = nsv.unspill('', flat);
// => [['a', 'b'], ['c']]

Generic — works with any sentinel type. These decompose the encode/decode pipeline:

encode = spill('\n') ∘ spill('') ∘ map(map(escape))
decode = map(map(unescape)) ∘ unspill('') ∘ unspill('\n')

TypeScript

Type definitions are included:

import * as nsv from '@nsv-format/nsv';

const data: string[][] = nsv.parse(text);

Cross-tested

This implementation is tested against:

Spec

See nsv-format/nsv for the format specification.