Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/stash

src/lib/util.ts

61 lines · 1.5 KB · TypeScript
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)
}