Files
chartdb/src/lib/domain/diff/area-diff.ts
Guy Ben-Aharon 98f6edd5c8 fix: add areas width and height + table width to diff check (#931)
* fix: add areas width and height + table width to diff check

* fix
2025-09-23 11:12:46 +03:00

78 lines
1.9 KiB
TypeScript

import { z } from 'zod';
import type { Area } from '../area';
export type AreaDiffAttribute = keyof Pick<
Area,
'name' | 'color' | 'x' | 'y' | 'width' | 'height'
>;
const areaDiffAttributeSchema: z.ZodType<AreaDiffAttribute> = z.union([
z.literal('name'),
z.literal('color'),
z.literal('x'),
z.literal('y'),
z.literal('width'),
z.literal('height'),
]);
export interface AreaDiffChanged {
object: 'area';
type: 'changed';
areaId: string;
attribute: AreaDiffAttribute;
oldValue?: string | number | null;
newValue?: string | number | null;
}
export const AreaDiffChangedSchema: z.ZodType<AreaDiffChanged> = z.object({
object: z.literal('area'),
type: z.literal('changed'),
areaId: z.string(),
attribute: areaDiffAttributeSchema,
oldValue: z.union([z.string(), z.number(), z.null()]).optional(),
newValue: z.union([z.string(), z.number(), z.null()]).optional(),
});
export interface AreaDiffRemoved {
object: 'area';
type: 'removed';
areaId: string;
}
export const AreaDiffRemovedSchema: z.ZodType<AreaDiffRemoved> = z.object({
object: z.literal('area'),
type: z.literal('removed'),
areaId: z.string(),
});
export interface AreaDiffAdded<T = Area> {
object: 'area';
type: 'added';
areaAdded: T;
}
export const createAreaDiffAddedSchema = <T = Area>(
areaSchema: z.ZodType<T>
): z.ZodType<AreaDiffAdded<T>> => {
return z.object({
object: z.literal('area'),
type: z.literal('added'),
areaAdded: areaSchema,
}) as z.ZodType<AreaDiffAdded<T>>;
};
export type AreaDiff<T = Area> =
| AreaDiffChanged
| AreaDiffRemoved
| AreaDiffAdded<T>;
export const createAreaDiffSchema = <T = Area>(
areaSchema: z.ZodType<T>
): z.ZodType<AreaDiff<T>> => {
return z.union([
AreaDiffChangedSchema,
AreaDiffRemovedSchema,
createAreaDiffAddedSchema(areaSchema),
]) as z.ZodType<AreaDiff<T>>;
};