export type InputRecord = Record<string, unknown>
export function inputRecord(value: unknown): InputRecord {
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
throw new Error('Input must be an object.')
}
return value as InputRecord
}
export function normalizeText(value: unknown): string {
return typeof value === 'string' ? value.trim() : ''
}
export function nowIso(): string {
return new Date().toISOString()
}
export function createId(): string {
return crypto.randomUUID()
}
export function uniqueSorted(values: string[]): string[] {
return Array.from(
new Set(values.map((value) => value.trim().toLowerCase()).filter(Boolean)),
).sort()
}
export function normalizeLimit(
value: unknown,
fallback = 10,
hardMax = 50,
): number {
const parsed =
typeof value === 'number' && Number.isFinite(value)
? Math.trunc(value)
: fallback
return Math.min(hardMax, Math.max(1, parsed))
}
export function parseJsonArraySafe(value: unknown): string[] {
if (typeof value !== 'string') return []
try {
const parsed = JSON.parse(value)
return Array.isArray(parsed)
? parsed.filter((entry): entry is string => typeof entry === 'string')
: []
} catch {
return []
}
}
export function optionalBoolean(input: InputRecord, key: string): boolean {
const value = input[key]
if (value === undefined || value === null) return false
if (typeof value !== 'boolean') throw new Error(`${key} must be a boolean.`)
return value
}
export function assertNever(value: never, message: string): never {
throw new Error(message)
}