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

pomp

v0.2.16

Published

Very basic postgres one-way migrations.

Readme

Pomp

Very basic postgres one-way migrations.

CLI Usage

Pomp expects a folder named 'migrations' in the folder you execute it from (or the environment variable POMP_WD), containing SQL files with naming like "1234-my-new-table.sql". The number at the start of each must be unique.

It will use standard psql environment variables to connect, or POSTGRES_URL if it exists.

There are a few different commands that you can run.

npx pomp new my-new-table

'new' will create a new sql file in the migrations folder with the current unix timestamp as its version number and then attempt to open the EDITOR environment variable (or vi if there is no EDITOR environment variable.)

npx pomp version

'version' will show the latest local and remote version numbers.

npx pomp pending

'pending' shows which local migrations need to be applied. it will exit with code 1 if there are migrations to run, otherwise 0.

npx pomp run

'run' will execute any local migration files that are missing in the postgres database.

npx pomp skip 1 2 3 4

'skip' will register the supplied migration versions as having completed without actually running them.

You can also get this information by running npx pomp help

JS Usage

You can use Pomp from your application by importing it and supplying functions to read and run the queries.

import { Pomp } from 'pomp';
import postgres from 'postgres';
import { readdir, readFile } from 'fs/promises';

const conn = postgres('postgres://localhost');

const pomp = new Pomp({
    // runSqlQuery should return an array of result rows
    async runSqlQuery(text) {
        return await conn.unsafe(text);
    }
    // listLocalMigrations returns an array of
    // each migration that can be applied.
    async listLocalMigrations() {
        return await readdir('migrations');
    }
});

With that created you can run the various operations on it:

// run all pending local migrations, the supplied function is
// called with the 'name' supplied to listLocalMigrations
await pomp.runMigrations(async name => (
    await readFile(`migrations/${name}`, 'utf-8')
));

// get a list of the migrations that need to run
await pomp.pendingMigrations();

// run a single migration with its contents,
// and mark it as completed
await pomp.runMigrations(3, 'create table my_new_table (id serial);');

// mark a migration version as having completed
await pomp.skipMigration(3);

// get the latest remote and local database version
await pomp.latestVersions();

// create an array of local migrations
await pomp.listLocalMigrations();

// create an array of migrations from the database
await pomp.listRemoteMigrations();