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 @@
- {#if fursona.avatar} - {fursona.name} avatar image +> + {#if validation.length > 0} +
+ + +
{/if} -

- {fursona.name} - {#if fursona.pronouns} - ({fursona.pronouns}) - {/if} + {#if fursona.avatar} + {fursona.name} avatar image + {/if} +

+ {fursona.name} + {#if fursona.pronouns} + ({fursona.pronouns}) + {/if}

- {#if fursona.gender} - {fursona.gender} - {/if} - {fursona.species} + {#if fursona.gender} + {fursona.gender} + {/if} + {fursona.species}

{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}
{#each fursona.colors as color} @@ -42,12 +70,13 @@

{color}

{/each} -
+ {#if fursona.ref} - View Ref Sheet + View Ref Sheet {/if}