98 lines
2.9 KiB
TypeScript
98 lines
2.9 KiB
TypeScript
import { z } from "zod";
|
|
import { HANDEDNESS_OPTIONS, POSITIONS } from "@/lib/constants";
|
|
|
|
const optionalStat = z.union([z.coerce.number().int().min(0), z.null()]).optional();
|
|
|
|
export const playerSchema = z.object({
|
|
firstName: z.string().trim().min(1, "First name is required."),
|
|
lastName: z.string().trim().min(1, "Last name is required."),
|
|
jerseyNumber: z.coerce.number().int().min(0).max(999),
|
|
batsThrows: z.enum(HANDEDNESS_OPTIONS),
|
|
primaryPosition: z.enum(POSITIONS),
|
|
secondaryPosition: z.enum(POSITIONS).nullable().optional(),
|
|
tertiaryPosition: z.enum(POSITIONS).nullable().optional(),
|
|
isActive: z.boolean(),
|
|
notes: z.string().max(500).optional().default(""),
|
|
stats: z
|
|
.object({
|
|
gamesPlayed: optionalStat,
|
|
atBats: optionalStat,
|
|
runs: optionalStat,
|
|
hits: optionalStat,
|
|
doubles: optionalStat,
|
|
triples: optionalStat,
|
|
homeRuns: optionalStat,
|
|
runsBattedIn: optionalStat,
|
|
walks: optionalStat,
|
|
strikeouts: optionalStat,
|
|
stolenBases: optionalStat
|
|
})
|
|
.optional()
|
|
});
|
|
|
|
export const pitchingAppearanceSchema = z.object({
|
|
playerId: z.string().min(1),
|
|
gameDate: z.string().min(1),
|
|
pitchCount: z.coerce.number().int().min(1).max(200),
|
|
notes: z.string().max(300).optional().default("")
|
|
});
|
|
|
|
export const pitchingRulesSchema = z.array(
|
|
z.object({
|
|
minPitches: z.coerce.number().int().min(0),
|
|
maxPitches: z.coerce.number().int().positive().nullable(),
|
|
requiredRestDays: z.coerce.number().int().min(0).max(10)
|
|
})
|
|
).min(1);
|
|
|
|
export const generateLineupSchema = z.object({
|
|
gameDate: z.string().min(1),
|
|
playerIds: z.array(z.string()).min(1, "Select at least one player."),
|
|
startingPitcherId: z.string().nullable().optional()
|
|
});
|
|
|
|
export const saveLineupSchema = generateLineupSchema.extend({
|
|
battingOrder: z.array(
|
|
z.object({
|
|
playerId: z.string(),
|
|
playerName: z.string(),
|
|
slot: z.coerce.number().int().positive()
|
|
})
|
|
).min(1),
|
|
defensiveAssignments: z.array(
|
|
z.object({
|
|
playerId: z.string(),
|
|
playerName: z.string(),
|
|
position: z.enum(POSITIONS)
|
|
})
|
|
),
|
|
bench: z.array(z.string()),
|
|
notes: z.array(z.string())
|
|
});
|
|
|
|
export const saveGameSchema = z.object({
|
|
gameDate: z.string().min(1),
|
|
lineupId: z.string().min(1),
|
|
opponent: z.string().max(120).optional().default(""),
|
|
teamScore: z.union([z.coerce.number().int().min(0), z.null()]).optional(),
|
|
opponentScore: z.union([z.coerce.number().int().min(0), z.null()]).optional(),
|
|
notes: z.string().max(1000).optional().default(""),
|
|
playerStats: z.array(
|
|
z.object({
|
|
playerId: z.string().min(1),
|
|
playerName: z.string().min(1),
|
|
atBats: optionalStat,
|
|
runs: optionalStat,
|
|
hits: optionalStat,
|
|
doubles: optionalStat,
|
|
triples: optionalStat,
|
|
homeRuns: optionalStat,
|
|
runsBattedIn: optionalStat,
|
|
walks: optionalStat,
|
|
strikeouts: optionalStat,
|
|
stolenBases: optionalStat,
|
|
pitchCount: optionalStat
|
|
})
|
|
)
|
|
});
|