Template
1
0

feat: refactor account

This commit is contained in:
2025-08-12 05:24:20 +02:00
parent 1215a98afc
commit f0630d43b7
25 changed files with 256 additions and 332 deletions

7
spec/shared/avatar.ts Normal file
View File

@@ -0,0 +1,7 @@
import z from "zod";
export const AvatarSchema = z.object({
url: z.string().describe("A valid URL pointing to the user's avatar image."),
});
export type Avatar = z.infer<typeof AvatarSchema>;

9
spec/shared/contact.ts Normal file
View File

@@ -0,0 +1,9 @@
import z from "zod";
import { EmailSchema } from "./email.ts";
export const ContactSchema = z.object({
emails: z.array(EmailSchema).default([]).describe("A list of email addresses associated with the contact."),
});
export type Contact = z.infer<typeof ContactSchema>;

15
spec/shared/database.ts Normal file
View File

@@ -0,0 +1,15 @@
import z, { ZodObject } from "zod";
export function makeSchemaParser<TSchema extends ZodObject>(schema: TSchema): SchemaParserFn<TSchema> {
return ((value: unknown | unknown[]) => {
if (Array.isArray(value)) {
return value.map((value: unknown) => schema.parse(value));
}
return schema.parse(value);
}) as SchemaParserFn<TSchema>;
}
type SchemaParserFn<TSchema extends ZodObject> = {
(value: unknown): z.infer<TSchema>;
(value: unknown[]): z.infer<TSchema>[];
};

11
spec/shared/email.ts Normal file
View File

@@ -0,0 +1,11 @@
import z from "zod";
export const EmailSchema = z.object({
type: z.enum(["personal", "work"]).describe("The context of the email address, e.g., personal or work."),
value: z.email().describe("A valid email address string."),
primary: z.boolean().describe("Indicates if this is the primary email."),
verified: z.boolean().describe("True if the email address has been verified."),
label: z.string().optional().describe("Optional display label for the email address."),
});
export type Email = z.infer<typeof EmailSchema>;

View File

@@ -0,0 +1,5 @@
export * from "./avatar.ts";
export * from "./contact.ts";
export * from "./database.ts";
export * from "./email.ts";
export * from "./name.ts";

8
spec/shared/name.ts Normal file
View File

@@ -0,0 +1,8 @@
import { z } from "zod";
export const NameSchema = z.object({
family: z.string().nullable().describe("Family name, also known as last name or surname."),
given: z.string().nullable().describe("Given name, also known as first name."),
});
export type Name = z.infer<typeof NameSchema>;