Utils

July 29, 2026 ยท View on GitHub

Pure utility functions organized by concern.

Use explicit imports for clarity and better tree-shaking:

import { clamp, lerp } from '@/utils/math'
import { slugify } from '@/utils/strings'
import { fetchWithTimeout } from '@/utils/fetch'
import { generateSanityMetadata } from '@/utils/metadata'

Modules

ModuleFunctions
mathclamp, lerp, mapRange, truncate, modulo, roundTo, degToRad, radToDeg, distance
rafmutate (DOM write batching)
fetchfetchWithTimeout, fetchJSON
stringsslugify, lowerFirstChar, capitalizeFirstLetter, isEmptyArray, stripHtmlTags
metadatageneratePageMetadata, generateSanityMetadata
validationemailSchema, phoneSchema, sanityEnvSchema, shopifyEnvSchema, hubspotEnvSchema, mailchimpEnvSchema, turnstileEnvSchema, analyticsEnvSchema, coreEnvSchema, parseFormData, zodToValidator
rate-limitrateLimit, getClientIP, rateLimiters

Common Patterns

// Math
clamp(0, value, 100)
lerp(0, 100, 0.5) // โ†’ 50
mapRange(0, 1000, scrollY, 0, 1)

// DOM write batching (prevents layout thrashing)
await mutate(() => (element.style.transform = 'translateX(10px)'))

// Fetch with timeout
const response = await fetchWithTimeout(url, { timeout: 5000 })

// SEO
export const metadata = generatePageMetadata({ title: 'About' })

Validation (validation.ts)

Zod-based validation utilities for environment variables, form data, and shared field schemas.

ExportDescription
emailSchemaZod 4 z.email() validator
phoneSchemaE.164 phone number regex validator
sanityEnvSchemaValidates Sanity env vars
shopifyEnvSchemaValidates Shopify env vars
hubspotEnvSchemaValidates HubSpot env vars
mailchimpEnvSchemaValidates Mailchimp env vars
turnstileEnvSchemaValidates Turnstile env vars
analyticsEnvSchemaValidates Analytics env vars
coreEnvSchemaValidates core env vars (BASE_URL)
parseFormDataParse FormData against a Zod schema, returns FormState on error
zodToValidatorBridge Zod schemas to form hook's (string) => boolean validators

Rate Limit (rate-limit.ts)

In-memory rate limiter for server actions and API routes.

ExportDescription
rateLimitCheck if request should be rate limited
getClientIPExtract client IP from request headers
rateLimitersPre-configured limits: strict (5/min), standard (20/min), relaxed (60/min)