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

@hamster-note/epub-parser

v0.5.0

Published

TypeScript ESM package for bidirectional conversion between EPUB files and IntermediateDocument

Readme

@hamster-note/epub-parser

TypeScript ESM package for bidirectional conversion between EPUB files and IntermediateDocument.

API Direction

encode(input) parses an EPUB file into an IntermediateDocument. decode(intermediateDocument) generates an EPUB binary from an IntermediateDocument.

Instance methods

import { EpubParser } from "@hamster-note/epub-parser";

const parser = new EpubParser();

// Parse EPUB into intermediate document
const doc = await parser.encode(input); // input: Blob | File | ArrayBuffer | Uint8Array | Buffer | string(path)

// Generate EPUB from intermediate document
const epubBytes = await parser.decode(doc); // returns Uint8Array

Static methods (with EPUB-specific metadata)

import { EpubParser } from "@hamster-note/epub-parser";

// Parse EPUB into EpubDocument (extends IntermediateDocument with EPUB metadata)
const epubDoc = await EpubParser.encode(input);
const doc = epubDoc.getIntermediateDocument();

// Access EPUB-specific metadata
console.log(doc.metadata.title);
console.log(doc.metadata.author);

// Generate EPUB from intermediate document
const epubBytes = await EpubParser.decode(doc);

Dependencies

Supported Scope

  • EPUB2 and EPUB3 reflowable documents
  • UTF-8 encoded content
  • Metadata extraction (title, author, and basic fields)
  • Spine and page order preservation
  • Table of Contents (TOC) when representable as IntermediateOutline
  • Embedded covers and chapter images

Excluded Scope

The following features are explicitly out of scope and will not be supported unless a separate scope decision is made:

  • DRM removal or handling
  • Fixed-layout fidelity
  • Media overlays
  • Non-UTF-8 transcoding
  • Streaming parse/generation
  • Full EPUB spec validation
  • CLI interface

Commands

yarn install
yarn dev
yarn typecheck
tsc --noEmit -p tsconfig.json
yarn test
yarn build:all

yarn dev starts the encode/decode demo on port 8871. The server binds to 0.0.0.0 by default, so devices on the same LAN can open the printed URL, for example http://192.168.1.23:8871. Use HOST=127.0.0.1 yarn dev to restrict it to local-only access.

Requirements

Browser builds require standard binary APIs (Blob, ArrayBuffer, Uint8Array, and TextDecoder). Remote image URLs additionally require fetch. These APIs are available in current evergreen browsers. Node.js users require Node.js >=22.6.0.

Runtime Support

| Capability | Supported runtime | Minimum Node.js | Browser status | Notes | | --- | --- | --- | --- | --- | | Parse EPUB (encode) | Browser and Node.js | >=22.6.0 | Supported | Browsers accept Blob, File, ArrayBuffer, and Uint8Array; Node.js additionally accepts Buffer and filesystem paths. | | Generate EPUB (decode) | Browser and Node.js | >=22.6.0 | Supported | Returns ZIP bytes as Uint8Array without Node.js polyfills. |

No browser polyfills or Node builtin shims are required. String path inputs and file:// image sources remain Node.js-only because browsers cannot read arbitrary filesystem paths. Browser callers can provide images as data URLs, File objects, or fetchable remote URLs.

Roundtrip Semantics

Roundtrip conversion is semantic and lossy, not byte-exact. Re-encoding a decoded EPUB will preserve page count, spine order, title, author, and text content at a semantic level, but will not produce byte-identical output. Timestamps, generated IDs, and dependency-specific metadata may differ between passes.