Files
suaveplan/openspec/archive/2026-04-25-enterprise-font-subset/tasks.md
2026-05-27 23:29:53 +01:00

3.4 KiB

Tasks: enterprise-font-compress

Change ID: enterprise-font-compress Package: @suaveplan/font-compress Target path: universal/compression/font-compress Prerequisite packages on Verdaccio: @suaveplan/error, @suaveplan/types, @suaveplan/mime


1. Scaffold

  • Create directory universal/compression/font-compress/ with src/, tests/, src/__benchmarks__/, and all feature subdirectories per the layout in proposal.md.
  • Write package.json at version 0.1.0 with "type": "module", "sideEffects": false, full exports map, deps: @suaveplan/error workspace:^, @suaveplan/types workspace:^, @suaveplan/mime workspace:^, zod catalog:forms, @opentelemetry/api catalog:observability.
  • Write tsconfig.json extending @suaveplan/typescript-config/library.json.
  • Write vitest.config.ts using createTestConfig() from @suaveplan/testing/config.
  • Add lint, typecheck, test, test:coverage, build, docs:check scripts.

2. Types + errors

  • Write src/types/common.ts — FontFormat, FontMetadata, SubsetOptions, CompressFontOptions, FontCompressResult, FontCompressAdapter, FontCompressorOptions.
  • Write src/types/common.md.
  • Write src/error-codes.ts — FontCompressErrorCode, FONT_COMPRESS_ERROR_METADATA, registerFontCompressErrorCodes().
  • Write Zod schemas: SubsetOptionsSchema, CompressFontOptionsSchema, FontMetadataSchema, FontCompressResultSchema, FontCompressorOptionsSchema.

3. NullFontCompressAdapter

  • Implement NullFontCompressAdapter — probe returns configurable fixture metadata, compress returns input bytes with a fixture result (ratio = 0.9, same format as outputFormat).
  • Write null-adapter.test.ts and null-adapter.md.

4. Utils

  • Implement parseUnicodeRanges(ranges: string[]): Set<number> — parses U+XXXX and U+XXXX-XXXX; throws FontCompressError(FONT_COMPRESS_INVALID_OPTIONS) on bad syntax.
  • Implement detectFontFormat(data: Uint8Array): FontFormat — delegates to @suaveplan/mime magic-byte sniff.
  • Write unicode-ranges.test.ts, unicode-ranges.md, format-detect.test.ts, format-detect.md.

5. FontCompressor

  • Implement FontCompressor — probe and compress delegate to adapter; wire AbortSignal; validate options via Zod.
  • Wire OTel: span font.compress, counter font_compress_total, histogram font_compress_duration_ms + font_compress_ratio.
  • Write font-compressor.test.ts (≤500 lines): probe, compress, abort, unsupported format throws.
  • Write font-compressor.md.

6. Benchmarks

  • Write src/__benchmarks__/font-compress.bench.ts — probe 200 kB TTF fixture, WOFF2 encode (null adapter), subset ASCII range.

7. Tests

  • Write tests/integration.test.ts — full pipeline with NullFontCompressAdapter.
  • Write tests/property.test.ts (fast-check) — compressed size ≤ original, ratio ∈ (0, 1].

8. Docs + verify + publish

  • All co-located .md files (≥200 words each).
  • Write README.md at package root.
  • bunx turbo lint typecheck test --filter=@suaveplan/font-compress — green.
  • bunx turbo test:coverage --filter=@suaveplan/font-compress — 100%.
  • bun scripts/publish.ts --package @suaveplan/font-compress.
  • Archive to openspec/archive/2026-04-24-enterprise-font-compress/.