API Reference
The complete public surface. Every throwing function accepts { throwOnError: false } to return null instead of throwing.
Functions#
Validation#
| Function | Signature | Notes |
|---|---|---|
validate() | validate(rut: unknown, options?: ValidateOptions): boolean | Shape + Modulo 11 verifier; strict rejects placeholders |
isValidRut() | isValidRut(rut: unknown, options?: { strict?: boolean }): rut is Rut | Type guard narrowing to the branded Rut |
isRutLike() | isRutLike(rut: unknown): boolean | Bounded shape check, no verifier math |
Formatting & cleaning#
| Function | Signature | Safe mode |
|---|---|---|
format() | format(rut: string, options?: FormatOptions): string | ✅ |
clean() | clean(rut: string, options?: SafeOptions): string | ✅ |
mask() | mask(rut: string, options?: { throwOnError?: boolean }): string | null | ✅ |
Comparison#
| Function | Signature | Notes |
|---|---|---|
equals() | equals(a: unknown, b: unknown, options?: EqualsOptions): boolean | Normalized cross-shape comparison; checks Modulo 11 by default ({ requireValid: false } for pure shape comparison) |
Decomposition#
| Function | Signature | Safe mode |
|---|---|---|
decompose() | decompose(rut: string, options?: SafeOptions): DecomposedRut | ✅ |
getBody() | getBody(rut: string, options?: SafeOptions): string | ✅ |
getVerifier() | getVerifier(rut: string, options?: SafeOptions): VerifierDigit | ✅ |
Generation & math#
| Function | Signature | Safe mode |
|---|---|---|
generate() | generate(options?: GenerateOptions): string | string[] | N/A |
calculateVerifier() | calculateVerifier(rutBody: string, options?: SafeOptions): VerifierDigit | ✅ |
TypeScript types#
import type {
DecomposedRut,
EqualsOptions,
FormatOptions,
GenerateOptions,
Rut,
SafeOptions,
ValidateOptions,
VerifierDigit,
} from 'rut.ts'Rut#
type Rut = string & { readonly __brand: 'Rut' } // branded validated-RUT stringA branded type representing a validated RUT string. Obtain one by narrowing with
isValidRut().
DecomposedRut#
type DecomposedRut = {
body: string // RUT body (7-8 digits, no leading zeros)
verifier: VerifierDigit // Verifier digit ('0'-'9' or 'K')
}Returned by decompose().
EqualsOptions#
type EqualsOptions = {
requireValid?: boolean // Require the shared value to pass Modulo 11 (default: true)
}Used by equals(). { requireValid: false } restores
the pre-5.0.0 pure normalization comparison.
FormatOptions#
type FormatOptions = {
incremental?: boolean // Progressive formatting (default: false)
dots?: boolean // Include dot separators (default: true)
throwOnError?: boolean // Throw vs. return null (default: true)
}Used by format().
GenerateOptions#
type GenerateOptions = {
bodyLength?: 7 | 8 // Body digit count (default: 7 or 8)
format?: 'dotted' | 'compact' | 'hyphen' // Output shape (default: 'dotted')
count?: number // Return an array of this many RUTs
}Used by generate(). When count is given, generate()
returns string[]; otherwise it returns a single string.
SafeOptions#
type SafeOptions = {
throwOnError?: boolean // Throw vs. return null (default: true)
}Used by clean(), decompose(), getBody(), getVerifier(), calculateVerifier().
ValidateOptions#
type ValidateOptions = {
strict?: boolean // Reject suspicious placeholders (default: false)
}Used by validate().
VerifierDigit#
type VerifierDigit =
| '0' | '1' | '2' | '3' | '4' | '5'
| '6' | '7' | '8' | '9' | 'K'Errors#
InvalidRutError#
import { InvalidRutError } from 'rut.ts'
class InvalidRutError extends Error {
readonly code: 'INVALID_RUT'
// message: 'Invalid RUT input'
}Thrown by the safe helpers in their default mode (throwOnError: true) when the
input is not a valid RUT. Detect it with instanceof rather than matching the
message string.
import { clean, InvalidRutError } from 'rut.ts'
try {
clean('not-a-rut')
} catch (error) {
if (error instanceof InvalidRutError) {
// error.code === 'INVALID_RUT'
}
}getInvalidRutError() was removed in 5.0.0 (deprecated since 4.1.0).
Catch InvalidRutError (instanceof) or branch on
err.code === 'INVALID_RUT' instead; the constant message is
new InvalidRutError().message if you truly need the text.
Quick reference#
| Function | Input | Output | Safe mode | Purpose |
|---|---|---|---|---|
validate() | unknown | boolean | N/A | Accept / reject (shape + verifier) |
isValidRut() | unknown | rut is Rut | N/A | Type guard narrowing to branded Rut |
isRutLike() | unknown | boolean | N/A | Fast bounded shape check |
format() | RUT string | formatted string | ✅ | Canonical display; validates in default mode |
clean() | RUT string | digit string | ✅ | Normalize shape (no verifier check) |
mask() | RUT string | masked string | null | ✅ | Partially hide a RUT for display |
equals() | unknown | boolean | N/A | Same-RUT comparison (validity-checked by default) |
decompose() | RUT string | { body, verifier } | ✅ | Split into parts |
getBody() | RUT string | body string | ✅ | Body only |
getVerifier() | RUT string | verifier char | ✅ | Verifier only |
calculateVerifier() | body string | verifier char | ✅ | Derive the Modulo 11 digit |
generate() | options | valid RUT(s) | N/A | Random valid RUT(s) for tests |
Common patterns#
Validation pipeline#
import { isRutLike, validate } from 'rut.ts'
function validateRutPipeline(input: unknown): boolean {
if (typeof input !== 'string') return false
if (!isRutLike(input)) return false // cheap reject
return validate(input, { strict: true }) // authoritative gate
}For production identity flows, validate(input, { strict: true }) is the
acceptance gate. clean() normalizes shape but does not prove the
verifier is correct — see Security.
Safe processing#
import { clean, decompose } from 'rut.ts'
function safeProcessRut(input: string) {
const cleaned = clean(input, { throwOnError: false })
if (!cleaned) return null
return decompose(cleaned, { throwOnError: false })
}Format + validate#
import { format, validate } from 'rut.ts'
function formatAndValidate(input: string) {
const formatted = format(input, { throwOnError: false })
if (!formatted) return { valid: false, formatted: null }
return { valid: validate(formatted), formatted }
}