From 91284c242ac87715f8da83ad9622e498914c5d9e Mon Sep 17 00:00:00 2001 From: fucksophie Date: Sun, 4 Jan 2026 14:12:17 +0200 Subject: [PATCH] i wrote puuid in typescript --- src/lib/index.ts | 30 +++++++++++--- src/lib/puuid.ts | 42 +++++++++++++++++++ src/routes/app/+page.svelte | 71 +++++++++++++++----------------- src/routes/register/+page.svelte | 2 +- 4 files changed, 100 insertions(+), 45 deletions(-) create mode 100644 src/lib/puuid.ts diff --git a/src/lib/index.ts b/src/lib/index.ts index 5e4626b..3c779a3 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,22 +1,40 @@ +import { definePrefix, type Puuid } from "./puuid" + +export const UserID = definePrefix("user"); +export const GroupID = definePrefix("group"); +export const ServerID = definePrefix("srv"); + +export type UserId = Puuid<"user">; +export type GroupId = Puuid<"group">; +export type ServerId = Puuid<"srv">; + + export const Status: Record = { OFFLINE: 1, DND: 2, ONLINE: 3 } -interface InnerData { - id: string -} -export interface Friend extends InnerData { +export interface User { + id: UserId name: string, status: 1|2|3, image: string } -export interface Group extends InnerData { +export interface Group { + id: GroupId name: string members: number } -export interface Server extends InnerData { +export interface Server { + id: ServerId name: string image: string } + + +export interface Data { + friends: User[], + groups: Group[], + servers: Server[], +}; diff --git a/src/lib/puuid.ts b/src/lib/puuid.ts new file mode 100644 index 0000000..02280b9 --- /dev/null +++ b/src/lib/puuid.ts @@ -0,0 +1,42 @@ +import { v4 as uuidv4 } from "uuid"; +import { v7 as uuidv7 } from "uuid"; + +type Brand = K & { __brand: T }; + +export type Puuid = Brand< + string, + { prefix: Prefix } +>; + +export function definePrefix(prefix: P) { + const withPrefix = (uuid: string) => + `${prefix}_${uuid}` as Puuid

; + + return { + prefix, + is(value: string): value is Puuid

{ + return value.startsWith(prefix + "_"); + }, + + newV7(): Puuid

{ + return withPrefix(uuidv7()); + }, + + newV4(): Puuid

{ + return withPrefix(uuidv4()); + }, + + parse(value: string): Puuid

{ + if (!value.startsWith(prefix + "_")) { + throw new Error( + `Invalid prefix, expected "${prefix}_"` + ); + } + return value as Puuid

; + }, + + inner(id: Puuid

): string { + return id.slice(prefix.length + 1); + }, + }; +} diff --git a/src/routes/app/+page.svelte b/src/routes/app/+page.svelte index ec70fb4..ef791c7 100644 --- a/src/routes/app/+page.svelte +++ b/src/routes/app/+page.svelte @@ -1,47 +1,40 @@ @@ -52,22 +45,24 @@

- {#if currentPageType == "server"} - {@const server = (currentPage as Server)} + {#if currentPageID && currentPage} + {#if ServerID.is(currentPageID)} + {@const server = (currentPage as Server)} - {server!.name} + {server!.name} -

{server!.name}

- {:else if currentPageType == "friend"} - {@const friend = (currentPage as Friend)} +

{server!.name}

+ {:else if UserID.is(currentPageID)} + {@const friend = (currentPage as User)} - {friend!.name} + {friend!.name} -

{friend!.name} [{friend.status == Status.ONLINE ? "Online!" : friend.status == Status.DND ? "DND" : friend.status == Status.OFFLINE ? "Offline" : "Unknown"}]

- {:else if currentPageType == "group"} - {@const group = (currentPage as Group)} +

{friend!.name} [{friend.status == Status.ONLINE ? "Online!" : friend.status == Status.DND ? "DND" : friend.status == Status.OFFLINE ? "Offline" : "Unknown"}]

+ {:else if GroupID.is(currentPageID)} + {@const group = (currentPage as Group)} -

{group!.name} ({group.members} member{group.members > 1 ? "s" : ""})

+

{group!.name} ({group.members} member{group.members > 1 ? "s" : ""})

+ {/if} {/if}

this is like lowkirkounely the content, i should put messages and shi here

diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index ba2e634..24ce55d 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -10,7 +10,7 @@
- +