@cutticat/uuids
Thin wrapper around uuid, plus lenient parse/normalize helpers.
Table of Contents
Overview
Generation is delegated to the uuid package. generateUuid() calls v4(); pass 7 for time-ordered v7. The rest of the API is a small validation and normalization layer that is less strict than most UUID libraries, including uuid.validate().
Canonical UUIDs are 8-4-4-4-12 hex groups. This library also accepts shorter groups and left-pads them with zeros. The point is being able to type identifiers by hand — in a URL, a query, or a fixture — without counting hex digits.
Example: an app with /resource/<uuid> can use /resource/0-0-0-0-1 while debugging.
normalizeUuid("0-0-0-0-1")
→ "00000000-0000-0000-0000-000000000001"
You still need five hyphen-separated groups. RFC version and variant bits are not checked, so debug values like 0-0-0-0-1 are valid here on purpose.
If you need RFC-strict parsing, v1/v3/v5/v6, or the rest of the uuid API, import uuid directly.
Installation
pnpm i @cutticat/uuids
Quick Start
import { generateUuid, isUuid, normalizeUuid, tryNormalizeUuid } from "@cutticat/uuids"
generateUuid() // canonical v4
generateUuid(7) // canonical v7
isUuid("0-0-0-0-1") // true — short groups allowed
isUuid("0-0-0-0-1", true) // false — strict mode wants full 8-4-4-4-12 widths
normalizeUuid("0-0-0-0-1") // "00000000-0000-0000-0000-000000000001"
normalizeUuid("550E8400-E29B-41D4-A716-446655440000")
// "550e8400-e29b-41d4-a716-446655440000"
tryNormalizeUuid("not-a-uuid") // "not-a-uuid" (unchanged)
What is accepted
isUuid(s) / normalizeUuid(s) accept a hyphenated 5-group string. Each group is hex; lengths may be shorter than canonical (up to 8, 4, 4, 4, and 12). Input is treated case-insensitively. Surrounding whitespace is ignored. normalizeUuid lowercases and zero-pads each group.
| Input | isUuid |
isUuid(s, true) |
normalizeUuid |
|---|---|---|---|
550e8400-e29b-41d4-a716-446655440000 |
true | true | same, lowercased |
0-0-0-0-1 |
true | false | 00000000-0000-0000-0000-000000000001 |
1-2-3-4-5 |
true | false | 00000001-0002-0003-0004-000000000005 |
550e8400-e29b-41d4-a716-44665544 |
true | false | last group padded |
not-a-uuid |
false | false | throws |
550e8400-e29b-41d4-a716 |
false | false | throws (four groups) |
Not accepted: missing hyphens, URN (urn:uuid:…), {braces}, extra groups.
tryNormalizeUuid never throws: it normalizes when isUuid(s) is true, otherwise returns the original string.
API
Functions
generateUuid(version?)—uuidv4 (default) or v7. ThrowsRangeErrorfor other versionsisUuid(s, strict?)— whetherslooks like a UUID.strict: truerequires full 8-4-4-4-12 widthsnormalizeUuid(s)— lowercase + zero-pad groups; throwsError("Invalid UUID")ifsis not a UUIDtryNormalizeUuid(s)—normalizeUuid(s)or the original string if it is not a UUID
Constants
minUuid— nil UUID (00000000-0000-0000-0000-000000000000), alias ofuuid.NILmaxUuid— all-ones UUID (ffffffff-ffff-ffff-ffff-ffffffffffff), alias ofuuid.MAXuuidGroupLengths— group lengths[8, 4, 4, 4, 12]uuidLength— canonical length with hyphens (36)uuidRegex— allows incomplete groupsstrictUuidRegex— full 8-4-4-4-12 widths only
Documentation
Full API documentation is in JSDoc. Use IDE autocomplete to browse it.
Requirements
- Node.js >= 22.0.0
- pnpm >= 10.17.0
- TypeScript >= 5.9.0