Skip to main content

format

Structural string-format types — UUID, Email, ISO dates, hex colors, semver.

import type {
  UUID, Email, HttpUrl, URLString,
  IPv4, IPv6,
  ISODate, ISOTime, ISODateTime, HHMM, HHMMSS,
  HexColor, RgbColor, RgbaColor, HslColor,
  Semver, PhoneE164, Base64, JWT, Slug,
  CSSLength,
} from '@gentleduck/ttest/format'

Each type asserts a structural shape — the compiler verifies the pattern, not the underlying RFC semantics. A UUID that matches the layout but isn't a valid v4 UUID will still type-check.

UUID

type UUID = `${string}-${string}-${string}-${string}-${string}`

RFC-4122 layout: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Email

type Email = `${string}@${string}.${string}`

Minimal local@domain.tld shape.

URLs

type HttpUrl   = `http://${string}` | `https://${string}`
type URLString = `${string}://${string}`

IP addresses

type IPv4 = `${number}.${number}.${number}.${number}`
type IPv6 = `${string}:${string}:${string}:${string}:${string}:${string}:${string}:${string}`

ISO-8601

type ISODate     = `${number}-${number}-${number}`
type ISOTime     = `${number}:${number}:${number}` | `${number}:${number}:${number}.${number}`
type ISODateTime =
  | `${ISODate}T${ISOTime}`
  | `${ISODate}T${ISOTime}Z`
  | `${ISODate}T${ISOTime}${'+' | '-'}${number}:${number}`

type HHMM   = `${number}:${number}`
type HHMMSS = `${number}:${number}:${number}`

Colors

type HexColor  = `#${string}`
type RgbColor  = `rgb(${number}, ${number}, ${number})`
type RgbaColor = `rgba(${number}, ${number}, ${number}, ${number})`
type HslColor  = `hsl(${number}, ${number}%, ${number}%)`

Semver

type Semver =
  | `${number}.${number}.${number}`
  | `${number}.${number}.${number}-${string}`
  | `${number}.${number}.${number}+${string}`
  | `${number}.${number}.${number}-${string}+${string}`

MAJOR.MINOR.PATCH with optional pre-release and build metadata.

PhoneE164

type PhoneE164 = `+${number}`

International phone layout — leading + plus digits.

Base64 / Slug

type Base64 = string & { readonly __format: 'base64' }
type Slug   = string & { readonly __format: 'slug' }

Branded string aliases — the compiler can't validate character sets at the type level.

JWT

type JWT = `${string}.${string}.${string}`

Header / payload / signature layout.

CSSLength

Re-exported from css. Lives there for the richer definition (accepts '0' and calc(...)).