diff --git a/src/lib/Fursona.ts b/src/lib/Fursona.ts index 7e4ca64..df4891d 100644 --- a/src/lib/Fursona.ts +++ b/src/lib/Fursona.ts @@ -38,3 +38,48 @@ export interface Sona { birthdate?: string; colors?: string[]; } + +// Validate fursona +export function validateFursona(fursona: Sona): string[] { + let reasons = []; + if (!fursona.name) reasons.push('Missing fursona name'); + if (!fursona.species) reasons.push('Missing fursona species'); + if (!fursona.description) reasons.push('Missing fursona description'); + if (fursona.description.length > 250) reasons.push('Fursona description is too long'); + if (fursona.ref && !isURL(fursona.ref)) reasons.push('Fursona ref is not a valid URL'); + if (fursona.avatar && !isURL(fursona.avatar)) reasons.push('Fursona avatar is not a valid URL'); + if (fursona.age && fursona.age < 0) reasons.push('Fursona age is negative'); + if (fursona.birthdate && !isISO8601(fursona.birthdate)) + reasons.push('Fursona birthdate is not a valid ISO 8601 date'); + if (fursona.colors && !Array.isArray(fursona.colors)) + reasons.push('Fursona colors is not an array'); + if (fursona.colors && fursona.colors.some((color) => !isColor(color))) + reasons.push('Fursona colors contains an invalid color'); + return reasons; +} + +// Validate fursona schema +export function validateFursonaSchema(fursonaSchema: FursonaSchema): boolean { + if (!fursonaSchema.sonas) return false; + if (!Array.isArray(fursonaSchema.sonas)) return false; + if (fursonaSchema.sonas.length > 10) return false; + if (fursonaSchema.sonas.some((sona) => !validateFursona(sona))) return false; + return true; +} + +function isColor(color: string): boolean { + return /^#([0-9a-f]{3}){1,2}$/i.test(color); +} + +function isURL(url: string): boolean { + try { + new URL(url); + return true; + } catch (err) { + return false; + } +} + +function isISO8601(date: string): boolean { + return !isNaN(Date.parse(date)); +} diff --git a/src/lib/components/Fursona.svelte b/src/lib/components/Fursona.svelte index 0ce5ecb..a2c30b3 100644 --- a/src/lib/components/Fursona.svelte +++ b/src/lib/components/Fursona.svelte @@ -1,39 +1,67 @@
{fursona.description}
{#if fursona.birthdate && fursona.age} -🎂{fursona.birthdate.toLocaleDateString()} ({fursona.age})
+🎂{fursona.birthdate.toLocaleDateString()} ({fursona.age})
{:else if fursona.birthdate} -🎂{fursona.birthdate.toLocaleDateString()}
+🎂{fursona.birthdate.toLocaleDateString()}
{:else if fursona.age} -{fursona.age}
+{fursona.age}
{/if}{color}