2025-11-21 08:31:02 +01:00
|
|
|
import { z } from "zod";
|
2025-04-08 16:01:10 +02:00
|
|
|
import { isISOString } from "../regex.ts";
|
|
|
|
|
import { CustomEmojiExtensionSchema } from "./extensions/emojis.ts";
|
|
|
|
|
|
|
|
|
|
export const ExtensionPropertySchema = z
|
|
|
|
|
.object({
|
|
|
|
|
"pub.versia:custom_emojis":
|
|
|
|
|
CustomEmojiExtensionSchema.optional().nullable(),
|
|
|
|
|
})
|
|
|
|
|
.catchall(z.any());
|
|
|
|
|
|
2026-02-25 02:34:27 +01:00
|
|
|
export const ReferenceSchema = z.string();
|
|
|
|
|
|
2025-04-08 16:01:10 +02:00
|
|
|
export const EntitySchema = z.strictObject({
|
2025-05-01 16:27:34 +02:00
|
|
|
// biome-ignore lint/style/useNamingConvention: required for JSON schema
|
2025-07-07 03:42:35 +02:00
|
|
|
$schema: z.url().nullish(),
|
2026-02-25 02:34:27 +01:00
|
|
|
id: z
|
|
|
|
|
.string()
|
|
|
|
|
.max(512)
|
|
|
|
|
.regex(
|
|
|
|
|
// a-z, A-Z, 0-9, - and _
|
|
|
|
|
/^[A-Za-z0-9\-_]+$/,
|
|
|
|
|
"can only contain alphanumeric characters, hyphens and underscores",
|
|
|
|
|
),
|
2025-04-08 16:01:10 +02:00
|
|
|
created_at: z
|
|
|
|
|
.string()
|
2026-02-25 02:34:27 +01:00
|
|
|
.refine((v) => isISOString(v), "must be a valid RFC 3339 datetime"),
|
2025-04-08 16:01:10 +02:00
|
|
|
type: z.string(),
|
|
|
|
|
extensions: ExtensionPropertySchema.nullish(),
|
|
|
|
|
});
|
2026-02-25 02:34:27 +01:00
|
|
|
|
|
|
|
|
export const TransientEntitySchema = EntitySchema.extend({
|
|
|
|
|
id: z.null().optional(),
|
|
|
|
|
});
|