import {z} from 'zod' export type AddressInputComponentName = {forename?: (string | null) | undefined, middlename?: (string | null) | undefined, surname?: (string | null) | undefined}; export type AddressRestrictionRules = {exists?: (boolean | null) | undefined, must_be?: (Array | null) | undefined, must_not_be?: (Array | null) | undefined}; export type AddressLocalityConstrains = {region?: AddressRestrictionRules | undefined}; export type AddressInputComponents = {unspecified?: (Array | null) | undefined, names?: (Array | null) | undefined, locality?: AddressLocalityConstrains | undefined}; export type AddressSuggestionsFormatV1Request = {country_iso: string, datasets: Array, max_suggestions?: (number | null) | undefined, components: AddressInputComponents, layouts?: (Array | null) | undefined}; export type CreateApiAddressSuggestionsFormatV1Args = {'Reference-Id'?: string | undefined, 'Timeout-Seconds'?: number | undefined, 'Add-Components'?: boolean | undefined, 'Add-Metadata'?: boolean | undefined, body: AddressSuggestionsFormatV1Request}; export type CreateApiAddressSuggestionsFormatV1Options = {baseUrl?: string | undefined, OAuth2?: string | undefined, fetch?: typeof fetch | undefined}; export const responseError = z.object({type: z.string().nullable().optional(), title: z.string().nullable().optional(), detail: z.string().nullable().optional(), instance: z.string().nullable().optional()}); export const address7Lines = z.object({address_line_1: z.string().nullable().optional(), address_line_2: z.string().nullable().optional(), address_line_3: z.string().nullable().optional(), locality: z.string().nullable().optional(), region: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), country: z.string().nullable().optional()}); export const addressFormatted = z.object({layout_name: z.string().nullable().optional(), not_enough_lines: z.boolean().optional(), has_truncated_lines: z.boolean().optional(), address: z.record(z.string(), z.unknown()).nullable().optional()}); export const addressComponentPostalCode = z.object({full_name: z.string().nullable().optional(), primary: z.string().nullable().optional(), secondary: z.string().nullable().optional()}); export const addressComponentDeliveryService = z.object({full_name: z.string().nullable().optional(), service_type: z.string().nullable().optional(), service_number: z.string().nullable().optional(), post_centre_name: z.string().nullable().optional()}); export const addressComponentSubBuildingItem = z.object({full_name: z.string().nullable().optional(), type: z.string().nullable().optional(), value: z.string().nullable().optional()}); export const addressComponentSubBuilding = z.object({name: z.string().nullable().optional(), entrance: addressComponentSubBuildingItem.optional(), floor: addressComponentSubBuildingItem.optional(), door: addressComponentSubBuildingItem.optional()}); export const addressComponentBuilding = z.object({building_name: z.string().nullable().optional(), secondary_name: z.string().nullable().optional(), building_number: z.string().nullable().optional(), secondary_number: z.string().nullable().optional(), allotment_number: z.string().nullable().optional()}); export const addressComponentBusinessOrganization = z.object({company_name: z.string().nullable().optional()}); export const addressComponentOrganization = z.object({department_name: z.string().nullable().optional(), secondary_department_name: z.string().nullable().optional(), company_name: z.string().nullable().optional(), business: addressComponentBusinessOrganization.optional()}); export const addressComponentStreet = z.object({full_name: z.string().nullable().optional(), prefix: z.string().nullable().optional(), name: z.string().nullable().optional(), type: z.string().nullable().optional(), suffix: z.string().nullable().optional()}); export const addressComponentRouteService = z.object({full_name: z.string().nullable().optional(), service_type: z.string().nullable().optional(), service_number: z.string().nullable().optional(), delivery_name: z.string().nullable().optional(), qualifier: z.string().nullable().optional()}); export const addressComponentLocalityItem = z.object({name: z.string().nullable().optional(), code: z.string().nullable().optional(), description: z.string().nullable().optional()}); export const addressComponentLocality = z.object({region: addressComponentLocalityItem.optional(), sub_region: addressComponentLocalityItem.optional(), town: addressComponentLocalityItem.optional(), district: addressComponentLocalityItem.optional(), sub_district: addressComponentLocalityItem.optional()}); export const addressComponentAdditionalSubRegion = z.object({administrative_county: z.string().nullable().optional(), former_postal_county: z.string().nullable().optional(), traditional_county: z.string().nullable().optional()}); export const addressComponentAdditionalLocality = z.object({sub_region: addressComponentAdditionalSubRegion.optional()}); export const addressComponentAdditionalElements = z.object({locality: addressComponentAdditionalLocality.optional()}); export const addressComponent = z.object({language: z.string().nullable().optional(), country_name: z.string().nullable().optional(), country_iso_3: z.string().nullable().optional(), country_iso_2: z.string().nullable().optional(), country_iso_numeric: z.string().nullable().optional(), postal_code: addressComponentPostalCode.optional(), delivery_service: addressComponentDeliveryService.optional(), secondary_delivery_service: addressComponentDeliveryService.optional(), sub_building: addressComponentSubBuilding.optional(), building: addressComponentBuilding.optional(), organization: addressComponentOrganization.optional(), street: addressComponentStreet.optional(), secondary_street: addressComponentStreet.optional(), route_service: addressComponentRouteService.optional(), locality: addressComponentLocality.optional(), physical_locality: addressComponentLocality.optional(), additional_elements: addressComponentAdditionalElements.optional()}); export const addressMetadataInfoId = z.object({umrrn: z.string().nullable().optional(), udprn: z.string().nullable().optional(), uprn: z.string().nullable().optional(), dpid: z.string().nullable().optional(), gnafPid: z.string().nullable().optional(), paf_address_key: z.string().nullable().optional(), hin: z.string().nullable().optional(), organization_key: z.string().nullable().optional(), lpi_key: z.string().nullable().optional(), dps: z.string().nullable().optional(), parent_uprn: z.string().nullable().optional(), building_id: z.string().nullable().optional()}); export const addressMetadataInfo = z.object({sources: z.array(z.string()).nullable().optional(), number_of_households: z.string().nullable().optional(), just_built_date: z.string().nullable().optional(), identifier: addressMetadataInfoId.optional()}); export const addressMetadataBarcode = z.object({delivery_point_barcode: z.string().nullable().optional(), check_digit: z.string().nullable().optional(), sort_plan_number: z.string().nullable().optional()}); export const addressMetadataRouteClassification = z.object({carrier_route: z.string().nullable().optional(), id: z.string().nullable().optional(), elot: z.string().nullable().optional(), roudis_id: z.string().nullable().optional()}); export const addressMetadataAddressType = z.object({code: z.string().nullable().optional(), description: z.string().nullable().optional()}); export const addressMetadataAddressClassification = z.object({address_type: addressMetadataAddressType.optional(), delivery_type: z.string().nullable().optional(), is_deliverable: z.string().nullable().optional()}); export const addressMetadataDpv = z.object({cmra_indicator: z.string().nullable().optional(), seed_indicator: z.string().nullable().optional(), dpv_indicator: z.string().nullable().optional(), footnotes: z.array(z.string()).nullable().optional(), vacancy_indicator: z.string().nullable().optional(), no_stats_indicator: z.string().nullable().optional(), pbsa_indicator: z.string().nullable().optional(), lacs_indicator: z.string().nullable().optional(), lacs_code: z.string().nullable().optional(), urbanization: z.string().nullable().optional(), delivery_line_1: z.string().nullable().optional(), delivery_line_2: z.string().nullable().optional(), last_line: z.string().nullable().optional(), no_stat_reason_code: z.array(z.string()).nullable().optional(), drop: z.string().nullable().optional(), throwback: z.string().nullable().optional(), non_delivery_days_indicator: z.string().nullable().optional(), non_delivery_days_value: z.array(z.string()).nullable().optional(), no_secure_location: z.string().nullable().optional(), door_not_accessible: z.string().nullable().optional(), enhanced_dpv_code: z.string().nullable().optional(), firm_name: z.string().nullable().optional()}); export const addressMetadata = z.object({address_info: addressMetadataInfo.optional(), barcode: addressMetadataBarcode.optional(), route_classification: addressMetadataRouteClassification.optional(), address_classification: addressMetadataAddressClassification.optional(), dpv: addressMetadataDpv.optional()}); export const addressSuggestionsFormatV1 = z.object({global_address_key: z.string().nullable().optional(), address: address7Lines.optional(), addresses_formatted: z.array(addressFormatted).nullable().optional(), components: addressComponent.optional(), metadata: addressMetadata.optional()}); export const addressSuggestionsFormatV1Result = z.object({more_results_available: z.boolean().optional(), confidence: z.string().nullable().optional(), suggestions: z.array(addressSuggestionsFormatV1).nullable().optional()}); export const addressSuggestionsFormatV1Response = z.object({error: responseError.optional(), result: addressSuggestionsFormatV1Result.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Search and format a list of suggestions. * * POST /address/suggestions/format/v1 * * Also accepts auth: Auth-Token, x-app-key */ export const createApiAddressSuggestionsFormatV1 = async (args: CreateApiAddressSuggestionsFormatV1Args, options?: CreateApiAddressSuggestionsFormatV1Options) => { const {baseUrl = "https://api.experianaperture.io", fetch: fetchFn = fetch, OAuth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['Reference-Id'] != null) headers.set("Reference-Id", String(args['Reference-Id'])) if (args['Timeout-Seconds'] != null) headers.set("Timeout-Seconds", String(args['Timeout-Seconds'])) if (args['Add-Components'] != null) headers.set("Add-Components", String(args['Add-Components'])) if (args['Add-Metadata'] != null) headers.set("Add-Metadata", String(args['Add-Metadata'])) if (OAuth2 !== undefined) headers.set('authorization', `Bearer ${OAuth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/address/suggestions/format/v1${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(addressSuggestionsFormatV1Response, await res.json()) };