Files
admin 9bf56a806b Move docs/ package mirror into document-navigator plugin
Relocate the ~6k-file docs tree from the repo root into
plugins/document-navigator/docs/ so the plugin is self-contained and
portable. docs/superpowers/ (specs and plans) stays at the repo root.

Moved via cp+rm rather than git mv because directory rename() fails with
EPERM on this WSL /mnt DrvFs mount; git rename-detection pairs the
identical-content files at commit time.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 01:10:00 +01:00

3.7 KiB

@suaveplan/compress-image - Runtime-agnostic image compression utilities: resize, quality reduction, format conversion, and metadata stripping via pluggable adapters

Runtime-agnostic image compression utilities with pluggable adapters for Node.js (Sharp) and testing (MemoryAdapter). Supports resize, quality reduction, format conversion (JPEG, PNG, WebP, AVIF), and metadata stripping. The compressor core is pure TypeScript with zero runtime dependencies; only the Sharp adapter requires the native sharp library.

Documentation tree

Installation

bun add @suaveplan/compress-image

Quick Start

import { createCompressor } from "@suaveplan/compress-image/compressor";
import { SharpAdapter } from "@suaveplan/compress-image/adapters/sharp";
import sharp from "sharp";

const compressor = createCompressor(new SharpAdapter(sharp));

const result = await compressor.compress(imageBuffer, {
    format: "webp",
    quality: 75,
    width: 1280,
    height: 720,
    resizeMode: "cover",
    stripMetadata: true,
});

console.log(result.compressionRatio, result.compressedSize);

Modules

Subpath Exports

  • . — All public types, errors, utilities, adapters, and the compressor
  • ./compressor — ImageCompressor, createCompressor
  • ./adapters/memory — MemoryAdapter
  • ./adapters/sharp — SharpAdapter, SharpLike, SharpInstance
  • ./errors — CompressImageError, COMPRESS_IMAGE_CODES