Initial Commit
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# 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`
|
||||
Reference in New Issue
Block a user