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

@writetome51/app-paginator

v6.0.0

Published

A class for pagination in a real-world web application

Readme

AppPaginator

A TypeScript/JavaScript class for pagination in a real-world web application. It
automatically batchinates the full dataset in case it's huge.
In the constructor you pass in a dataSource that returns data in batches that
contain multiple pages worth. (A batch is either the total amount of data you
want the app to have loaded in memory at once, or the total amount of data the
data source is willing to give you at once —— whichever is less. Tell
AppPaginator the batch size by setting the property itemsPerBatch.) When the
method set_currentPageNumber(num) is called, this class requests from
dataSource the batch that page is in. Then the items of the requested page
will be in the property currentPage.

Basic Usage

// Get an instance (see constructor for dataSource details):
let appPaginator = new AppPaginator(dataSource);

// Make sure itemsPerPage has the value you want:
appPaginator.itemsPerPage = 10;

appPaginator.itemsPerBatch = 200;

// Show the first page:
await appPaginator.set_currentPageNumber(1);
console.log(appPaginator.currentPage); // `[item1, item2, item3, item4,...]`

// The user performs a search to narrow down the dataset.
// You want the paginator to react to this, so you do a reset:
await appPaginator.reset();

Constructor

constructor(
    dataSource: {

        getBatch: (
            batchNumber: number, itemsPerBatch: number, isLastBatch: boolean
        ) => Promise<any[]>;
            // The number of items `getBatch()` returns must match `itemsPerBatch`.
            // If `isLastBatch` is true, it must only return the remaining items 
            // in the dataset and ignore itemsPerBatch.

        dataTotal: number;
            // `dataTotal`: number of items in entire dataset, not the batch.
            // This must stay accurate after actions that change the total, such 
            // as searches.
    }
)

Properties

itemsPerPage: number
    // Default is 25.

itemsPerBatch: number
    // Total number of items the app can have loaded in memory.
    // If your data source doesn't allow you to request batches the size of multiple
    // pages, set this to same value as this.itemsPerPage.
    // NOTE: if this isn't evenly divisible by this.itemsPerPage, its value is 
    // lowered until it is.

currentPageNumber: number // read-only

currentPage: any[] // read-only
    // All items in the current page.

totalPages: number // read-only

Methods

async set_currentPageNumber(num): Promise<void>
    // updates this.currentPage

async resetToFirstPage(): Promise<void>
    // force-loads page 1.
    // Intended to be called after the order of the dataset changes (like 
    // after sorting), or after the total number of items changes (like after 
    // a search).

Inheritance Chain

AppPaginator<--AbstractAppPaginator

Installation

npm i @writetome51/app-paginator

Loading

// If using TypeScript:
import { AppPaginator } from '@writetome51/app-paginator';
// If using ES5 JavaScript:
var AppPaginator = require('@writetome51/app-paginator').AppPaginator;

License

MIT