Skip to content

Release 0.0.1

Choose a tag to compare

@github-actions github-actions released this 08 Sep 03:09
· 55 commits to master since this release

[0.0.1] - 2026-09-07

Added

  • Byte-stable email normalizer (:email): normalizeEmail(value, policy) produces a deterministic, byte-level canonical string for hashing and blind tokenization. The canonical form applies only ASCII-level, Unicode-version-independent operations (trim ASCII whitespace, ASCII-lowercase, RFC 5233 +-subaddress handling), so its output is byte-identical on every platform and every build and never drifts when Unicode ships a new version.
  • Named, frozen policies (EmailPolicy): EmailPolicy.ByteStableV1 is the shared canonical form for blind tokenization (strips the +-subaddress); EmailPolicy.Lenient is a loose trim + ASCII-lowercase key for display and dedupe. Each policy carries an id + version epoch that travels with any derived token, and a published policy's output is never edited in place — a rules change mints a new version.
  • Outcome-based result with typed, value-free errors: normalization returns an aughtone-types Outcome<NormalizedEmail>; malformed input yields Outcome.Failure carrying a typed EmailNormalizationError (MissingAtSign, EmptyLocalPart, EmptyDomain, UnpairedSurrogate) whose messages never echo the input, so a rejected address cannot leak into a log. A String.normalizeEmailOrNull(policy) convenience is also provided.
  • Depends on io.github.aughtone:types 3.4.0, exposed transitively via api, for Outcome.Success / Outcome.Failure and the runOutcome { } builder.
  • Multiplatform targets: published for JVM, Android, iOS (arm64, x64, simulatorArm64), JS (browser), wasmJs (browser) and Linux x64. The same test suite runs on each, so the canonical form is verified identical across them rather than assumed.
  • Shared Normalized contract (:common): the Normalized interface (canonical, policyId, policyVersion) is the common result shape every normalizer in the suite reports, so a derived hash can always be stored beside the policy identity that produced it.