/** * Zod schemas for plugin settings validation (run on save). */ import { __ } from '@wordpress/i18n'; import { z } from 'zod'; const requiredString = (msg: string) => z.string().trim().min(1, msg); export const defaultShippingSchema = z.object({ contactName: requiredString(__('Name is required.', 'parcel2go-shipping')), organisation: z.string(), property: requiredString(__('Property (House number) is required.', 'parcel2go-shipping')), street: requiredString(__('Address line 1 is required.', 'parcel2go-shipping')), town: requiredString(__('Town / City is required.', 'parcel2go-shipping')), postcode: requiredString(__('Postcode is required.', 'parcel2go-shipping')), county: z.string(), country: requiredString(__('Country is required.', 'parcel2go-shipping')), email: z.email(__('Enter a valid email address.', 'parcel2go-shipping')), phone: requiredString(__('Phone is required.', 'parcel2go-shipping')), }); export const packagePresetSchema = z.object({ id: z.string().optional(), name: z.string().min(1, __('Package name is required.', 'parcel2go-shipping')), length: z.number().positive(__('Length must be greater than 0.', 'parcel2go-shipping')), width: z.number().positive(__('Width must be greater than 0.', 'parcel2go-shipping')), height: z.number().positive(__('Height must be greater than 0.', 'parcel2go-shipping')), weight: z.number().optional() }); export const packagePresetArraySchema = z.array(packagePresetSchema); export const taxSettingsSchema = z.object({ vatNumber: z.string().max(32, __('VAT number must be at most 32 characters.', 'parcel2go-shipping')), eori: z .string() .trim() .max(20, __('EORI number must be at most 20 characters.', 'parcel2go-shipping')) .refine( (value) => value === '' || /^([gG][bB][0-9]{12}|[gG][bB][0-9]{15})$|^(?![gG][bB])([A-z]{2}.{7,18})$|^(GBUNREG)$/.test(value), __( 'EORI number format is invalid. Must be GB followed by 12 or 15 digits, or 2 letters followed by 7-18 characters.', 'parcel2go-shipping' ) ), vatStatus: z.enum(['individual', 'business-not-registered', 'business-registered']), }); export const defaultSettingsOverridesSchema = z.object({ defaultWeightKg: z .number() .refine( (value) => value === 0 || value > 0, __('Weight must be greater than 0.', 'parcel2go-shipping') ), defaultTariffCode: z.string().max(10, __('Tariff code must be at most 10 characters.', 'parcel2go-shipping')), defaultCountryOfManufacture: z.string(), }); export const pluginSettingsSchema = z.object({ shipping: defaultShippingSchema, packages: z.array(packagePresetSchema), defaultPackageId: z.string(), tax: taxSettingsSchema, overrides: defaultSettingsOverridesSchema, }); export type DefaultShippingInput = z.infer; export type PackagePresetInput = z.infer; export type TaxSettingsInput = z.infer; export type DefaultSettingsOverridesInput = z.infer; export type PluginSettingsInput = z.infer;