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

import-cost-ci

v0.4.0

Published

Know the bundle cost of your imports before CI catches you

Readme

npm License: MIT

import-cost-ci

Know the bundle cost of your imports before CI catches you.

import-cost-ci analyzes every external import in a JS/TS file, bundles each one in isolation using esbuild, and reports the minified + gzip size. Fail your CI pipeline if any import exceeds your configured size budget.

Install

npm install -g import-cost-ci

Usage

import-cost-ci <file> [options]

Options

| Flag | Description | Default | |------|-------------|---------| | --limit <size> | Size limit (e.g. 50kb, 100kb, 500b) | 100kb | | --json | Output as JSON (for CI integration) | false | | --no-fail | Report violations but don't exit 1 | false | | --ignore <pkgs> | Comma-separated packages to skip | — | | --treemap | Print a 20-column import size treemap with the top 10 packages | false | | --history | Persist bundle history to .import-cost-history.json and print the trend | false |

Example

$ import-cost-ci src/main.ts --limit 50kb
✓ react                2.4 kB
✓ lodash/merge         1.2 kB
✗ moment               72.1 kB  ← exceeds 50kb limit!
✓ axios                12.3 kB

1 import(s) exceeded the 50kb limit.

JSON output

$ import-cost-ci src/main.ts --limit 50kb --json
{
  "limit": 50000,
  "results": [
    { "pkg": "react", "bytes": 2400, "size": "2.4 kB", "exceeded": false },
    { "pkg": "moment", "bytes": 72100, "size": "72.1 kB", "exceeded": true }
  ],
  "violations": 1
}

Ignore specific packages

import-cost-ci src/main.ts --limit 50kb --ignore moment,lodash

Treemap output

import-cost-ci src/main.ts --treemap

History tracking

import-cost-ci src/main.ts --history

History is written to .import-cost-history.json in the current working directory. In GitHub Actions, history is enabled automatically on push runs to main.

GitHub Actions

Use the published action directly:

- name: Check import costs
  uses: yuzhva/import-cost-ci@v0
  with:
    file: src/main.ts
    limit: 50kb
    treemap: true
    history: true

The action posts or updates a PR comment automatically when it runs on a pull request and GITHUB_TOKEN is available.

Full workflow example:

name: Import Cost Check
on: [push, pull_request]

jobs:
  import-cost:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Check import costs
        uses: yuzhva/import-cost-ci@v0
        with:
          file: src/main.ts
          limit: 50kb
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

How it works

  1. Parse — extracts all external import statements (static and dynamic) from the file using regex. Relative and absolute imports are skipped.
  2. Bundle — each package is bundled in isolation using the esbuild JavaScript API with bundle: true, minify: true, targeting the browser.
  3. Measure — the output is gzip-compressed and the byte count is recorded.
  4. Report — results are printed with color-coded pass/fail indicators. Exceeding the limit causes exit code 1 (unless --no-fail is set).

License

MIT