import { z } from 'zod/v4'; import { LooseArray, LooseRecord, NotCircular, } from '../../../util/schema-utils/index.ts'; export const CircleCiDocker = z .object({ image: z.string() }) .transform(({ image }) => image); export const CircleCiJob = z .object({ docker: LooseArray(CircleCiDocker).catch([]), }) .transform(({ docker }) => docker); export type CircleCiJob = z.infer; const CircleCiJobList = LooseRecord(CircleCiJob) .transform((x) => Object.values(x).flat()) .catch([]); const BaseOrb = z.object({ executors: CircleCiJobList, jobs: CircleCiJobList, }); type Orb = z.infer & { orbs: Record; }; export const CircleCiOrb: z.ZodType = BaseOrb.extend({ orbs: LooseRecord(z.union([z.string(), z.lazy(() => CircleCiOrb)])).catch({}), }); export type CircleCiOrb = z.infer; export const CircleCiFile = NotCircular.pipe( BaseOrb.extend({ aliases: LooseArray(CircleCiDocker).catch([]), orbs: LooseRecord(z.union([z.string(), CircleCiOrb])).catch({}), }), ); export type CircleCiFile = z.infer;