26 lines
818 B
TypeScript
26 lines
818 B
TypeScript
|
import { z } from "zod/v4-mini";
|
||
|
|
||
|
export const idSchema = z.number();
|
||
|
export type Id = z.infer<typeof idSchema>;
|
||
|
|
||
|
export const entityLivingSchema = z.object({
|
||
|
id: idSchema,
|
||
|
updatedAt: z.string(),
|
||
|
deleted: z.optional(z.literal(false)),
|
||
|
});
|
||
|
export type EnityLiving = z.infer<typeof entityLivingSchema>;
|
||
|
|
||
|
export const entityToombstoneSchema = z.object({
|
||
|
id: idSchema,
|
||
|
updatedAt: z.string(),
|
||
|
deleted: z.literal(true),
|
||
|
});
|
||
|
export type EntityToombstone = z.infer<typeof entityToombstoneSchema>;
|
||
|
|
||
|
export const entitySchema = z.discriminatedUnion("deleted", [entityLivingSchema, entityToombstoneSchema]);
|
||
|
export type Entity = z.infer<typeof entitySchema>;
|
||
|
|
||
|
export function defineEntity<T extends {}>(fields: T) {
|
||
|
return z.discriminatedUnion("deleted", [z.extend(entityLivingSchema, fields), entityToombstoneSchema]);
|
||
|
}
|