Skip to content

Commit 5911689

Browse files
committed
Updated preset field creation functions
- Gives error if duplicate presets
1 parent d5e30a2 commit 5911689

File tree

1 file changed

+64
-18
lines changed

1 file changed

+64
-18
lines changed

lib/fields/fields.ts

Lines changed: 64 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,23 @@ const createFieldPresetSchema = <T extends z.ZodTypeAny>(fieldSchema: T) =>
532532
)
533533
}, "Label is required if value is not a string.")
534534

535+
const createFieldPresetsSchema = <T extends z.ZodTypeAny>(fieldSchema: T) =>
536+
createFieldPresetSchema(fieldSchema)
537+
.array()
538+
.superRefine((arg, ctx) =>
539+
refineNoDuplicates(
540+
arg as { label?: string; value: unknown }[],
541+
ctx,
542+
"label",
543+
(v: { label?: string; value: unknown }) => {
544+
if (typeof v.value === "string" && v.value && !v.label) {
545+
return v.value
546+
}
547+
return v.label
548+
},
549+
),
550+
)
551+
535552
const createFieldArrayPresetSingleSchema = <T extends z.ZodTypeAny>(
536553
fieldSchema: z.ZodArray<T, any>,
537554
) => createFieldPresetSchema(fieldSchema.element)
@@ -565,48 +582,77 @@ const createFieldArrayPresetMultipleSchema = <T extends z.ZodTypeAny>(
565582
value: fieldSchema,
566583
})
567584

568-
function createFieldArrayPresetSchema<T extends z.ZodTypeAny>(
585+
function createFieldArrayPresetsSchema<T extends z.ZodTypeAny>(
569586
fieldSchema: z.ZodArray<T, any>,
570587
multiple: true,
571-
): ReturnType<typeof createFieldArrayPresetMultipleSchema<T>>
588+
): z.ZodEffects<
589+
z.ZodArray<ReturnType<typeof createFieldArrayPresetMultipleSchema<T>>>
590+
>
572591

573-
function createFieldArrayPresetSchema<T extends z.ZodTypeAny>(
592+
function createFieldArrayPresetsSchema<T extends z.ZodTypeAny>(
574593
fieldSchema: z.ZodArray<T, any>,
575594
multiple?: false | undefined,
576-
): ReturnType<typeof createFieldArrayPresetSingleSchema<T>>
595+
): z.ZodEffects<
596+
z.ZodArray<ReturnType<typeof createFieldArrayPresetSingleSchema<T>>>
597+
>
577598

578-
function createFieldArrayPresetSchema<T extends z.ZodTypeAny>(
599+
function createFieldArrayPresetsSchema<T extends z.ZodTypeAny>(
579600
fieldSchema: z.ZodArray<T, any>,
580601
multiple?: boolean,
581602
):
582-
| ReturnType<typeof createFieldArrayPresetMultipleSchema<T>>
583-
| ReturnType<typeof createFieldArrayPresetSingleSchema<T>> {
603+
| z.ZodEffects<
604+
z.ZodArray<ReturnType<typeof createFieldArrayPresetMultipleSchema<T>>>
605+
>
606+
| z.ZodEffects<
607+
z.ZodArray<ReturnType<typeof createFieldArrayPresetSingleSchema<T>>>
608+
> {
584609
if (multiple) {
585610
return createFieldArrayPresetMultipleSchema(fieldSchema)
611+
.array()
612+
.superRefine((arg, ctx) =>
613+
refineNoDuplicates(
614+
arg,
615+
ctx,
616+
"label",
617+
(v: GetElementType<typeof arg>) => v.label,
618+
),
619+
)
586620
} else {
587621
return createFieldArrayPresetSingleSchema(fieldSchema)
622+
.array()
623+
.superRefine((arg, ctx) =>
624+
refineNoDuplicates(
625+
arg as { label?: string; value: unknown }[],
626+
ctx,
627+
"label",
628+
(v: { label?: string; value: unknown }) => {
629+
if (typeof v.value === "string" && v.label === undefined) {
630+
return v.value
631+
}
632+
return v.label
633+
},
634+
),
635+
)
588636
}
589637
}
590638

591639
export const settingsSchema = z.object({
592640
id: z.number().int().optional(),
593641
//TODO: Implement creating field preset schemas dynamically
594642
mfrFieldPresets: z.object({
595-
requiredEquipment: createFieldArrayPresetSchema(
643+
requiredEquipment: createFieldArrayPresetsSchema(
596644
mfrSchema.shape.requiredEquipment,
597-
).array(),
598-
compoundingMethod: createFieldPresetSchema(
645+
),
646+
compoundingMethod: createFieldPresetsSchema(
599647
mfrSchema.shape.compoundingMethod,
600-
).array(),
601-
qualityControls: createFieldArrayPresetSchema(
648+
),
649+
qualityControls: createFieldArrayPresetsSchema(
602650
mfrSchema.shape.qualityControls,
603651
true,
604-
).array(),
605-
packaging: createFieldPresetSchema(mfrSchema.shape.packaging).array(),
606-
labelling: createFieldArrayPresetSchema(mfrSchema.shape.labelling).array(),
607-
references: createFieldArrayPresetSchema(
608-
mfrSchema.shape.references,
609-
).array(),
652+
),
653+
packaging: createFieldPresetsSchema(mfrSchema.shape.packaging),
654+
labelling: createFieldArrayPresetsSchema(mfrSchema.shape.labelling),
655+
references: createFieldArrayPresetsSchema(mfrSchema.shape.references),
610656
}),
611657
})
612658

0 commit comments

Comments
 (0)