Files
suaveplan/openspec/archive/2026-04-19-enterprise-compress-image/proposal.md
2026-05-27 23:29:53 +01:00

2.2 KiB

OpenSpec Change: enterprise-compress-image

  • Change ID: enterprise-compress-image
  • Package: @suaveplan/compress-image
  • Category: universal
  • Target path: universal/compression/compress-image
  • Status: PROPOSED
  • Date: 2026-04-19
  • Reference spec: /mnt/s/web/suaveplan/enterprise/compress-image.md

Summary

High-level image compression façade. Orchestrates format-specific encoders (JPEG/MozJPEG, PNG/OxiPNG, WebP, AVIF) behind a uniform ImageCompressor.compress(input, options) API. Accepts quality presets, format override, max-dimension resize, and returns a CompressionResult with before/after stats.

Current-state audit (genesis)

Package does not exist yet — fresh build.

Dependencies

  • Workspace: @suaveplan/error, @suaveplan/types
  • External (via catalog): zod, tslib, @opentelemetry/api, @jsquash/jpeg, @jsquash/png, @jsquash/webp, @jsquash/avif, @jsquash/resize
  • Dev (via catalog): vitest, @vitest/coverage-istanbul, fast-check, mitata

Preserved public surface

  • ImageCompressor — compress(input, options?): Promise<CompressionResult>
  • Errors: CompressionError, CompressionErrorCode, CompressionErrorContext, compressionFailed, dimensionTooLarge, invalidQuality, unsupportedFormat, CompressImageErrorCode, COMPRESS_IMAGE_ERROR_METADATA, registerCompressImageErrorCodes
  • Types: CompressionFormat, CompressionOptions, CompressionPlan, CompressionResult, CompressionStep, PresetConfig, QualityPreset, ResolvedCompressionOptions
  • Constants: FORMAT_QUALITY_RANGES, MAX_DIMENSION, QUALITY_PRESETS, VALID_FORMATS, VALID_PRESETS

New genesis additions

  • Additional codes: COMPRESS_IMAGE.ENCODER_UNAVAILABLE, COMPRESS_IMAGE.INPUT_TOO_LARGE, COMPRESS_IMAGE.OUTPUT_LARGER_THAN_INPUT.
  • Zod schemas for every option / result type.
  • OTel histogram compress_image.compress.duration_ms{format, preset}; counter for outcome; gauge compress_image.bytes.saved.
  • Property tests: output byte length ≤ input byte length for any input under a fixed preset (or error thrown).

Impact

  • Adds one new package: universal/compression/compress-image
  • Adds one new spec capability: compress-image