// Pure helpers shared by `SecretForm` (compound form for new-secret flows) // and the reuse tests. UI state lives in `secret-form.tsx`. export function slugifyForSecretId(input: string): string { return input .trim() .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/^-+|-+$/g, ""); } const normalizeSecretId = (secretId: string): string => secretId.trim(); export function isSecretIdTaken(secretId: string, existingSecretIds: Iterable): boolean { const normalizedId = normalizeSecretId(secretId); if (!normalizedId) return false; for (const existingSecretId of existingSecretIds) { if (normalizeSecretId(existingSecretId) === normalizedId) { return true; } } return false; } export function getUniqueSecretId( baseName: string, existingSecretIds: Iterable, fallbackId = "secret", ): string { const baseId = slugifyForSecretId(baseName) || fallbackId; if (!baseId) return ""; if (!isSecretIdTaken(baseId, existingSecretIds)) return baseId; let suffix = 2; while (isSecretIdTaken(`${baseId}-${suffix}`, existingSecretIds)) { suffix += 1; } return `${baseId}-${suffix}`; }