mirror of
https://github.com/versia-pub/api.git
synced 2025-12-06 16:38:20 +01:00
113 lines
3.8 KiB
TypeScript
113 lines
3.8 KiB
TypeScript
/**
|
|
* Vanity extension schema.
|
|
* @module federation/schemas/extensions/vanity
|
|
* @see module:federation/schemas/base
|
|
* @see https://versia.pub/extensions/vanity
|
|
*/
|
|
|
|
import { z } from "zod";
|
|
import {
|
|
AudioOnlyContentFormatSchema,
|
|
ImageOnlyContentFormatSchema,
|
|
} from "../content_format.ts";
|
|
import { ianaTimezoneRegex, isISOString } from "../regex.ts";
|
|
|
|
/**
|
|
* @description Vanity extension entity
|
|
* @see https://versia.pub/extensions/vanity
|
|
* @example
|
|
* {
|
|
* // ...
|
|
* "type": "User",
|
|
* // ...
|
|
* "extensions": {
|
|
* "pub.versia:vanity": {
|
|
* "avatar_overlays": [
|
|
* {
|
|
* "image/png": {
|
|
* "content": "https://cdn.example.com/ab5081cf-b11f-408f-92c2-7c246f290593/cat_ears.png",
|
|
* "remote": true,
|
|
* }
|
|
* }
|
|
* ],
|
|
* "avatar_mask": {
|
|
* "image/png": {
|
|
* "content": "https://cdn.example.com/d8c42be1-d0f7-43ef-b4ab-5f614e1beba4/rounded_square.jpeg",
|
|
* "remote": true,
|
|
* }
|
|
* },
|
|
* "background": {
|
|
* "image/png": {
|
|
* "content": "https://cdn.example.com/6492ddcd-311e-4921-9567-41b497762b09/untitled-file-0019822.png",
|
|
* "remote": true,
|
|
* }
|
|
* },
|
|
* "audio": {
|
|
* "audio/mpeg": {
|
|
* "content": "https://cdn.example.com/4da2f0d4-4728-4819-83e4-d614e4c5bebc/michael-jackson-thriller.mp3",
|
|
* "remote": true,
|
|
* }
|
|
* },
|
|
* "pronouns": {
|
|
* "en-us": [
|
|
* "he/him",
|
|
* {
|
|
* "subject": "they",
|
|
* "object": "them",
|
|
* "dependent_possessive": "their",
|
|
* "independent_possessive": "theirs",
|
|
* "reflexive": "themself"
|
|
* },
|
|
* ]
|
|
* },
|
|
* "birthday": "1998-04-12",
|
|
* "location": "+40.6894-074.0447/",
|
|
* "aliases": [
|
|
* "https://burger.social/accounts/349ee237-c672-41c1-aadc-677e185f795a",
|
|
* "https://versia.social/users/f565ef02-035d-4974-ba5e-f62a8558331d"
|
|
* ]
|
|
* }
|
|
* }
|
|
* }
|
|
*/
|
|
export const VanityExtensionSchema = z
|
|
.object({
|
|
avatar_overlays: z
|
|
.array(ImageOnlyContentFormatSchema)
|
|
.optional()
|
|
.nullable(),
|
|
avatar_mask: ImageOnlyContentFormatSchema.optional().nullable(),
|
|
background: ImageOnlyContentFormatSchema.optional().nullable(),
|
|
audio: AudioOnlyContentFormatSchema.optional().nullable(),
|
|
pronouns: z.record(
|
|
z.string(),
|
|
z.array(
|
|
z.union([
|
|
z
|
|
.object({
|
|
subject: z.string(),
|
|
object: z.string(),
|
|
dependent_possessive: z.string(),
|
|
independent_possessive: z.string(),
|
|
reflexive: z.string(),
|
|
})
|
|
.strict(),
|
|
z.string(),
|
|
]),
|
|
),
|
|
),
|
|
birthday: z
|
|
.string()
|
|
.refine((v) => isISOString(v), "must be a valid ISO8601 datetime")
|
|
.optional()
|
|
.nullable(),
|
|
location: z.string().optional().nullable(),
|
|
aliases: z.array(z.string().url()).optional().nullable(),
|
|
timezone: z
|
|
.string()
|
|
.regex(ianaTimezoneRegex, "must be a valid IANA timezone")
|
|
.optional()
|
|
.nullable(),
|
|
})
|
|
.strict();
|