@tomtom-org/maps-sdk 0.46.2 → 0.46.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{mergeFromGlobal as e,generateTomTomHeaders as t,getPosition as r,poiCategoriesToID as n,poiIDsToCategories as i,toPointGeometry as a,views as o,bboxFromGeoJSON as s,bboxOnlyIfWithArea as c,generateId as l,poiCategories as d,bboxFromCoordsArray as p,plugTypes as u,currentTypes as m,avoidableTypes as g,getPositionStrict as h,getRoutePlanningLocationType as y,inputSectionTypesWithGuidance as b,inputSectionTypes as f,indexedMagnitudes as v,trafficIncidentToIconCategory as S,iconToTrafficIncidentCategory as T,trafficIncidentCategories as R}from"@tomtom-org/maps-sdk/core";import{z as C}from"zod";import{isNil as P,omit as x}from"lodash-es";var I=/* @__PURE__ */(e=>(e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e))(I||{});class w extends Error{constructor(e,t,r){super(e),this.service=t,this.issues=r,Error.captureStackTrace&&Error.captureStackTrace(this,w)}}const A={[I.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[I.FORBIDDEN]:"Request failed with status code 403"};class L extends w{constructor(e,t,r){super(e,t),this.status=r,this.status&&A[this.status]&&(this.message=A[this.status])}}const D=(e,t)=>{const{data:r,message:n,status:i}=e;return new L(r?.error||r?.errorText||n,t,i)},M=(e,t,r)=>{if(e.status){const n=e;return r?r(n,t):D(n,t)}return new w(e.message,t)},O=(e,t)=>new w(e.message,t,e.issues),E=C.object({apiKey:C.string().optional().describe("TomTom API key for authentication"),commonBaseURL:C.string().optional().describe("Common base URL for all services"),customServiceBaseURL:C.string().optional().describe("Custom base URL for specific service"),language:C.string().optional().describe('Language code for response text (e.g., "en-US", "nl-NL")')});class k extends Error{constructor(e){super(e.issues.map(e=>`${e.path.length>0?`${e.path.join(".")}: `:""}${e.message}`).join("; ")),this.issues=e.issues}}const F=async(r,n,i)=>{const a=n.getAPIVersion?.(r),o=e({...r,...a&&{apiVersion:a}});if(void 0===r.validateRequest||r.validateRequest)try{((e,t)=>{const r=(t?.schema?E.extend(t.schema.shape):E).superRefine((e,r)=>{if("commonBaseURL"in e||"customServiceBaseURL"in e||r.addIssue({code:"custom",message:"commonBaseURL or customServiceBaseURL is required"}),t?.refinements?.length)for(const n of t.refinements)n.check(e)||r.addIssue({code:"custom",message:n.message})}).safeParse(e);if(!r.success)throw new k(r.error)})(o,n.requestValidation)}catch(l){throw O(l,i)}const s=n.buildRequest(o),c=t(o);r.onAPIRequest?.(s);try{const e=await n.sendRequest(s,c);return r.onAPIResponse?.(s,e),n.parseResponse(await e.data,o)}catch(l){throw r.onAPIResponse?.(s,l),M(l,i,n.parseResponseError)}};class W extends Error{constructor(e,t,r){super(t??`HTTP Error ${e}`),this.name="FetchError",this.status=e,this.data=r,Error.captureStackTrace&&Error.captureStackTrace(this,W)}}const q=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,r;const n=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:n?.includes("application/json")?(r=await e.json(),t=r?.errorText??r?.message??r?.detailedError?.message):n?.includes("text/xml")&&(r=await e.text(),t=e.statusText),new W(e.status,t,r)},B=async(e,t)=>q(await fetch(e,{headers:t})),U=async(e,t)=>q(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),j=async(e,t)=>{const r=e.method;if("GET"===r)return B(e.url,t);if("POST"===r)return U(e,t);throw new Error(`Unsupported HTTP method received: ${r}`)},N=C.array(C.array(C.number())).describe("Array of coordinate arrays representing a line string"),H=C.object({type:C.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]).describe("GeoJSON geometry type"),coordinates:C.union([C.array(C.number()),N,C.array(C.array(C.array(C.number()))),C.array(C.array(C.array(C.array(C.number()))))]).describe("Coordinate array(s) for the geometry"),radius:C.optional(C.number()).describe("Radius for Circle geometries"),radiusMeters:C.optional(C.number()).describe("Radius in meters for Circle geometries"),bbox:C.optional(C.array(C.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}).check(C.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),V=C.object({type:C.literal("Feature").describe("GeoJSON type identifier"),geometry:H.describe("GeoJSON geometry object"),id:C.optional(C.union([C.string(),C.number()])).describe("Optional feature identifier"),properties:C.any().describe("Feature properties"),bbox:C.optional(C.array(C.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),G=C.object({type:C.literal("FeatureCollection").describe("GeoJSON type identifier"),features:C.array(V).describe("Array of GeoJSON features"),id:C.optional(C.union([C.string(),C.number()])).describe("Optional collection identifier"),properties:C.any().describe("Collection properties"),bbox:C.optional(C.array(C.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),K=C.union([C.tuple([C.number().min(-180).max(180),C.number().min(-90).max(90)]),C.tuple([C.number().min(-180).max(180),C.number().min(-90).max(90),C.number()]),C.object({type:C.literal("Point"),coordinates:C.array(C.number())}),V]).describe("Geographic position as [longitude, latitude] tuple, Point geometry, or Feature"),z=C.union([C.array(C.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),C.array(C.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]).describe("GeoJSON bounding box array [minLng, minLat, maxLng, maxLat] or [minLng, minLat, minAlt, maxLng, maxLat, maxAlt]"),$=C.union([H,V,G]).describe("Any GeoJSON object (Geometry, Feature, or FeatureCollection)"),_=C.union([z,$,C.array($)]).describe("Bounding box as array, GeoJSON object, or array of GeoJSON objects"),J=C.object({query:C.string().describe("Partial search query for autocomplete suggestions")}),Y=C.object({position:K.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:C.number().max(100).optional().describe("Maximum number of autocomplete suggestions to return (1-100)"),radiusMeters:C.number().optional().describe("Search radius in meters around the specified position"),countries:C.array(C.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)"),resultType:C.array(C.string()).optional().describe("Types of results to include in suggestions")}),Z=J.extend(Y.shape),Q=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},X=(e,t,r)=>{for(const n of r||[])e.append(t,n)},ee=(e,t,r)=>{Array.isArray(r)&&r.length>0&&e.append(t,r.join(","))},te=(e,t,r)=>{!P(r)&&e.append(t,String(r))},re=(e,t)=>{const n=r(t);n&&(e.append("lat",String(n[1])),e.append("lon",String(n[0])))},ne="/maps/orbis/places",ie=(e,t)=>{const r=e.searchParams;Q(r,t),te(r,"limit",t.limit),re(r,t.position),ee(r,"fuelSet",t.fuelTypes),ee(r,"idxSet",t.indexes),ee(r,"brandSet",t.poiBrands),t.poiCategories&&ee(r,"categorySet",t.poiCategories.map(e=>n[e])),ee(r,"connectorSet",t.connectors),ee(r,"mapcodes",t.mapcodes),ee(r,"extendedPostalCodesFor",t.extendedPostalCodesFor),te(r,"minPowerKW",t.minPowerKW),te(r,"maxPowerKW",t.maxPowerKW),te(r,"view",t.view),te(r,"openingHours",t.openingHours),te(r,"timeZone",t.timeZone),te(r,"relatedPois",t.relatedPois),ee(r,"entityTypeSet",t.geographyTypes)},ae=e=>{const t=new URL(`${r=e,r.customServiceBaseURL||`${r.commonBaseURL}${ne}/autocomplete/${r.query}.json`}`);var r;const n=t.searchParams;return e.language=e.language??"en-GB",Q(n,e),te(n,"limit",e.limit),re(n,e.position),ee(n,"countrySet",e.countries),te(n,"radius",e.radiusMeters),ee(n,"resultSet",e.resultType),t},oe=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},se=e=>`${e[1]},${e[0]}`,ce=e=>{let t,r;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],r=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=oe(e.southWest),r=oe(e.northEast)),[t[0],t[1],r[0],r[1]]},le=e=>[e.lon,e.lat],de=e=>{const{position:t,...r}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:le(t)},radiusMeters:r.radius}},results:(n=e.results,n.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...r}=e;return{...r,category:i[Number(t)]}}return e})})))};var n},pe={requestValidation:{schema:Z},buildRequest:ae,sendRequest:B,parseResponse:de},ue=async(e,t)=>F(e,{...pe,...t},"Autocomplete"),me={autocompleteSearch:ue,buildAutocompleteSearchRequest:ae,parseAutocompleteSearchResponse:de,autocompleteSearchTemplate:pe},ge=E.extend({id:C.string().describe("Unique identifier of the EV charging station")}),he=["fast","short","efficient","thrilling"],ye=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}${ne}/ev/id`)(e)),r=t.searchParams;return Q(r,e),r.append("id",e.id),t},be=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",fe=e=>{const t={count:0,statusCounts:{}};for(const r of e)for(const e of r.chargingPoints)t.count++,t.statusCounts[e.status]=(t.statusCounts[e.status]||0)+1;return t},ve=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,Se=(e,t,r)=>{if(e)for(const n of e){const e=r.find(e=>ve(n,e.connector));if(e){if(e.count++,t){const r=e.statusCounts;e.statusCounts[t]=(r[t]||0)+1}}else r.push({connector:n,count:1,statusCounts:t?{[t]:1}:{}})}},Te=e=>{const t=[];return((e,t)=>{if(e)for(const r of e){const e=t.find(e=>ve(r,e.connector));e?e.count++:t.push({connector:r,count:1})}})(e,t),t},Re=e=>{const t=[];for(const r of e)for(const e of r.chargingPoints)Se(e.connectors,e.status,t);return t},Ce=e=>{const{year:t,month:r,day:n}=(e=>{const t=e.split("-");return{year:Number.parseInt(t[0]),month:Number.parseInt(t[1]),day:Number.parseInt(t[2])}})(e.date);return{dateYYYYMMDD:e.date,year:t,month:r,day:n,hour:e.hour,minute:e.minute,date:new Date(t,r-1,n,e.hour,e.minute)}},Pe=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,xe=e=>{const t=e.timeRanges.map(e=>({start:Ce(e.startTime),end:Ce(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:Pe(t)}},Ie=e=>{const{position:t,entryPoints:r,poi:n,id:o,dist:s,boundingBox:c,chargingPark:l,...d}=e,p=l?.connectors?.map(e=>({...x(e,"connectorType"),type:e.connectorType,chargingSpeed:be(e.ratedPowerKW)}));return{type:"Feature",geometry:a(le(t)),...c&&{bbox:ce(c)},id:o,properties:{...x(d,"viewport"),...s&&{distance:s},...r?.length&&{entryPoints:r.map(e=>({...e,position:le(e.position)}))},...p?.length&&{chargingPark:{...l,connectors:Te(p)}},...n&&{poi:{name:n.name,categories:(n.categorySet?.map(e=>i[e.id])??[]).filter(e=>!!e),localizedCategories:n.categories??[],...n.phone&&{phone:n.phone},...n.brands&&{brands:n.brands.map(e=>e.name)},...n.url&&{url:n.url},...n.openingHours&&{openingHours:xe(n.openingHours)},...n.timeZone&&{timeZone:n.timeZone}}}}}},we=e=>{const{geoBias:t,...r}=e;return{...t&&{geoBias:le(t)},...r}},Ae=e=>{const t=e.results?.[0];return t?{id:t.id,accessType:t.accessType,chargingStations:(r=t.chargingStations,r.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,connectors:e.connectors?.map(e=>({...e,chargingSpeed:be(e.ratedPowerKW)}))}))}))),chargingPointAvailability:fe(t.chargingStations),connectorAvailabilities:Re(t.chargingStations),...t.openingHours&&{openingHours:xe(t.openingHours)}}:void 0;var r},Le={requestValidation:{schema:ge},buildRequest:ye,sendRequest:B,parseResponse:Ae,parseResponseError:(e,t)=>{const r=e.data?.detailedError?.message??e.message;return new L(r,t,e.status)}},De={buildEVChargingStationsAvailabilityRequest:ye,parseEVChargingStationsAvailabilityResponse:Ae,evChargingStationsAvailabilityTemplate:Le},Me=C.object({typeahead:C.boolean().optional().describe("Enable predictive/autocomplete mode for partial input queries"),offset:C.number().max(1900).optional().describe("Starting position within result set for pagination (zero-based index)"),radiusMeters:C.number().optional().describe("Search radius in meters around the specified position"),boundingBox:_.optional().describe("Bounding box to constrain search results to a rectangular area"),countries:C.array(C.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)")}),Oe=C.object({query:C.string().optional().describe("Search query for places, addresses, or locations"),position:K.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:C.number().max(100).optional().describe("Maximum number of results to return (1-100)"),extendedPostalCodesFor:C.array(C.string()).optional().describe("Indexes for which to include extended postal codes in results"),mapcodes:C.array(C.string()).optional().describe("Request mapcode representations for locations (Local, International, Alternative)"),view:C.enum(o).optional().describe("Geopolitical view for disputed territories"),geographyTypes:C.array(C.string()).optional().describe("Filter results to specific geography types (Country, Municipality, etc.)")}),Ee=E.extend(Oe.shape).extend(Me.shape).extend({query:C.string().describe("Search query for places, addresses, or locations")}),ke=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",Fe=(e,t)=>{const r=e.length;if(r<=t)return e;const n=[];let i;const a=Math.ceil(r/t);for(i=0;i<r;i+=a)n.push(e[i]);return i>=r-a&&(n.length<t?n.push(e[r-1]):n[n.length-1]=e[r-1]),n},We=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${ne}/geocode`)(e)}/${e.query}.json`),r=t.searchParams;Q(r,e),e.typeahead&&r.append("typeahead",String(e.typeahead)),!P(e.limit)&&r.append("limit",String(e.limit)),!P(e.offset)&&r.append("ofs",String(e.offset)),re(r,e.position),e.countries&&r.append("countrySet",ke(e.countries)),!P(e.radiusMeters)&&r.append("radius",String(e.radiusMeters));const n=e.boundingBox&&s(e.boundingBox);return n&&(r.append("topLeft",ke([n[3],n[0]])),r.append("btmRight",ke([n[1],n[2]]))),e.extendedPostalCodesFor&&r.append("extendedPostalCodesFor",ke(e.extendedPostalCodesFor)),e.mapcodes&&r.append("mapcodes",ke(e.mapcodes)),e.view&&r.append("view",e.view),e.geographyTypes&&r.append("entityTypeSet",ke(e.geographyTypes)),t},qe=e=>{const{position:t,boundingBox:r,dist:n,entryPoints:i,addressRanges:o,entityType:s,id:c,...l}=e;return{type:"Feature",geometry:a(le(t)),...r&&{bbox:ce(r)},id:c,properties:{...x(l,"viewport"),...n&&{distance:n},...s&&{geographyType:s.split(",")},...i&&{entryPoints:i.map(e=>({...e,position:le(e.position)}))},...o&&{addressRanges:{...o,from:le(o.from),to:le(o.to)}}}}},Be=e=>{const t=e.results.map(qe),r=c(s(t));return{type:"FeatureCollection",features:t,...r&&{bbox:r}}},Ue={requestValidation:{schema:Ee},buildRequest:We,sendRequest:B,parseResponse:Be},je={buildGeocodingRequest:We,parseGeocodingResponse:Be,geocodingTemplate:Ue},Ne=C.object({geometries:C.union([G,C.array(C.union([C.string(),V])).min(1).max(20)]).describe("GeoJSON FeatureCollection or array of geometry IDs/Features (max 20)")}),He=C.object({zoom:C.number().min(0).max(22).optional().describe("Zoom level for geometry data simplification (0-22)")}),Ve=Ne.extend(He.shape),Ge=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),Ke=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}${ne}/additionalData.json`)(e)),r=t.searchParams;return r.append("apiVersion",String(e.apiVersion)),r.append("key",e.apiKey),((e,t)=>{let r;r=Array.isArray(t)?"string"==typeof t[0]?t:Ge(t):Ge(t.features),e.append("geometries",ke(r))})(r,e.geometries),te(r,"geometriesZoom",e.zoom),t},ze=e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??l(),bbox:s(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:s(t),features:t}},$e={requestValidation:{schema:Ve},buildRequest:Ke,sendRequest:B,parseResponse:ze},_e={buildGeometryDataRequest:Ke,parseGeometryDataResponse:ze,geometryDataTemplate:$e},Je=C.object({indexes:C.array(C.string()).optional().describe("Search indexes to query (Geo, PAD, Addr, Str, XStr, POI)"),poiCategories:C.array(C.enum(d)).optional().describe("Filter results to specific POI categories"),poiBrands:C.array(C.string()).optional().describe("Filter results to specific POI brands"),connectors:C.array(C.string()).optional().describe("Filter EV charging stations by connector types"),fuelTypes:C.array(C.string()).optional().describe("Filter fuel stations by available fuel types"),openingHours:C.string().optional().describe("Request opening hours information for POIs"),timeZone:C.string().optional().describe("Request timezone information for POI locations (iana)"),relatedPois:C.string().optional().describe("Related POI inclusion mode (off, child, parent, all)"),minPowerKW:C.number().optional().describe("Minimum charging power in kilowatts for EV charging stations"),maxPowerKW:C.number().optional().describe("Maximum charging power in kilowatts for EV charging stations"),minFuzzyLevel:C.number().optional().describe("Minimum fuzzy matching level (1-4)"),mixFuzzyLevel:C.number().optional().describe("Maximum fuzzy matching level (1-4)")}),Ye=Oe.extend(Je.shape),Ze=C.object({geometries:C.array(C.union([G,H])).describe("Array of GeoJSON geometries or FeatureCollections to search within")}),Qe=Ye.extend(Ze.shape),Xe=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:se(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:Fe(e.coordinates[0],50).map(e=>se(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const r=p(e[0]);if(r){const n=Math.abs((r[2]-r[0])*(r[3]-r[1]));t.set(e,n)}}),t=new Map([...t.entries()].sort((e,t)=>t[1]-e[1]).splice(0,50)),[...t.keys()]})(e).flatMap(e=>Xe({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>Xe({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>Xe(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},et=e=>{const t=new URL(`${r=e,r.customServiceBaseURL??`${r.commonBaseURL}${ne}/geometrySearch/${r.query??""}.json`}`);var r;return ie(t,e),{url:t,data:{geometryList:e.geometries.flatMap(Xe)}}},tt=e=>{const t=e.results.map(Ie),r=c(s(t));return{type:"FeatureCollection",properties:{...we(e.summary)},features:t,...r&&{bbox:r}}},rt={requestValidation:{schema:Qe},buildRequest:et,sendRequest:U,parseResponse:tt},nt=async(e,t)=>F(e,{...rt,...t},"GeometrySearch"),it={geometrySearch:nt,buildGeometrySearchRequest:et,parseGeometrySearchResponse:tt,geometrySearchTemplate:rt},at=C.object({entityId:C.string().describe("Unique identifier of the place/entity to retrieve")}),ot=C.object({mapcodes:C.array(C.string()).optional().describe("Request mapcode representations for location"),view:C.enum(o).optional().describe("Geopolitical view for disputed territories"),openingHours:C.string().optional().describe("Request opening hours information for the place"),timeZone:C.string().optional().describe("Request timezone information for the place location"),relatedPois:C.string().optional().describe("Related POI inclusion mode (off, child, parent, all)")}),st=at.extend(ot.shape),ct=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${ne}/place.json`)(e)}`),r=t.searchParams;return Q(r,e),te(r,"entityId",e.entityId),ee(r,"mapcodes",e.mapcodes),te(r,"view",e.view),te(r,"openingHours",e.openingHours),te(r,"timeZone",e.timeZone),te(r,"relatedPois",e.relatedPois),t},lt=e=>e.results?.length?Ie(e.results[0]):void 0,dt={requestValidation:{schema:st},buildRequest:ct,sendRequest:B,parseResponse:lt},pt={buildPlaceByIdRequest:ct,parsePlaceByIdResponse:lt,placeByIdTemplate:dt},ut=(e,t)=>{const{data:r,message:n,status:i}=e;return new L(r?.error?.description??r?.detailedError?.message??n,t,i)},mt=C.number().positive(),gt=C.number().min(0),ht=C.number().min(0).max(100),yt=mt.optional(),bt=gt.optional(),ft=C.number().min(0).max(1).optional(),vt=C.object({speedKMH:C.number().describe("Speed in kilometers per hour"),consumptionUnitsPer100KM:C.number().describe("Consumption rate per 100 kilometers")}),St={efficiency:C.object({acceleration:ft.describe("Acceleration efficiency factor (0-1)"),deceleration:ft.describe("Deceleration efficiency factor (0-1)"),uphill:ft.describe("Uphill efficiency factor (0-1)"),downhill:ft.describe("Downhill efficiency factor (0-1)")}).optional()},Tt=C.array(vt).min(1).max(25),Rt=C.object({...St,speedsToConsumptionsLiters:Tt.describe("Array of speed-to-fuel-consumption mappings in liters per 100km"),auxiliaryPowerInLitersPerHour:bt.describe("Auxiliary power consumption in liters per hour"),fuelEnergyDensityInMJoulesPerLiter:C.number().min(1).optional().describe("Fuel energy density in megajoules per liter")}),Ct=C.object({...St,speedsToConsumptionsKWH:Tt.describe("Array of speed-to-energy-consumption mappings in kWh per 100km"),auxiliaryPowerInkW:bt.describe("Auxiliary power consumption in kilowatts"),consumptionInKWHPerKMAltitudeGain:C.number().max(500).optional().describe("Energy consumption per kilometer of altitude gain in kWh"),recuperationInKWHPerKMAltitudeLoss:bt.describe("Energy recuperation per kilometer of altitude loss in kWh")}),Pt=C.object({currentType:C.enum(m).describe("Type of electrical current (AC or DC)"),plugTypes:C.array(C.enum(u)).min(1).describe("Compatible plug/connector types"),efficiency:ft.describe("Charging efficiency factor (0-1)"),baseLoadInkW:bt.describe("Base load in kilowatts"),maxPowerInkW:bt.describe("Maximum charging power in kilowatts"),maxVoltageInV:bt.describe("Maximum voltage in volts"),maxCurrentInA:bt.describe("Maximum current in amperes"),voltageRange:C.object({minVoltageInV:bt.describe("Minimum voltage in volts"),maxVoltageInV:C.number().optional().describe("Maximum voltage in volts")}).optional().describe("Acceptable voltage range")}),xt=C.object({stateOfChargeInkWh:gt.describe("State of charge in kilowatt-hours"),maxPowerInkW:mt.describe("Maximum charging power at this state of charge in kilowatts")}),It=C.object({maxChargeKWH:mt.describe("Maximum battery capacity in kilowatt-hours"),batteryCurve:C.array(xt).max(20).optional().describe("Battery charging curve with up to 20 data points"),chargingConnectors:C.array(Pt).min(1).optional().describe("Available charging connectors on the vehicle"),chargingTimeOffsetInSec:bt.describe("Time offset for charging start in seconds")}),wt=C.object({consumption:Rt.describe("Fuel consumption model for combustion engine")}),At=C.object({consumption:Ct.describe("Energy consumption model for electric engine"),charging:It.optional().describe("Battery and charging specifications")}),Lt=C.object({lengthMeters:yt.describe("Vehicle length in meters"),widthMeters:yt.describe("Vehicle width in meters"),heightMeters:yt.describe("Vehicle height in meters"),weightKG:yt.describe("Vehicle weight in kilograms"),axleWeightKG:yt.describe("Vehicle axle weight in kilograms")}).optional(),Dt=C.object({variantId:C.string().describe("Predefined vehicle variant identifier")}),Mt=C.object({dimensions:Lt.describe("Physical dimensions and weight of the vehicle"),engine:C.union([wt,At]).optional().describe("Engine type and consumption characteristics")}),Ot=C.union([Dt,Mt]).optional(),Et=C.object({heading:C.number().min(0).max(360).optional().describe("Current vehicle heading in degrees (0-360)")}),kt=Et.extend({currentFuelInLiters:gt.describe("Current fuel level in liters")}),Ft=Et.extend({currentChargePCT:ht.describe("Current battery charge as percentage (0-100)")}),Wt=Et.extend({currentChargeInkWh:gt.describe("Current battery charge in kilowatt-hours")}),qt=C.union([Ft,Wt]),Bt=C.object({minChargeAtDestinationPCT:ht.describe("Minimum battery charge percentage required at destination (0-100)"),minChargeAtChargingStopsPCT:C.number().min(0).max(50).describe("Minimum battery charge percentage at charging stops (0-50)")}),Ut=C.object({minChargeAtDestinationInkWh:gt.describe("Minimum battery charge in kWh required at destination"),minChargeAtChargingStopsInkWh:gt.describe("Minimum battery charge in kWh at charging stops")}),jt=C.union([Bt,Ut]),Nt=C.object({chargingPreferences:jt.optional().describe("Preferences for charging stops along the route")}),Ht={model:Ot,restrictions:C.object({loadTypes:C.array(C.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional().describe("Types of hazardous or restricted loads being carried"),maxSpeedKMH:C.number().min(0).max(250).optional().describe("Maximum vehicle speed in kilometers per hour (0-250)"),adrCode:C.enum(["B","C","D","E"]).optional().describe("ADR tunnel restriction code for hazardous materials"),commercial:C.boolean().optional().describe("Whether the vehicle is used for commercial purposes")}).optional()},Vt=C.object({...Ht,engineType:C.undefined(),state:Et.optional().describe("Current state of the vehicle"),preferences:C.object({}).optional().describe("Vehicle preferences")}),Gt=C.object({...Ht,engineType:C.literal("combustion").describe("Combustion engine type"),state:kt.optional().describe("Current state of the combustion vehicle including fuel level"),preferences:C.object({}).optional().describe("Combustion vehicle preferences")}),Kt=C.object({...Ht,engineType:C.literal("electric").describe("Electric engine type"),state:qt.optional().describe("Current state of the electric vehicle including battery charge"),preferences:Nt.optional().describe("Electric vehicle preferences including charging requirements")}),zt=C.union([C.discriminatedUnion("engineType",[Gt,Kt]),Vt]),$t=C.object({costModel:C.object({avoid:C.array(C.enum(g)).optional().describe("Road types and features to avoid when calculating route"),traffic:C.enum(["live","historical"]).optional().describe("Traffic consideration mode (live: real-time + historical, historical: typical patterns only)"),routeType:C.enum(he).optional().describe("Route optimization strategy (fast, short, efficient, thrilling)"),avoidAreas:C.array(_).max(10).optional().describe("Up to 10 rectangular areas for the routing engine to bypass, each as a BBox [W,S,E,N], GeoJSON object, or array of GeoJSON objects"),thrillingParams:C.object({hilliness:C.enum(["low","normal","high"]).optional().describe("Level of hilliness for thrilling routes"),windingness:C.enum(["low","normal","high"]).optional().describe("Level of windingness for thrilling routes")}).optional().describe("Optional parameters for thrilling route type")}).optional().describe("Cost model criteria for route optimization"),travelMode:C.string().optional().describe("Travel mode (car, truck, pedestrian, bicycle)"),vehicle:zt.optional().describe("Vehicle-specific parameters including dimensions, engine type, and consumption model"),when:C.object({option:C.enum(["departAt","arriveBy"]).describe("Whether to specify a departure or arrival time"),date:C.date().describe("The date and time to depart or arrive")}).optional().describe("Departure or arrival time specification for route planning")}),_t=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],Jt=C.object({origin:K.describe("Starting position [longitude, latitude] for reachable range calculation"),budget:C.object({type:C.enum(_t).describe("Budget type (time, distance, or energy/fuel)"),value:C.number().min(0).describe("Budget value (depends on type: seconds, meters, liters, or kWh)")}).describe("Travel budget constraints for reachable range")}),Yt=C.object({maxFerryLengthMeters:C.number().min(0).optional().describe("Maximum ferry distance in meters to include in range"),smoothing:C.enum(["none","weak","strong"]).optional().describe("Post-processing smoothing level for the polygon boundary")}),Zt=$t.extend(Jt.extend(Yt.shape).shape),Qt=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),Xt=(e,t,r)=>{((e,t)=>{t&&(!P(t.acceleration)&&e.append("accelerationEfficiency",String(t.acceleration)),!P(t.deceleration)&&e.append("decelerationEfficiency",String(t.deceleration)),!P(t.uphill)&&e.append("uphillEfficiency",String(t.uphill)),!P(t.downhill)&&e.append("downhillEfficiency",String(t.downhill)))})(e,r.consumption.efficiency),"electric"===t?(((e,t)=>{t.speedsToConsumptionsKWH&&e.append("constantSpeedConsumptionInkWhPerHundredkm",Qt(t.speedsToConsumptionsKWH)),!P(t.auxiliaryPowerInkW)&&e.append("auxiliaryPowerInkW",String(t.auxiliaryPowerInkW)),!P(t.consumptionInKWHPerKMAltitudeGain)&&e.append("consumptionInkWhPerkmAltitudeGain",String(t.consumptionInKWHPerKMAltitudeGain)),!P(t.recuperationInKWHPerKMAltitudeLoss)&&e.append("recuperationInkWhPerkmAltitudeLoss",String(t.recuperationInKWHPerKMAltitudeLoss))})(e,r.consumption),((e,t)=>{const r=t.charging;r?.maxChargeKWH&&e.append("maxChargeInkWh",String(r.maxChargeKWH))})(e,r)):((e,t)=>{const r=t.consumption;r.speedsToConsumptionsLiters&&e.append("constantSpeedConsumptionInLitersPerHundredkm",Qt(r.speedsToConsumptionsLiters)),!P(r.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(r.auxiliaryPowerInLitersPerHour)),!P(r.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(r.fuelEnergyDensityInMJoulesPerLiter))})(e,r)},er=(e,t)=>{t.model&&("variantId"in t.model?e.append("vehicleModelId",t.model.variantId):(((e,t)=>{t&&(t.lengthMeters&&e.append("vehicleLength",String(t.lengthMeters)),t.heightMeters&&e.append("vehicleHeight",String(t.heightMeters)),t.widthMeters&&e.append("vehicleWidth",String(t.widthMeters)),t.weightKG&&e.append("vehicleWeight",String(t.weightKG)),t.axleWeightKG&&e.append("vehicleAxleWeight",String(t.axleWeightKG)))})(e,t.model.dimensions),t.model.engine&&Xt(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},tr=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),er(e,t),((e,t)=>{if(t.state&&(t.state.heading&&e.append("vehicleHeading",String(t.state.heading)),"engineType"in t))if("combustion"===t.engineType){const r=t.state;r.currentFuelInLiters&&e.append("currentFuelInLiters",String(r.currentFuelInLiters))}else if("electric"===t.engineType){const r=t.state,n=r,i=r;if(n.currentChargeInkWh)e.append("currentChargeInkWh",String(n.currentChargeInkWh));else if(i.currentChargePCT&&t.model&&"engine"in t.model&&t.model.engine){const r=t.model.engine,n=r.charging?.maxChargeKWH;n&&e.append("currentChargeInkWh",String(n*i.currentChargePCT/100))}}})(e,t),((e,t)=>{if(t.preferences&&"engineType"in t&&"electric"===t.engineType){const r=t.preferences;if(r.chargingPreferences){const n=r.chargingPreferences,i=n,a=n;if(i.minChargeAtChargingStopsInkWh||i.minChargeAtDestinationInkWh)e.append("minChargeAtDestinationInkWh",String(i.minChargeAtDestinationInkWh)),e.append("minChargeAtChargingStopsInkWh",String(i.minChargeAtChargingStopsInkWh));else if((a.minChargeAtChargingStopsPCT||a.minChargeAtDestinationPCT)&&t.model&&"engine"in t.model&&t.model.engine){const r=t.model.engine,n=r.charging?.maxChargeKWH;n&&(e.append("minChargeAtDestinationInkWh",String(n*a.minChargeAtDestinationPCT/100)),e.append("minChargeAtChargingStopsInkWh",String(n*a.minChargeAtChargingStopsPCT/100)))}}}})(e,t),((e,t)=>{const r=t.restrictions;r&&(X(e,"vehicleLoadType",r.loadTypes),r.adrCode&&e.append("vehicleAdrTunnelRestrictionCode",r.adrCode),r.commercial&&e.append("vehicleCommercial",String(r.commercial)),r.maxSpeedKMH&&e.append("vehicleMaxSpeed",String(r.maxSpeedKMH)))})(e,t))},rr=(e,t)=>{const r=t.costModel;X(e,"avoid",r?.avoid),te(e,"traffic",r?.traffic),((e,t)=>{if(t?.date){const r=t.date.toISOString();"departAt"===t.option?e.append("departAt",r):"arriveBy"===t.option&&e.append("arriveAt",r)}})(e,t.when),te(e,"routeType",r?.routeType),te(e,"travelMode",t.travelMode),tr(e,t.vehicle)},nr=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},ir=(e,t)=>{const r=t.budget;switch(r.type){case"timeMinutes":e.append("timeBudgetInSec",(60*r.value).toString());break;case"distanceKM":e.append("distanceBudgetInMeters",(1e3*r.value).toString());break;case"spentFuelLiters":e.append("fuelBudgetInLiters",r.value.toString());break;case"spentChargePCT":{const n=nr(t);null!=n&&e.append("energyBudgetInkWh",(n*r.value/100).toString());break}case"remainingChargeCPT":{const n=(e=>{const t=e.vehicle;if(!t?.state)return;const r=t.state;if(null!=r.currentChargePCT){const t=nr(e);if(null!=t)return t*r.currentChargePCT/100}})(t),i=nr(t);if(null!=i&&null!=n){const t=i*r.value/100;e.append("energyBudgetInkWh",Math.max(0,n-t).toString())}break}default:e.append(r.type,r.value.toString())}},ar=e=>{const t=h(e.origin);return{origin:{type:"Point",coordinates:[t[0],t[1]]}}},or=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`)(e)),r=t.searchParams;return Q(r,e),r.delete("language"),rr(r,e),ir(r,e),te(r,"maxFerryLengthInMeters",e.maxFerryLengthMeters),te(r,"smoothing",e.smoothing??"strong"),{method:"POST",url:t,data:ar(e)}},sr=(e,t)=>{const r={type:"Polygon",coordinates:[e.reachableRange.boundary.map(e=>[e.longitude,e.latitude])]};return{type:"Feature",geometry:r,bbox:s(r),properties:t}},cr={requestValidation:{schema:Zt},buildRequest:or,sendRequest:j,parseResponse:sr,parseResponseError:ut,getAPIVersion:()=>3},lr={buildReachableRangeRequest:or,parseReachableRangeResponse:sr,reachableRangeTemplate:cr},dr=e=>{const t=h(e.position),r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${ne}/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),n=r.searchParams;return Q(n,e),e.allowFreeformNewline&&n.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&n.append("entityType",ke(e.geographyType)),!P(e.heading)&&n.append("heading",String(e.heading)),e.mapcodes&&n.append("mapcodes",ke(e.mapcodes)),e.number&&n.append("number",e.number),!P(e.radiusMeters)&&n.append("radius",String(e.radiusMeters)),e.returnSpeedLimit&&n.append("returnSpeedLimit",String(e.returnSpeedLimit)),e.returnRoadUse&&n.append("returnRoadUse",String(e.returnRoadUse)),e.roadUses&&n.append("roadUse",JSON.stringify(e.roadUses)),r},pr=(e,t)=>{const r=e.addresses[0],{boundingBox:n,sideOfStreet:i,offsetPosition:o,...s}=r?.address||{};return{type:"Feature",geometry:a(h(t.position)),...n&&{bbox:ce(n)},id:l(),...r&&{properties:{type:r?.entityType?"Geography":s.streetNumber?"Point Address":"Street",address:s,...r.dataSources&&{dataSources:r.dataSources},...r.mapcodes&&{mapcodes:r.mapcodes},...i&&{sideOfStreet:i},...o&&{offsetPosition:oe(o)},originalPosition:oe(r.position)}}}},ur=C.object({position:K.describe("Geographic position [longitude, latitude] to reverse geocode")}),mr=C.object({allowFreeformNewline:C.boolean().optional().describe("Allow newline characters in freeform address"),geographyType:C.array(C.string()).optional().describe("Filter results to specific geography types"),heading:C.number().min(-360).max(360).optional().describe("Vehicle heading in degrees (-360 to 360) for directional results"),mapcodes:C.array(C.string()).optional().describe("Request mapcode representations for location"),number:C.string().optional().describe("Street number for more precise address results"),radiusMeters:C.number().optional().describe("Search radius in meters for reverse geocoding"),returnMatchType:C.boolean().optional().describe("Include match type information in response"),returnRoadUse:C.boolean().optional().describe("Include road use information in response"),returnSpeedLimit:C.boolean().optional().describe("Include speed limit information in response"),roadUses:C.array(C.string()).optional().describe("Filter results to specific road use types"),view:C.enum(o).optional().describe("Geopolitical view for disputed territories")}),gr={requestValidation:{schema:ur.extend(mr.shape)},buildRequest:dr,sendRequest:B,parseResponse:pr},hr={buildRevGeoRequest:dr,parseRevGeoResponse:pr,reverseGeocodingTemplate:gr},yr=C.union([K,H]).describe("Waypoint as position or geometry"),br=C.union([N,V]).describe("Path as line string coordinates or feature"),fr=C.object({locations:C.array(C.union([yr,br])).min(1).describe("Array of route locations (waypoints or paths) - minimum 2 waypoints or 1 path required")}),vr=C.object({computeAdditionalTravelTimeFor:C.enum(["none","all"]).optional().describe("Calculate additional travel time estimates for different traffic scenarios (none or all)"),vehicleHeading:C.number().min(0).max(359.5).optional().describe("Vehicle heading in degrees (0-359.5) at departure"),maxAlternatives:C.number().min(0).max(5).optional().describe("Maximum number of alternative routes to calculate (0-5)"),sectionTypes:C.array(C.enum(b)).optional().describe("Types of route sections to include in response (toll, ferry, traffic, etc.)")}),Sr=$t.extend(fr.extend(vr.shape).shape),Tr=e=>e.vehicle?.preferences?.chargingPreferences,Rr=e=>Array.isArray(e)?e:e.geometry.coordinates,Cr=(e,t,r)=>((e,t)=>e.map(e=>{const r=se(h(e,{useEntryPoint:t})),n=(e=>e.properties||null)(e)?.radiusMeters;return n?`circle(${r},${n})`:r}).join(":"))(t.includes("path")?((e,t,r)=>{let n;const i=e[0];n="path"===t[0]?Rr(i)[0]:h(i,{useEntryPoint:r});const a=e[e.length-1];let o;if("path"===t[t.length-1]){const e=Rr(a);o=e[e.length-1]}else o=h(a,{useEntryPoint:r});return[n,o]})(e,t,r):e,r),Pr=e=>({latitude:e[1],longitude:e[0]}),xr=(e,t,r)=>{const n=[],i=[];return e.forEach((a,o)=>{"path"===t[o]?((e,t,r,n,i)=>{const a=n.length;for(const o of Rr(e))n.push(Pr(o));Array.isArray(e)||(e.properties.sections.leg.forEach((e,r)=>{(t>0||r>0)&&i.push({supportingPointIndex:a+e.startPointIndex,waypointSourceType:"USER_DEFINED"})}),t<r.length-1&&i.push({supportingPointIndex:a+e.geometry.coordinates.length-1,waypointSourceType:"USER_DEFINED"}))})(a,o,e,n,i):((e,t,r,n,i,a)=>{n.push(Pr(h(e,{useEntryPoint:a}))),t>0&&t<r.length-1&&i.push({supportingPointIndex:n.length-1,waypointSourceType:"USER_DEFINED"})})(a,o,e,n,i,r)}),{supportingPoints:n,...i.length&&{pointWaypoints:i}}},Ir=e=>({rectangles:e.map(e=>{const t=s(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");const[r,n,i,a]=t;return{southWestCorner:{latitude:n,longitude:r},northEastCorner:{latitude:a,longitude:i}}})}),wr=e=>{const t=e.locations.map(y),r=e.useEntryPoints??"main-when-available",n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${Tr(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${Cr(e.locations,t,r)}/json`),i=n.searchParams;Q(i,e),"language"in e||i.append("language","en-GB"),rr(i,e),te(i,"computeTravelTimeFor",e.computeAdditionalTravelTimeFor),((e,t)=>{if(t?.guidance){const r=t.guidance;e.append("instructionsType",r.type),e.append("guidanceVersion",String(r.version??2)),e.append("instructionPhonetics",r.phonetics??"IPA"),e.append("language",t.language??"en-US")}})(i,e),!P(e.maxAlternatives)&&i.append("maxAlternatives",String(e.maxAlternatives)),((e,t,r)=>{const n=(t??(r?b:f)).map(e=>"vehicleRestricted"===e?"travelMode":e);X(e,"sectionType",n)})(i,e.sectionTypes,!!e.guidance?.type);for(const o of e.extendedRouteRepresentations??["distance","travelTime"])i.append("extendedRouteRepresentation",o);const a=((e,t,r)=>{const n=t.includes("path"),i=!!Tr(e),a=e.costModel?.avoidAreas;if(!n&&!i&&!a)return null;const o=e.vehicle?.model,s=o?.engine?.charging;return{...n&&xr(e.locations,t,r),...i&&s&&{chargingParameters:x(s,"maxChargeKWH")},...a?.length&&{avoidAreas:Ir(a)}}})(e,t,r);return a?{method:"POST",url:n,data:a}:{method:"GET",url:n}},Ar=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},Lr=(e,t)=>{const r=e.chargingConnectionInfo,n=e.chargingParkLocation,i=[n.coordinate.longitude,n.coordinate.latitude],a=[n.street,n.houseNumber].filter(Boolean),o=a.length>0?a.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:i},properties:{...x(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:o,...n.street&&{streetName:n.street},...n.houseNumber&&{streetNumber:n.houseNumber},...n.city&&{municipality:n.city},...n.region&&{countrySubdivision:n.region},...n.postalCode&&{postalCode:n.postalCode},...n.country&&{country:n.country}},...r&&{chargingConnectionInfo:{plugType:r.chargingPlugType,currentInA:r.chargingCurrentInA,voltageInV:r.chargingVoltageInV,chargingPowerInkW:r.chargingPowerInkW,currentType:Ar(r.chargingCurrentType),chargingSpeed:be(r.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:be(e.chargingParkPowerInkW)}}}},Dr=(e,t)=>{const r=t?.vehicle?.model?.engine?.charging?.maxChargeKWH;return{lengthInMeters:e.lengthInMeters,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,trafficDelayInSeconds:e.trafficDelayInSeconds,trafficLengthInMeters:e.trafficLengthInMeters,travelTimeInSeconds:e.travelTimeInSeconds,departureTime:new Date(e.departureTime),arrivalTime:new Date(e.arrivalTime),deviationDistanceInMeters:e.deviationDistance,fuelConsumptionInLiters:e.fuelConsumptionInLiters,...e.deviationPoint&&{deviationPoint:[e.deviationPoint.longitude,e.deviationPoint.latitude]},totalChargingTimeInSeconds:e.totalChargingTimeInSeconds,batteryConsumptionInkWh:e.batteryConsumptionInkWh,...r&&e.batteryConsumptionInkWh&&{batteryConsumptionInPCT:100*e.batteryConsumptionInkWh/r},remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...r&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/r},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:Lr(e.chargingInformationAtEndOfLeg,r)}}},Mr=(e,t)=>e.reduce((e,r,n)=>{const i=0===n?0:e[n-1]?.endPointIndex;let a;return P(i)||(a=0===i?r.points?.length>0?r.points.length-1:0:i+r.points?.length),e.push({...!P(i)&&{startPointIndex:i},...a&&{endPointIndex:a},summary:Dr(r.summary,t),id:l()}),e},[]),Or=e=>({id:l(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),Er=e=>({...Or(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),kr=e=>({...Or(e),countryCodeISO3:e.countryCode}),Fr=e=>"other"===e.travelMode?Or(e):null,Wr=e=>{if(e.tec?.causes?.length)return e.tec.causes.map(e=>(e=>{switch(e){case 1:return"jam";case 2:return"accident";case 3:return"roadworks";case 4:return"narrow-lanes";case 5:return"road-closed";case 9:return"danger";case 11:return"animals-on-road";case 13:return"broken-down-vehicle";case 16:return"lane-closed";case 17:return"wind";case 18:return"fog";case 19:return"rain";case 22:return"frost";case 23:return"flooding";default:return"other"}})(e.mainCauseCode));switch(e.simpleCategory){case"JAM":return["jam"];case"ROAD_WORK":return["roadworks"];case"ROAD_CLOSURE":return["road-closed"];default:return["other"]}},qr=e=>({...Or(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:Wr(e),magnitudeOfDelay:v[e.magnitudeOfDelay],tec:e.tec}),Br=e=>({...Or(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),Ur=e=>({...Or(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),jr=e=>({...Or(e),roadShieldReferences:e.roadShieldReferences}),Nr=(e,t)=>(t[e]||(t[e]=[]),t[e]),Hr=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Or};case"COUNTRY":return{sectionType:"country",mappingFunction:kr};case"FERRY":return{sectionType:"ferry",mappingFunction:Or};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Or};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Or};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:kr};case"TOLL":return{sectionType:"toll",mappingFunction:Or};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:qr};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:Fr};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Or};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Or};case"URBAN":return{sectionType:"urban",mappingFunction:Or};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Or};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Or};case"LANES":return{sectionType:"lanes",mappingFunction:Br};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:Ur};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:jr};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:Er}}},Vr=(e,t)=>{const r={leg:Mr(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const r of e){const e=Hr(r),n=e?.mappingFunction(r);n&&Nr(e.sectionType,t).push(n)}})(e.sections,r),r},Gr=1e-4,Kr=(e,t)=>Math.abs(e[0]-t[0])<Gr&&Math.abs(e[1]-t[1])<Gr,zr=(e,t)=>{const r=[];let n=0;for(const i of e.instructions){const e=[i.maneuverPoint.longitude,i.maneuverPoint.latitude];for(let r=n;r<t.length;r++){if(Kr(t[r],e)){n=r;break}if(r===t.length-1)break}r.push({...i,maneuverPoint:e,pathPointIndex:n,routePath:i.routePath.map(e=>({...e,point:[e.point.longitude,e.point.latitude]}))})}return{instructions:r}},$r=(e,t)=>{const r=e.routes.map((e,r)=>((e,t,r)=>{const n={type:"LineString",coordinates:e.legs.flatMap(e=>e.points?.map(e=>[e.longitude,e.latitude]))};return{type:"Feature",geometry:n,id:l(),bbox:s(n),properties:{index:t,summary:Dr(e.summary,r),sections:Vr(e,r),...e.guidance&&{guidance:zr(e.guidance,n.coordinates)},...e.progress&&{progress:e.progress}}}})(e,r,t)),n=s(r);return{type:"FeatureCollection",...n&&{bbox:n},features:r}},_r={requestValidation:{schema:Sr,refinements:[{check:e=>!!e.locations.map(y).includes("path")||e.locations.length>=2,message:"When passing waypoints only: at least 2 must be defined. If passing also paths, at least one path must be defined"}]},buildRequest:wr,sendRequest:j,parseResponse:$r,parseResponseError:ut,getAPIVersion:()=>2},Jr={buildCalculateRouteRequest:wr,parseCalculateRouteResponse:$r,calculateRouteTemplate:_r},Yr=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],Zr=e=>e instanceof Date?e.toISOString().slice(0,10):e,Qr=Array.from({length:24},(e,t)=>t),Xr=e=>Yr.indexOf(e),en=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));Q(t.searchParams,e);const r=Array.isArray(e.days)?{days:e.days.map(Zr)}:{startDate:Zr(e.startDate??/* @__PURE__ */new Date),endDate:Zr(e.endDate??/* @__PURE__ */new Date)};return{method:"POST",url:t,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...r,dataTypes:e.dataTypes,frcs:"all"===e.functionalRoadClasses?Yr.map((e,t)=>t):e.functionalRoadClasses.map(Xr),hours:"all"===e.hours?Qr:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},tn=e=>({...void 0!==e.v&&{speed:e.v},...void 0!==e.fv&&{freeFlowSpeed:e.fv},...void 0!==e.c&&{congestionLevel:e.c},...void 0!==e.t&&{travelTime:e.t},...void 0!==e.l&&{networkLength:e.l}}),rn=e=>({...void 0!==e.date&&{date:new Date(e.date)},...void 0!==e.year&&{year:e.year},...void 0!==e.month&&{month:e.month},...void 0!==e.week&&{week:e.week},...void 0!==e.hour&&{hour:e.hour},...void 0!==e.day&&{day:e.day},...tn(e)}),nn=e=>({tileCentre:[e.lon,e.lat],...tn(e)}),an=e=>({startDate:new Date(e.startDate),endDate:new Date(e.endDate),labels:e.labels}),on=e=>({...e.yearly&&{yearly:e.yearly.map(rn)},...e.monthly&&{monthly:e.monthly.map(rn)},...e.weekly&&{weekly:e.weekly.map(rn)},...e.daily&&{daily:e.daily.map(rn)},...e.hourly&&{hourly:e.hourly.map(rn)},...e.average&&{average:e.average.map(rn)}}),sn=e=>{const t={};for(const[r,n]of Object.entries(e))t[r]=n.map(an);return t},cn=e=>{return{type:e.type,id:e.id,geometry:e.geometry,properties:(t=e.properties,{name:t.name,timezone:t.timezone,level:t.level,baseData:tn(t.baseData),timedData:on(t.timedData),...t.tiledData&&{tiledData:{tiles:t.tiledData.tiles.map(nn)}},...t.anomalies&&{anomalies:sn(t.anomalies)}})};var t},ln=e=>({type:"FeatureCollection",properties:{startDate:new Date(e.properties.startDate),endDate:new Date(e.properties.endDate),dataTypes:e.properties.dataTypes,heatmap:e.properties.heatmap,frcs:e.properties.frcs},features:e.features.map(cn)}),dn=C.union([C.date(),C.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]).describe("Date — either a Date object or an ISO 'YYYY-MM-DD' string"),pn=C.union([C.object({type:C.literal("Polygon"),coordinates:C.array(C.array(C.array(C.number()))).min(1)}),C.object({type:C.literal("MultiPolygon"),coordinates:C.array(C.array(C.array(C.array(C.number())))).min(1)})]).describe("GeoJSON Polygon or MultiPolygon geometry defining the analysis region"),un=e=>e instanceof Date?e:new Date(e),mn={requestValidation:{schema:E.extend({name:C.string().optional().describe("Name for the analysis report"),startDate:dn.optional(),endDate:dn.optional().describe("End date — must be within 31 days from startDate; defaults to today when omitted"),days:C.array(dn).min(1).optional().describe("Specific dates for analysis — mutually exclusive with startDate/endDate"),dataTypes:C.array(C.enum(["NETWORK_LENGTH","CONGESTION_LEVEL","FREE_FLOW_SPEED","TRAVEL_TIME","SPEED"])).min(1).describe("Traffic metrics to include"),functionalRoadClasses:C.union([C.array(C.enum([...Yr])).min(1),C.literal("all")]).describe("Functional road classes to include, or 'all' for every class"),hours:C.union([C.array(C.number().int().min(0).max(23)).min(1),C.literal("all")]).describe("Hours of the day to analyze (0–23), or 'all' for every hour"),geometry:pn}).refine(e=>{const t=void 0!==e.days,r=void 0!==e.startDate;if(t&&r)return!1;if(!t&&!r)return!1;if(void 0!==e.startDate){const t=((void 0!==e.endDate?un(e.endDate):/* @__PURE__ */new Date).getTime()-un(e.startDate).getTime())/864e5;return t>=0&&t<=31}return!0},{message:"Provide either startDate (with optional endDate, within 31 days) or days — but not both"})},buildRequest:en,sendRequest:j,parseResponse:ln},gn={buildTrafficAreaAnalyticsRequest:en,parseTrafficAreaAnalyticsResponse:ln,trafficAreaAnalyticsTemplate:mn},hn=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidentDetails`)(e)),r=t.searchParams;if(Q(r,e),((e,t)=>{te(e,"fields","{incidents{type,geometry{type,coordinates},properties{id,iconCategory,magnitudeOfDelay,events{description,code,iconCategory},startTime,endTime,from,to,length,delay,roadNumbers,timeValidity,probabilityOfOccurrence,numberOfReports,lastReportTime,tmc{countryCode,tableNumber,tableVersion,direction,points{location,offset}}}}}"),te(e,"t",t.trafficModelId),ee(e,"categoryFilter",t.categoryFilter?.map(S)),ee(e,"timeValidityFilter",t.timeValidityFilter)})(r,e),"bbox"in e&&e.bbox){const n=s(e.bbox);return n&&r.append("bbox",n.join(",")),{method:"GET",url:t}}const{ids:n}=e;return n.length>5?{method:"POST",url:t,data:{ids:n}}:(r.append("ids",n.join(",")),{method:"GET",url:t})},yn=e=>({description:e.description,code:e.code,category:T(e.iconCategory)}),bn=e=>{const t=e.properties;return{type:"Feature",geometry:e.geometry,properties:{id:t.id,category:T(t.iconCategory),magnitudeOfDelay:v[t.magnitudeOfDelay]??"unknown",events:(t.events??[]).map(yn),...t.startTime&&{startTime:new Date(t.startTime)},...t.endTime&&{endTime:new Date(t.endTime)},...t.from&&{from:t.from},...t.to&&{to:t.to},...void 0!==t.length&&{lengthInMeters:t.length},...void 0!==t.delay&&{delayInSeconds:t.delay},...t.roadNumbers&&{roadNumbers:t.roadNumbers},timeValidity:t.timeValidity,...t.probabilityOfOccurrence&&{probabilityOfOccurrence:t.probabilityOfOccurrence},...void 0!==t.numberOfReports&&{numberOfReports:t.numberOfReports},...t.lastReportTime&&{lastReportTime:new Date(t.lastReportTime)},...t.tmc&&{tmc:(r=t.tmc,{countryCode:r.countryCode,tableNumber:r.tableNumber,tableVersion:r.tableVersion,direction:r.direction,points:(r.points??[]).map(e=>({location:e.location,...void 0!==e.offset&&{offset:e.offset}}))})}}};var r},fn=e=>({type:"FeatureCollection",features:(e.incidents??[]).filter(e=>null!==e).map(bn)}),vn={requestValidation:{schema:E.extend({bbox:_.optional(),ids:C.array(C.string()).optional().describe("List of incident IDs"),trafficModelId:C.string().optional().describe("Traffic Model ID for temporal consistency"),categoryFilter:C.array(C.enum([...R])).optional().describe("Incident category filter"),timeValidityFilter:C.array(C.enum(["present","future"])).optional().describe("Time validity filter")}).refine(e=>!(e.bbox&&e.ids),{message:"Provide either bbox or ids, not both"})},buildRequest:hn,sendRequest:j,parseResponse:fn},Sn={reverseGeocode:hr,geocode:je,geometryData:_e,geometrySearch:it,calculateRoute:Jr,reachableRange:lr,evChargingStationsAvailability:De,trafficAreaAnalytics:gn,trafficIncidentDetails:{buildTrafficIncidentDetailsRequest:hn,parseTrafficIncidentDetailsResponse:fn,trafficIncidentDetailsTemplate:vn},placeByID:pt,autocompleteSearch:me},Tn=async(e,t)=>F(e,{...Le,...t},"EVChargingStationsAvailability"),Rn=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const r=await Tn({id:t}),n=e.properties.poi;return r?{...e,properties:{...e.properties,...n&&{poi:{...n,openingHours:r.openingHours}},chargingPark:{...e.properties.chargingPark,availability:r}}}:void 0}catch(r){return void console.error(r)}};async function Cn(e,t){const r=[];for(const n of e.features){const e=await Rn(n);e?r.push(e):t?.excludeIfAvailabilityUnknown||r.push(n)}return{...e,features:r,bbox:s(r)}}const Pn=e=>Boolean(e&&"availability"in e&&e.availability),xn=async(e,t)=>F(e,{...Ue,...t},"Geocode"),In=async e=>{const t=await xn({query:e,limit:1});if(!t.features[0])throw new Error(`geocodeOne: no results found for "${e}"`);return t.features[0]};async function wn(e,t){const r=await F(e,{...$e,...t},"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?r:((e,t)=>{const r=e.features.reduce((e,t)=>{const r=t.properties.dataSources?.geometry?.id;return r&&(e[r]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),n=t.features.map(e=>e.id&&r[e.id]?{...e,properties:r[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:n}})(e.geometries,r)}const An=async(e,t)=>F(e,{...dt,...t},"PlaceById"),Ln=/* @__PURE__ */new Map,Dn=/* @__PURE__ */new Map,Mn="en-GB",On=e=>e??Mn,En=e=>e.toLowerCase().replaceAll(" ",""),kn=e=>{const t={};for(const r of e){const e=[r.name,...r.synonyms].map(En);for(const n of e)t[n]=r}return t},Fn=E.extend({filters:C.array(C.string()).optional().describe("Case-insensitive filter strings applied client-side to category names and synonyms. Results from all strings are merged and deduplicated.")}),Wn=e=>({code:i[e.id],name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>i[e]).filter(e=>!!e),synonyms:e.synonyms}),qn={requestValidation:{schema:Fn},buildRequest:e=>{const t=e.customServiceBaseURL??`${e.commonBaseURL}${ne}/poiCategories.json`,r=new URL(t);return Q(r.searchParams,e),r},getAPIVersion:()=>1,sendRequest:B,parseResponse:e=>({poiCategories:e.poiCategories.map(Wn)})},Bn=(e,t)=>{const r=(e=>Dn.get(e??Mn)??{})(e),n=/* @__PURE__ */new Map;for(const i of t){const e=En(i);for(const[t,i]of Object.entries(r))t.includes(e)&&n.set(i.code,i)}for(const i of n.values())for(const e of i.childCategoryCodes)n.delete(e);return[...n.values()]},Un=async(t={})=>{const{language:r}=e(t);let n=(e=>Ln.get(On(e)))(r);if(!n){n=(await F(t,qn,"POICategories")).poiCategories,((e,t)=>{const r=On(e);Ln.set(r,t),Dn.set(r,kn(t))})(r,n)}return t.filters?.length?{poiCategories:Bn(r,t.filters)}:{poiCategories:n}},jn=async(e={})=>{const{poiCategories:t}=await Un(e);return t.map(e=>e.code)},Nn=async(e,t)=>F(e,{...cr,...t},"Reachable Range"),Hn=async(e,t,r)=>{const n=[];for(const o of e){t?.signal?.throwIfAborted();try{n.push(await Nn(o,r))}catch(a){if(!(a instanceof L)||403===a.status||429===a.status)throw a}}const i=s(n);return{type:"FeatureCollection",...i&&{bbox:i},features:n}},Vn=async(e,t)=>F(e,{...gr,...t},"ReverseGeocode"),Gn=async(e,t)=>F(e,{..._r,...t},"Routing"),Kn=C.object({minFuzzyLevel:C.number().min(1).max(4).optional().describe("Minimum fuzzy matching level (1-4, higher allows more typos)"),maxFuzzyLevel:C.number().min(1).max(4).optional().describe("Maximum fuzzy matching level (1-4, higher allows more typos)")}),zn=Ye.extend(Me.extend(Kn.shape).shape),$n=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:le(e.details)}};break;case"NEARBY":t={...e,details:{position:le({lon:e.details.lon,lat:e.details.lat}),text:e.details.text,query:e.details.query}};break;case"BOOKMARK":case"W3W":t=e}return t},_n={requestValidation:{schema:zn},buildRequest:e=>{const t=new URL(`${(e=>e.customServiceBaseURL??`${e.commonBaseURL}${ne}/search/${e.query??""}.json`)(e)}`);ie(t,e);const r=t.searchParams;te(r,"typeahead",e.typeahead),te(r,"ofs",e.offset),ee(r,"countrySet",e.countries),te(r,"radius",e.radiusMeters);const n=e.boundingBox&&s(e.boundingBox);return n&&(r.append("topLeft",ke([n[3],n[0]])),r.append("btmRight",ke([n[1],n[2]]))),te(r,"minFuzzyLevel",e.minFuzzyLevel),te(r,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:B,parseResponse:e=>{const t=e.results.map(Ie),r=c(s(t));return{type:"FeatureCollection",properties:{...we(e.summary),queryIntent:e.summary.queryIntent.map($n)},features:t,...r&&{bbox:r}}}},Jn=async(e,t)=>"geometries"in e?nt(e,t):(async(e,t)=>F(e,{..._n,...t},"FuzzySearch"))(e,t),Yn=async e=>(await Jn({query:e,limit:1})).features[0],Zn=async(e,t)=>F(e,{...mn,...t},"TrafficAreaAnalytics"),Qn=async(e,t)=>F(e,{...vn,...t},"TrafficIncidentDetails");export{A as APIErrorCode,w as SDKError,L as SDKServiceError,ue as autocompleteSearch,_t as budgetTypes,M as buildResponseError,O as buildValidationError,Nn as calculateReachableRange,Hn as calculateReachableRanges,Gn as calculateRoute,Sn as customizeService,Tn as evChargingStationsAvailability,xn as geocode,In as geocodeOne,wn as geometryData,Un as getPOICategories,jn as getPOICategoryCodes,Rn as getPlaceWithEVAvailability,Cn as getPlacesWithEVAvailability,Pn as hasChargingAvailability,D as parseDefaultResponseError,An as placeById,Vn as reverseGeocode,he as routeTypes,Jn as search,Yn as searchOne,Zn as trafficAreaAnalytics,Qn as trafficIncidentDetails};
2
- //# sourceMappingURL=services.es.js.map
1
+ import{avoidableTypes as e,bboxFromCoordsArray as t,bboxFromGeoJSON as r,bboxOnlyIfWithArea as n,currentTypes as i,generateId as o,generateTomTomHeaders as a,getPosition as s,getPositionStrict as c,getRoutePlanningLocationType as l,iconToTrafficIncidentCategory as d,indexedMagnitudes as p,inputSectionTypes as u,inputSectionTypesWithGuidance as m,mergeFromGlobal as g,plugTypes as h,poiCategories as y,poiCategoriesToID as b,poiIDsToCategories as f,toPointGeometry as v,trafficIncidentCategories as S,trafficIncidentToIconCategory as R,views as T}from"@tomtom-org/maps-sdk/core";import{z as C}from"zod";import{isNil as x,omit as P}from"lodash-es";var I=/* @__PURE__ */function(e){return e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e}({}),w=class e extends Error{constructor(t,r,n){super(t),this.service=r,this.issues=n,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},A={[I.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[I.FORBIDDEN]:"Request failed with status code 403"},L=class extends w{constructor(e,t,r){super(e,t),this.status=r,this.status&&A[this.status]&&(this.message=A[this.status])}},D=(e,t)=>{const{data:r,message:n,status:i}=e;return new L(r?.error||r?.errorText||n,t,i)},M=(e,t,r)=>{if(e.status){const n=e;return r?r(n,t):D(n,t)}return new w(e.message,t)},O=(e,t)=>new w(e.message,t,e.issues),E=C.object({apiKey:C.string().optional().describe("TomTom API key for authentication"),commonBaseURL:C.string().optional().describe("Common base URL for all services"),customServiceBaseURL:C.string().optional().describe("Custom base URL for specific service"),language:C.string().optional().describe('Language code for response text (e.g., "en-US", "nl-NL")')}),k=class extends Error{constructor(e){super(e.issues.map(e=>`${e.path.length>0?`${e.path.join(".")}: `:""}${e.message}`).join("; ")),this.issues=e.issues}},F=async(e,t,r)=>{const n=t.getAPIVersion?.(e),i=g({...e,...n&&{apiVersion:n}});if(void 0===e.validateRequest||e.validateRequest)try{((e,t)=>{const r=(t?.schema?E.extend(t.schema.shape):E).superRefine((e,r)=>{if("commonBaseURL"in e||"customServiceBaseURL"in e||r.addIssue({code:"custom",message:"commonBaseURL or customServiceBaseURL is required"}),t?.refinements?.length)for(const n of t.refinements)n.check(e)||r.addIssue({code:"custom",message:n.message})}).safeParse(e);if(!r.success)throw new k(r.error)})(i,t.requestValidation)}catch(c){throw O(c,r)}const o=t.buildRequest(i),s=a(i);e.onAPIRequest?.(o);try{const r=await t.sendRequest(o,s);return e.onAPIResponse?.(o,r),t.parseResponse(await r.data,i)}catch(c){throw e.onAPIResponse?.(o,c),M(c,r,t.parseResponseError)}},W=class e extends Error{constructor(t,r,n){super(r??`HTTP Error ${t}`),this.name="FetchError",this.status=t,this.data=n,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},q=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,r;const n=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:n?.includes("application/json")?(r=await e.json(),t=r?.errorText??r?.message??r?.detailedError?.message):n?.includes("text/xml")&&(r=await e.text(),t=e.statusText),new W(e.status,t,r)},B=async(e,t)=>q(await fetch(e,{headers:t})),j=async(e,t)=>q(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),U=async(e,t)=>{const r=e.method;if("GET"===r)return B(e.url,t);if("POST"===r)return j(e,t);throw new Error(`Unsupported HTTP method received: ${r}`)},N=C.array(C.array(C.number())).describe("Array of coordinate arrays representing a line string"),H=C.object({type:C.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]).describe("GeoJSON geometry type"),coordinates:C.union([C.array(C.number()),N,C.array(C.array(C.array(C.number()))),C.array(C.array(C.array(C.array(C.number()))))]).describe("Coordinate array(s) for the geometry"),radius:C.optional(C.number()).describe("Radius for Circle geometries"),radiusMeters:C.optional(C.number()).describe("Radius in meters for Circle geometries"),bbox:C.optional(C.array(C.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}).check(C.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),V=C.object({type:C.literal("Feature").describe("GeoJSON type identifier"),geometry:H.describe("GeoJSON geometry object"),id:C.optional(C.union([C.string(),C.number()])).describe("Optional feature identifier"),properties:C.any().describe("Feature properties"),bbox:C.optional(C.array(C.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),G=C.object({type:C.literal("FeatureCollection").describe("GeoJSON type identifier"),features:C.array(V).describe("Array of GeoJSON features"),id:C.optional(C.union([C.string(),C.number()])).describe("Optional collection identifier"),properties:C.any().describe("Collection properties"),bbox:C.optional(C.array(C.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),K=C.union([C.tuple([C.number().min(-180).max(180),C.number().min(-90).max(90)]),C.tuple([C.number().min(-180).max(180),C.number().min(-90).max(90),C.number()]),C.object({type:C.literal("Point"),coordinates:C.array(C.number())}),V]).describe("Geographic position as [longitude, latitude] tuple, Point geometry, or Feature"),z=C.union([C.array(C.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),C.array(C.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]).describe("GeoJSON bounding box array [minLng, minLat, maxLng, maxLat] or [minLng, minLat, minAlt, maxLng, maxLat, maxAlt]"),$=C.union([H,V,G]).describe("Any GeoJSON object (Geometry, Feature, or FeatureCollection)"),_=C.union([z,$,C.array($)]).describe("Bounding box as array, GeoJSON object, or array of GeoJSON objects"),J=C.object({query:C.string().describe("Partial search query for autocomplete suggestions")}),Y=C.object({position:K.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:C.number().max(100).optional().describe("Maximum number of autocomplete suggestions to return (1-100)"),radiusMeters:C.number().optional().describe("Search radius in meters around the specified position"),countries:C.array(C.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)"),resultType:C.array(C.string()).optional().describe("Types of results to include in suggestions")}),Z=J.extend(Y.shape),Q=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},X=(e,t,r)=>{for(const n of r||[])e.append(t,n)},ee=(e,t,r)=>{Array.isArray(r)&&r.length>0&&e.append(t,r.join(","))},te=(e,t,r)=>{!x(r)&&e.append(t,String(r))},re=(e,t)=>{const r=s(t);r&&(e.append("lat",String(r[1])),e.append("lon",String(r[0])))},ne=(e,t)=>{const r=e.searchParams;Q(r,t),te(r,"limit",t.limit),re(r,"position"in t?t.position:void 0),ee(r,"fuelSet",t.fuelTypes),ee(r,"idxSet",t.indexes),ee(r,"brandSet",t.poiBrands),t.poiCategories&&ee(r,"categorySet",t.poiCategories.map(e=>b[e])),ee(r,"connectorSet",t.connectors),ee(r,"mapcodes",t.mapcodes),ee(r,"extendedPostalCodesFor",t.extendedPostalCodesFor),te(r,"minPowerKW",t.minPowerKW),te(r,"maxPowerKW",t.maxPowerKW),te(r,"view",t.view),te(r,"openingHours",t.openingHours),te(r,"timeZone",t.timeZone),te(r,"relatedPois",t.relatedPois),ee(r,"entityTypeSet",t.geographyTypes)},ie=e=>{const t=new URL(`${r=e,r.customServiceBaseURL||`${r.commonBaseURL}/maps/orbis/places/autocomplete/${r.query}.json`}`);var r;const n=t.searchParams;return e.language=e.language??"en-GB",Q(n,e),te(n,"limit",e.limit),re(n,e.position),ee(n,"countrySet",e.countries),te(n,"radius",e.radiusMeters),ee(n,"resultSet",e.resultType),t},oe=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},ae=e=>`${e[1]},${e[0]}`,se=e=>{let t,r;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],r=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=oe(e.southWest),r=oe(e.northEast)),[t[0],t[1],r[0],r[1]]},ce=e=>[e.lon,e.lat],le=e=>{const{position:t,...r}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:ce(t)},radiusMeters:r.radius}},results:(n=e.results,n.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...r}=e;return{...r,category:f[Number(t)]}}return e})})))};var n},de={requestValidation:{schema:Z},buildRequest:ie,sendRequest:B,parseResponse:le},pe=async(e,t)=>F(e,{...de,...t},"Autocomplete"),ue=C.object({query:C.string().optional().describe("Search query for places, addresses, or locations"),position:K.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:C.number().max(100).optional().describe("Maximum number of results to return (1-100)"),extendedPostalCodesFor:C.array(C.string()).optional().describe("Indexes for which to include extended postal codes in results"),mapcodes:C.array(C.string()).optional().describe("Request mapcode representations for locations (Local, International, Alternative)"),view:C.enum(T).optional().describe("Geopolitical view for disputed territories"),geographyTypes:C.array(C.string()).optional().describe("Filter results to specific geography types (Country, Municipality, etc.)")}),me=C.object({indexes:C.array(C.string()).optional().describe("Search indexes to query (Geo, PAD, Addr, Str, XStr, POI)"),poiCategories:C.array(C.enum(y)).optional().describe("Filter results to specific POI categories"),poiBrands:C.array(C.string()).optional().describe("Filter results to specific POI brands"),connectors:C.array(C.string()).optional().describe("Filter EV charging stations by connector types"),fuelTypes:C.array(C.string()).optional().describe("Filter fuel stations by available fuel types"),openingHours:C.string().optional().describe("Request opening hours information for POIs"),timeZone:C.string().optional().describe("Request timezone information for POI locations (iana)"),relatedPois:C.string().optional().describe("Related POI inclusion mode (off, child, parent, all)"),minPowerKW:C.number().optional().describe("Minimum charging power in kilowatts for EV charging stations"),maxPowerKW:C.number().optional().describe("Maximum charging power in kilowatts for EV charging stations"),minFuzzyLevel:C.number().optional().describe("Minimum fuzzy matching level (1-4)"),mixFuzzyLevel:C.number().optional().describe("Maximum fuzzy matching level (1-4)")}),ge=ue.extend(me.shape),he=C.object({type:C.literal("LineString"),coordinates:N}),ye=C.object({type:C.literal("Feature"),geometry:he}),be=N,fe=C.union([he,ye,be]),ve=C.object({route:fe.describe("GeoJSON LineString or Route Feature to search along"),maxDetourTimeSeconds:C.number().int().positive().describe("Maximum allowed detour time in seconds")}),Se=C.object({sortBy:C.enum(["detourTime","detourOffset"]).optional().describe("Sort results by detour time or position along the route")}),Re=ge.extend({...ve.shape,...Se.shape}),Te=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/searchAlongRoute/${e.query??""}.json`)(e));ne(t,e);const r=t.searchParams;return r.append("maxDetourTime",String(e.maxDetourTimeSeconds)),te(r,"sortBy",e.sortBy),te(r,"spreadingMode","plan"),{url:t,data:{route:{points:(n=e.route,Array.isArray(n)?{type:"LineString",coordinates:n}:"Feature"===n.type?n.geometry:n).coordinates.map(e=>({lat:e[1],lon:e[0]}))}}};var n},Ce=e=>{const t={count:0,statusCounts:{}};for(const r of e)for(const e of r.chargingPoints)t.count++,t.statusCounts[e.status]=(t.statusCounts[e.status]||0)+1;return t},xe=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,Pe=(e,t,r)=>{if(e)for(const n of e){const e=r.find(e=>xe(n,e.connector));if(e){if(e.count++,t){const r=e.statusCounts;e.statusCounts[t]=(r[t]||0)+1}}else r.push({connector:n,count:1,statusCounts:t?{[t]:1}:{}})}},Ie=e=>{const t=[];return((e,t)=>{if(e)for(const r of e){const e=t.find(e=>xe(r,e.connector));e?e.count++:t.push({connector:r,count:1})}})(e,t),t},we=e=>{const t=[];for(const r of e)for(const e of r.chargingPoints)Pe(e.connectors,e.status,t);return t},Ae=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",Le=e=>{const{year:t,month:r,day:n}=(e=>{const t=e.split("-");return{year:Number.parseInt(t[0]),month:Number.parseInt(t[1]),day:Number.parseInt(t[2])}})(e.date);return{dateYYYYMMDD:e.date,year:t,month:r,day:n,hour:e.hour,minute:e.minute,date:new Date(t,r-1,n,e.hour,e.minute)}},De=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,Me=e=>{const t=e.timeRanges.map(e=>({start:Le(e.startTime),end:Le(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:De(t)}},Oe=e=>{const{position:t,entryPoints:r,poi:n,id:i,dist:o,boundingBox:a,chargingPark:s,...c}=e,l=s?.connectors?.map(e=>({...P(e,"connectorType"),type:e.connectorType,chargingSpeed:Ae(e.ratedPowerKW)}));return{type:"Feature",geometry:v(ce(t)),...a&&{bbox:se(a)},id:i,properties:{...P(c,"viewport"),...o&&{distance:o},...r?.length&&{entryPoints:r.map(e=>({...e,position:ce(e.position)}))},...l?.length&&{chargingPark:{...s,connectors:Ie(l)}},...n&&{poi:{name:n.name,categories:(n.categorySet?.map(e=>f[e.id])??[]).filter(e=>!!e),localizedCategories:n.categories??[],...n.phone&&{phone:n.phone},...n.brands&&{brands:n.brands.map(e=>e.name)},...n.url&&{url:n.url},...n.openingHours&&{openingHours:Me(n.openingHours)},...n.timeZone&&{timeZone:n.timeZone}}}}}},Ee=e=>{const{geoBias:t,...r}=e;return{...t&&{geoBias:ce(t)},...r}},ke=e=>{const t=e.results.map(Oe),i=n(r(t));return{type:"FeatureCollection",properties:{...Ee(e.summary)},features:t,...i&&{bbox:i}}},Fe={requestValidation:{schema:Re},buildRequest:Te,sendRequest:j,parseResponse:ke},We=async(e,t)=>F(e,{...Fe,...t},"AlongRouteSearch"),qe={alongRouteSearch:We,buildAlongRouteSearchRequest:Te,parseAlongRouteSearchResponse:ke,alongRouteSearchTemplate:Fe},Be={autocompleteSearch:pe,buildAutocompleteSearchRequest:ie,parseAutocompleteSearchResponse:le,autocompleteSearchTemplate:de},je=E.extend({id:C.string().describe("Unique identifier of the EV charging station")}),Ue=["fast","short","efficient","thrilling"],Ne=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/ev/id`)(e)),r=t.searchParams;return Q(r,e),r.append("id",e.id),t},He=e=>{const t=e.results?.[0];return t?{id:t.id,accessType:t.accessType,chargingStations:(r=t.chargingStations,r.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,connectors:e.connectors?.map(e=>({...e,chargingSpeed:Ae(e.ratedPowerKW)}))}))}))),chargingPointAvailability:Ce(t.chargingStations),connectorAvailabilities:we(t.chargingStations),...t.openingHours&&{openingHours:Me(t.openingHours)}}:void 0;var r},Ve={requestValidation:{schema:je},buildRequest:Ne,sendRequest:B,parseResponse:He,parseResponseError:(e,t)=>new L(e.data?.detailedError?.message??e.message,t,e.status)},Ge={buildEVChargingStationsAvailabilityRequest:Ne,parseEVChargingStationsAvailabilityResponse:He,evChargingStationsAvailabilityTemplate:Ve},Ke=C.object({typeahead:C.boolean().optional().describe("Enable predictive/autocomplete mode for partial input queries"),offset:C.number().max(1900).optional().describe("Starting position within result set for pagination (zero-based index)"),radiusMeters:C.number().optional().describe("Search radius in meters around the specified position"),boundingBox:_.optional().describe("Bounding box to constrain search results to a rectangular area"),countries:C.array(C.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)")}),ze=E.extend(ue.shape).extend(Ke.shape).extend({query:C.string().describe("Search query for places, addresses, or locations")}),$e=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",_e=(e,t)=>{const r=e.length;if(r<=t)return e;const n=[];let i;const o=Math.ceil(r/t);for(i=0;i<r;i+=o)n.push(e[i]);return t>1&&i>=r-o&&(n.length<t?n.push(e[r-1]):n[n.length-1]=e[r-1]),n},Je=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/geocode`)(e)}/${e.query}.json`),n=t.searchParams;Q(n,e),e.typeahead&&n.append("typeahead",String(e.typeahead)),!x(e.limit)&&n.append("limit",String(e.limit)),!x(e.offset)&&n.append("ofs",String(e.offset)),re(n,e.position),e.countries&&n.append("countrySet",$e(e.countries)),!x(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const i=e.boundingBox&&r(e.boundingBox);return i&&(n.append("topLeft",$e([i[3],i[0]])),n.append("btmRight",$e([i[1],i[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",$e(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",$e(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",$e(e.geographyTypes)),t},Ye=e=>{const{position:t,boundingBox:r,dist:n,entryPoints:i,addressRanges:o,entityType:a,id:s,...c}=e;return{type:"Feature",geometry:v(ce(t)),...r&&{bbox:se(r)},id:s,properties:{...P(c,"viewport"),...n&&{distance:n},...a&&{geographyType:a.split(",")},...i&&{entryPoints:i.map(e=>({...e,position:ce(e.position)}))},...o&&{addressRanges:{...o,from:ce(o.from),to:ce(o.to)}}}}},Ze=e=>{const t=e.results.map(Ye),i=n(r(t));return{type:"FeatureCollection",features:t,...i&&{bbox:i}}},Qe={requestValidation:{schema:ze},buildRequest:Je,sendRequest:B,parseResponse:Ze},Xe={buildGeocodingRequest:Je,parseGeocodingResponse:Ze,geocodingTemplate:Qe},et=C.object({geometries:C.union([G,C.array(C.union([C.string(),V])).min(1).max(20)]).describe("GeoJSON FeatureCollection or array of geometry IDs/Features (max 20)")}),tt=C.object({zoom:C.number().min(0).max(22).optional().describe("Zoom level for geometry data simplification (0-22)")}),rt=et.extend(tt.shape),nt=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),it=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/additionalData.json`)(e)),r=t.searchParams;return r.append("apiVersion",String(e.apiVersion)),r.append("key",e.apiKey),((e,t)=>{let r;r=Array.isArray(t)?"string"==typeof t[0]?t:nt(t):nt(t.features),e.append("geometries",$e(r))})(r,e.geometries),te(r,"geometriesZoom",e.zoom),t},ot=e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??o(),bbox:r(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:r(t),features:t}},at={requestValidation:{schema:rt},buildRequest:it,sendRequest:B,parseResponse:ot},st={buildGeometryDataRequest:it,parseGeometryDataResponse:ot,geometryDataTemplate:at},ct=C.object({geometries:C.array(C.union([G,H])).describe("Array of GeoJSON geometries or FeatureCollections to search within")}),lt=ge.extend(ct.shape),dt=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:ae(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:_e(e.coordinates[0],50).map(e=>ae(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let r=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const n=t(e[0]);if(n){const t=Math.abs((n[2]-n[0])*(n[3]-n[1]));r.set(e,t)}}),r=new Map([...r.entries()].sort((e,t)=>t[1]-e[1]).splice(0,50)),[...r.keys()]})(e).flatMap(e=>dt({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>dt({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>dt(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},pt=e=>{const t=new URL(`${r=e,r.customServiceBaseURL??`${r.commonBaseURL}/maps/orbis/places/geometrySearch/${r.query??""}.json`}`);var r;return ne(t,e),{url:t,data:{geometryList:e.geometries.flatMap(dt)}}},ut=e=>{const t=e.results.map(Oe),i=n(r(t));return{type:"FeatureCollection",properties:{...Ee(e.summary)},features:t,...i&&{bbox:i}}},mt={requestValidation:{schema:lt},buildRequest:pt,sendRequest:j,parseResponse:ut},gt=async(e,t)=>F(e,{...mt,...t},"GeometrySearch"),ht={geometrySearch:gt,buildGeometrySearchRequest:pt,parseGeometrySearchResponse:ut,geometrySearchTemplate:mt},yt=C.object({entityId:C.string().describe("Unique identifier of the place/entity to retrieve")}),bt=C.object({mapcodes:C.array(C.string()).optional().describe("Request mapcode representations for location"),view:C.enum(T).optional().describe("Geopolitical view for disputed territories"),openingHours:C.string().optional().describe("Request opening hours information for the place"),timeZone:C.string().optional().describe("Request timezone information for the place location"),relatedPois:C.string().optional().describe("Related POI inclusion mode (off, child, parent, all)")}),ft=yt.extend(bt.shape),vt=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/place.json`)(e)}`),r=t.searchParams;return Q(r,e),te(r,"entityId",e.entityId),ee(r,"mapcodes",e.mapcodes),te(r,"view",e.view),te(r,"openingHours",e.openingHours),te(r,"timeZone",e.timeZone),te(r,"relatedPois",e.relatedPois),t},St=e=>e.results?.length?Oe(e.results[0]):void 0,Rt={requestValidation:{schema:ft},buildRequest:vt,sendRequest:B,parseResponse:St},Tt={buildPlaceByIdRequest:vt,parsePlaceByIdResponse:St,placeByIdTemplate:Rt},Ct=(e,t)=>{const{data:r,message:n,status:i}=e;return new L(r?.error?.description??r?.detailedError?.message??n,t,i)},xt=C.number().positive(),Pt=C.number().min(0),It=C.number().min(0).max(100),wt=xt.optional(),At=Pt.optional(),Lt=C.number().min(0).max(1).optional(),Dt=C.object({speedKMH:C.number().describe("Speed in kilometers per hour"),consumptionUnitsPer100KM:C.number().describe("Consumption rate per 100 kilometers")}),Mt={efficiency:C.object({acceleration:Lt.describe("Acceleration efficiency factor (0-1)"),deceleration:Lt.describe("Deceleration efficiency factor (0-1)"),uphill:Lt.describe("Uphill efficiency factor (0-1)"),downhill:Lt.describe("Downhill efficiency factor (0-1)")}).optional()},Ot=C.array(Dt).min(1).max(25),Et=C.object({...Mt,speedsToConsumptionsLiters:Ot.describe("Array of speed-to-fuel-consumption mappings in liters per 100km"),auxiliaryPowerInLitersPerHour:At.describe("Auxiliary power consumption in liters per hour"),fuelEnergyDensityInMJoulesPerLiter:C.number().min(1).optional().describe("Fuel energy density in megajoules per liter")}),kt=C.object({...Mt,speedsToConsumptionsKWH:Ot.describe("Array of speed-to-energy-consumption mappings in kWh per 100km"),auxiliaryPowerInkW:At.describe("Auxiliary power consumption in kilowatts"),consumptionInKWHPerKMAltitudeGain:C.number().max(500).optional().describe("Energy consumption per kilometer of altitude gain in kWh"),recuperationInKWHPerKMAltitudeLoss:At.describe("Energy recuperation per kilometer of altitude loss in kWh")}),Ft=C.object({currentType:C.enum(i).describe("Type of electrical current (AC or DC)"),plugTypes:C.array(C.enum(h)).min(1).describe("Compatible plug/connector types"),efficiency:Lt.describe("Charging efficiency factor (0-1)"),baseLoadInkW:At.describe("Base load in kilowatts"),maxPowerInkW:At.describe("Maximum charging power in kilowatts"),maxVoltageInV:At.describe("Maximum voltage in volts"),maxCurrentInA:At.describe("Maximum current in amperes"),voltageRange:C.object({minVoltageInV:At.describe("Minimum voltage in volts"),maxVoltageInV:C.number().optional().describe("Maximum voltage in volts")}).optional().describe("Acceptable voltage range")}),Wt=C.object({stateOfChargeInkWh:Pt.describe("State of charge in kilowatt-hours"),maxPowerInkW:xt.describe("Maximum charging power at this state of charge in kilowatts")}),qt=C.object({maxChargeKWH:xt.describe("Maximum battery capacity in kilowatt-hours"),batteryCurve:C.array(Wt).max(20).optional().describe("Battery charging curve with up to 20 data points"),chargingConnectors:C.array(Ft).min(1).optional().describe("Available charging connectors on the vehicle"),chargingTimeOffsetInSec:At.describe("Time offset for charging start in seconds")}),Bt=C.object({consumption:Et.describe("Fuel consumption model for combustion engine")}),jt=C.object({consumption:kt.describe("Energy consumption model for electric engine"),charging:qt.optional().describe("Battery and charging specifications")}),Ut=C.object({lengthMeters:wt.describe("Vehicle length in meters"),widthMeters:wt.describe("Vehicle width in meters"),heightMeters:wt.describe("Vehicle height in meters"),weightKG:wt.describe("Vehicle weight in kilograms"),axleWeightKG:wt.describe("Vehicle axle weight in kilograms")}).optional(),Nt=C.object({variantId:C.string().describe("Predefined vehicle variant identifier")}),Ht=C.object({dimensions:Ut.describe("Physical dimensions and weight of the vehicle"),engine:C.union([Bt,jt]).optional().describe("Engine type and consumption characteristics")}),Vt=C.union([Nt,Ht]).optional(),Gt=C.object({heading:C.number().min(0).max(360).optional().describe("Current vehicle heading in degrees (0-360)")}),Kt=Gt.extend({currentFuelInLiters:Pt.describe("Current fuel level in liters")}),zt=Gt.extend({currentChargePCT:It.describe("Current battery charge as percentage (0-100)")}),$t=Gt.extend({currentChargeInkWh:Pt.describe("Current battery charge in kilowatt-hours")}),_t=C.union([zt,$t]),Jt=C.object({minChargeAtDestinationPCT:It.describe("Minimum battery charge percentage required at destination (0-100)"),minChargeAtChargingStopsPCT:C.number().min(0).max(50).describe("Minimum battery charge percentage at charging stops (0-50)")}),Yt=C.object({minChargeAtDestinationInkWh:Pt.describe("Minimum battery charge in kWh required at destination"),minChargeAtChargingStopsInkWh:Pt.describe("Minimum battery charge in kWh at charging stops")}),Zt=C.union([Jt,Yt]),Qt=C.object({chargingPreferences:Zt.optional().describe("Preferences for charging stops along the route")}),Xt={model:Vt,restrictions:C.object({loadTypes:C.array(C.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional().describe("Types of hazardous or restricted loads being carried"),maxSpeedKMH:C.number().min(0).max(250).optional().describe("Maximum vehicle speed in kilometers per hour (0-250)"),adrCode:C.enum(["B","C","D","E"]).optional().describe("ADR tunnel restriction code for hazardous materials"),commercial:C.boolean().optional().describe("Whether the vehicle is used for commercial purposes")}).optional()},er=C.object({...Xt,engineType:C.undefined(),state:Gt.optional().describe("Current state of the vehicle"),preferences:C.object({}).optional().describe("Vehicle preferences")}),tr=C.object({...Xt,engineType:C.literal("combustion").describe("Combustion engine type"),state:Kt.optional().describe("Current state of the combustion vehicle including fuel level"),preferences:C.object({}).optional().describe("Combustion vehicle preferences")}),rr=C.object({...Xt,engineType:C.literal("electric").describe("Electric engine type"),state:_t.optional().describe("Current state of the electric vehicle including battery charge"),preferences:Qt.optional().describe("Electric vehicle preferences including charging requirements")}),nr=C.union([C.discriminatedUnion("engineType",[tr,rr]),er]),ir=C.object({costModel:C.object({avoid:C.array(C.enum(e)).optional().describe("Road types and features to avoid when calculating route"),traffic:C.enum(["live","historical"]).optional().describe("Traffic consideration mode (live: real-time + historical, historical: typical patterns only)"),routeType:C.enum(Ue).optional().describe("Route optimization strategy (fast, short, efficient, thrilling)"),avoidAreas:C.array(_).max(10).optional().describe("Up to 10 rectangular areas for the routing engine to bypass, each as a BBox [W,S,E,N], GeoJSON object, or array of GeoJSON objects"),thrillingParams:C.object({hilliness:C.enum(["low","normal","high"]).optional().describe("Level of hilliness for thrilling routes"),windingness:C.enum(["low","normal","high"]).optional().describe("Level of windingness for thrilling routes")}).optional().describe("Optional parameters for thrilling route type")}).optional().describe("Cost model criteria for route optimization"),travelMode:C.string().optional().describe("Travel mode (car, truck, pedestrian, bicycle)"),vehicle:nr.optional().describe("Vehicle-specific parameters including dimensions, engine type, and consumption model"),when:C.object({option:C.enum(["departAt","arriveBy"]).describe("Whether to specify a departure or arrival time"),date:C.date().describe("The date and time to depart or arrive")}).optional().describe("Departure or arrival time specification for route planning")}),or=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],ar=C.object({origin:K.describe("Starting position [longitude, latitude] for reachable range calculation"),budget:C.object({type:C.enum(or).describe("Budget type (time, distance, or energy/fuel)"),value:C.number().min(0).describe("Budget value (depends on type: seconds, meters, liters, or kWh)")}).describe("Travel budget constraints for reachable range")}),sr=C.object({maxFerryLengthMeters:C.number().min(0).optional().describe("Maximum ferry distance in meters to include in range"),smoothing:C.enum(["none","weak","strong"]).optional().describe("Post-processing smoothing level for the polygon boundary")}),cr=ir.extend(ar.extend(sr.shape).shape),lr=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),dr=(e,t,r)=>{((e,t)=>{t&&(!x(t.acceleration)&&e.append("accelerationEfficiency",String(t.acceleration)),!x(t.deceleration)&&e.append("decelerationEfficiency",String(t.deceleration)),!x(t.uphill)&&e.append("uphillEfficiency",String(t.uphill)),!x(t.downhill)&&e.append("downhillEfficiency",String(t.downhill)))})(e,r.consumption.efficiency),"electric"===t?(((e,t)=>{t.speedsToConsumptionsKWH&&e.append("constantSpeedConsumptionInkWhPerHundredkm",lr(t.speedsToConsumptionsKWH)),!x(t.auxiliaryPowerInkW)&&e.append("auxiliaryPowerInkW",String(t.auxiliaryPowerInkW)),!x(t.consumptionInKWHPerKMAltitudeGain)&&e.append("consumptionInkWhPerkmAltitudeGain",String(t.consumptionInKWHPerKMAltitudeGain)),!x(t.recuperationInKWHPerKMAltitudeLoss)&&e.append("recuperationInkWhPerkmAltitudeLoss",String(t.recuperationInKWHPerKMAltitudeLoss))})(e,r.consumption),((e,t)=>{const r=t.charging;r?.maxChargeKWH&&e.append("maxChargeInkWh",String(r.maxChargeKWH))})(e,r)):((e,t)=>{const r=t.consumption;r.speedsToConsumptionsLiters&&e.append("constantSpeedConsumptionInLitersPerHundredkm",lr(r.speedsToConsumptionsLiters)),!x(r.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(r.auxiliaryPowerInLitersPerHour)),!x(r.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(r.fuelEnergyDensityInMJoulesPerLiter))})(e,r)},pr=(e,t)=>{t.model&&("variantId"in t.model?e.append("vehicleModelId",t.model.variantId):(((e,t)=>{t&&(t.lengthMeters&&e.append("vehicleLength",String(t.lengthMeters)),t.heightMeters&&e.append("vehicleHeight",String(t.heightMeters)),t.widthMeters&&e.append("vehicleWidth",String(t.widthMeters)),t.weightKG&&e.append("vehicleWeight",String(t.weightKG)),t.axleWeightKG&&e.append("vehicleAxleWeight",String(t.axleWeightKG)))})(e,t.model.dimensions),t.model.engine&&dr(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},ur=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),pr(e,t),((e,t)=>{if(t.state&&(t.state.heading&&e.append("vehicleHeading",String(t.state.heading)),"engineType"in t))if("combustion"===t.engineType){const r=t.state;r.currentFuelInLiters&&e.append("currentFuelInLiters",String(r.currentFuelInLiters))}else if("electric"===t.engineType){const r=t.state,n=r,i=r;if(n.currentChargeInkWh)e.append("currentChargeInkWh",String(n.currentChargeInkWh));else if(i.currentChargePCT&&t.model&&"engine"in t.model&&t.model.engine){const r=t.model.engine.charging?.maxChargeKWH;r&&e.append("currentChargeInkWh",String(r*i.currentChargePCT/100))}}})(e,t),((e,t)=>{if(t.preferences&&"engineType"in t&&"electric"===t.engineType){const r=t.preferences;if(r.chargingPreferences){const n=r.chargingPreferences,i=n,o=n;if(i.minChargeAtChargingStopsInkWh||i.minChargeAtDestinationInkWh)e.append("minChargeAtDestinationInkWh",String(i.minChargeAtDestinationInkWh)),e.append("minChargeAtChargingStopsInkWh",String(i.minChargeAtChargingStopsInkWh));else if((o.minChargeAtChargingStopsPCT||o.minChargeAtDestinationPCT)&&t.model&&"engine"in t.model&&t.model.engine){const r=t.model.engine.charging?.maxChargeKWH;r&&(e.append("minChargeAtDestinationInkWh",String(r*o.minChargeAtDestinationPCT/100)),e.append("minChargeAtChargingStopsInkWh",String(r*o.minChargeAtChargingStopsPCT/100)))}}}})(e,t),((e,t)=>{const r=t.restrictions;r&&(X(e,"vehicleLoadType",r.loadTypes),r.adrCode&&e.append("vehicleAdrTunnelRestrictionCode",r.adrCode),r.commercial&&e.append("vehicleCommercial",String(r.commercial)),r.maxSpeedKMH&&e.append("vehicleMaxSpeed",String(r.maxSpeedKMH)))})(e,t))},mr=(e,t)=>{const r=t.costModel;X(e,"avoid",r?.avoid),te(e,"traffic",r?.traffic),((e,t)=>{if(t?.date){const r=t.date.toISOString();"departAt"===t.option?e.append("departAt",r):"arriveBy"===t.option&&e.append("arriveAt",r)}})(e,t.when),te(e,"routeType",r?.routeType),te(e,"travelMode",t.travelMode),ur(e,t.vehicle)},gr=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},hr=(e,t)=>{const r=t.budget;switch(r.type){case"timeMinutes":e.append("timeBudgetInSec",(60*r.value).toString());break;case"distanceKM":e.append("distanceBudgetInMeters",(1e3*r.value).toString());break;case"spentFuelLiters":e.append("fuelBudgetInLiters",r.value.toString());break;case"spentChargePCT":{const n=gr(t);null!=n&&e.append("energyBudgetInkWh",(n*r.value/100).toString());break}case"remainingChargeCPT":{const n=(e=>{const t=e.vehicle;if(!t?.state)return;const r=t.state;if(null!=r.currentChargePCT){const t=gr(e);if(null!=t)return t*r.currentChargePCT/100}})(t),i=gr(t);if(null!=i&&null!=n){const t=i*r.value/100;e.append("energyBudgetInkWh",Math.max(0,n-t).toString())}break}default:e.append(r.type,r.value.toString())}},yr=e=>{const t=c(e.origin);return{origin:{type:"Point",coordinates:[t[0],t[1]]}}},br=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`)(e)),r=t.searchParams;return Q(r,e),r.delete("language"),mr(r,e),hr(r,e),te(r,"maxFerryLengthInMeters",e.maxFerryLengthMeters),te(r,"smoothing",e.smoothing??"strong"),{method:"POST",url:t,data:yr(e)}},fr=(e,t)=>{const n={type:"Polygon",coordinates:[e.reachableRange.boundary.map(e=>[e.longitude,e.latitude])]};return{type:"Feature",geometry:n,bbox:r(n),properties:t}},vr={requestValidation:{schema:cr},buildRequest:br,sendRequest:U,parseResponse:fr,parseResponseError:Ct,getAPIVersion:()=>3},Sr={buildReachableRangeRequest:br,parseReachableRangeResponse:fr,reachableRangeTemplate:vr},Rr=e=>{const t=c(e.position),r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),n=r.searchParams;return Q(n,e),e.allowFreeformNewline&&n.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&n.append("entityType",$e(e.geographyType)),!x(e.heading)&&n.append("heading",String(e.heading)),e.mapcodes&&n.append("mapcodes",$e(e.mapcodes)),e.number&&n.append("number",e.number),!x(e.radiusMeters)&&n.append("radius",String(e.radiusMeters)),e.returnSpeedLimit&&n.append("returnSpeedLimit",String(e.returnSpeedLimit)),e.returnRoadUse&&n.append("returnRoadUse",String(e.returnRoadUse)),e.roadUses&&n.append("roadUse",JSON.stringify(e.roadUses)),r},Tr=(e,t)=>{const r=e.addresses[0],{boundingBox:n,sideOfStreet:i,offsetPosition:a,...s}=r?.address||{};return{type:"Feature",geometry:v(c(t.position)),...n&&{bbox:se(n)},id:o(),...r&&{properties:{type:r?.entityType?"Geography":s.streetNumber?"Point Address":"Street",address:s,...r.dataSources&&{dataSources:r.dataSources},...r.mapcodes&&{mapcodes:r.mapcodes},...i&&{sideOfStreet:i},...a&&{offsetPosition:oe(a)},originalPosition:oe(r.position)}}}},Cr=C.object({position:K.describe("Geographic position [longitude, latitude] to reverse geocode")}),xr=C.object({allowFreeformNewline:C.boolean().optional().describe("Allow newline characters in freeform address"),geographyType:C.array(C.string()).optional().describe("Filter results to specific geography types"),heading:C.number().min(-360).max(360).optional().describe("Vehicle heading in degrees (-360 to 360) for directional results"),mapcodes:C.array(C.string()).optional().describe("Request mapcode representations for location"),number:C.string().optional().describe("Street number for more precise address results"),radiusMeters:C.number().optional().describe("Search radius in meters for reverse geocoding"),returnMatchType:C.boolean().optional().describe("Include match type information in response"),returnRoadUse:C.boolean().optional().describe("Include road use information in response"),returnSpeedLimit:C.boolean().optional().describe("Include speed limit information in response"),roadUses:C.array(C.string()).optional().describe("Filter results to specific road use types"),view:C.enum(T).optional().describe("Geopolitical view for disputed territories")}),Pr={requestValidation:{schema:Cr.extend(xr.shape)},buildRequest:Rr,sendRequest:B,parseResponse:Tr},Ir={buildRevGeoRequest:Rr,parseRevGeoResponse:Tr,reverseGeocodingTemplate:Pr},wr=C.union([K,H]).describe("Waypoint as position or geometry"),Ar=C.union([N,V]).describe("Path as line string coordinates or feature"),Lr=C.object({locations:C.array(C.union([wr,Ar])).min(1).describe("Array of route locations (waypoints or paths) - minimum 2 waypoints or 1 path required")}),Dr=C.object({computeAdditionalTravelTimeFor:C.enum(["none","all"]).optional().describe("Calculate additional travel time estimates for different traffic scenarios (none or all)"),vehicleHeading:C.number().min(0).max(359.5).optional().describe("Vehicle heading in degrees (0-359.5) at departure"),maxAlternatives:C.number().min(0).max(5).optional().describe("Maximum number of alternative routes to calculate (0-5)"),sectionTypes:C.array(C.enum(m)).optional().describe("Types of route sections to include in response (toll, ferry, traffic, etc.)")}),Mr=ir.extend(Lr.extend(Dr.shape).shape),Or=e=>(e.vehicle?.preferences)?.chargingPreferences,Er=e=>Array.isArray(e)?e:e.geometry.coordinates,kr=(e,t,r)=>((e,t)=>e.map(e=>{const r=ae(c(e,{useEntryPoint:t})),n=(e=>e.properties||null)(e)?.radiusMeters;return n?`circle(${r},${n})`:r}).join(":"))(t.includes("path")?((e,t,r)=>{let n;const i=e[0];n="path"===t[0]?Er(i)[0]:c(i,{useEntryPoint:r});const o=e[e.length-1];let a;if("path"===t[t.length-1]){const e=Er(o);a=e[e.length-1]}else a=c(o,{useEntryPoint:r});return[n,a]})(e,t,r):e,r),Fr=e=>({latitude:e[1],longitude:e[0]}),Wr=(e,t,r)=>{const n=[],i=[];return e.forEach((o,a)=>{"path"===t[a]?((e,t,r,n,i)=>{const o=n.length;for(const a of Er(e))n.push(Fr(a));Array.isArray(e)||(e.properties.sections.leg.forEach((e,r)=>{(t>0||r>0)&&i.push({supportingPointIndex:o+e.startPointIndex,waypointSourceType:"USER_DEFINED"})}),t<r.length-1&&i.push({supportingPointIndex:o+e.geometry.coordinates.length-1,waypointSourceType:"USER_DEFINED"}))})(o,a,e,n,i):((e,t,r,n,i,o)=>{n.push(Fr(c(e,{useEntryPoint:o}))),t>0&&t<r.length-1&&i.push({supportingPointIndex:n.length-1,waypointSourceType:"USER_DEFINED"})})(o,a,e,n,i,r)}),{supportingPoints:n,...i.length&&{pointWaypoints:i}}},qr=e=>({rectangles:e.map(e=>{const t=r(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");const[n,i,o,a]=t;return{southWestCorner:{latitude:i,longitude:n},northEastCorner:{latitude:a,longitude:o}}})}),Br=e=>{const t=e.locations.map(l),r=e.useEntryPoints??"main-when-available",n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${Or(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${kr(e.locations,t,r)}/json`),i=n.searchParams;Q(i,e),"language"in e||i.append("language","en-GB"),mr(i,e),te(i,"computeTravelTimeFor",e.computeAdditionalTravelTimeFor),((e,t)=>{if(t?.guidance){const r=t.guidance;e.append("instructionsType",r.type),e.append("guidanceVersion",String(r.version??2)),e.append("instructionPhonetics",r.phonetics??"IPA"),e.append("language",t.language??"en-US")}})(i,e),!x(e.maxAlternatives)&&i.append("maxAlternatives",String(e.maxAlternatives)),((e,t,r)=>{X(e,"sectionType",(t??(r?m:u)).map(e=>"vehicleRestricted"===e?"travelMode":e))})(i,e.sectionTypes,!!e.guidance?.type);for(const a of e.extendedRouteRepresentations??["distance","travelTime"])i.append("extendedRouteRepresentation",a);const o=((e,t,r)=>{const n=t.includes("path"),i=!!Or(e),o=e.costModel?.avoidAreas;if(!n&&!i&&!o)return null;const a=(e.vehicle?.model)?.engine?.charging;return{...n&&Wr(e.locations,t,r),...i&&a&&{chargingParameters:P(a,"maxChargeKWH")},...o?.length&&{avoidAreas:qr(o)}}})(e,t,r);return o?{method:"POST",url:n,data:o}:{method:"GET",url:n}},jr=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},Ur=(e,t)=>{const r=e.chargingConnectionInfo,n=e.chargingParkLocation,i=[n.coordinate.longitude,n.coordinate.latitude],o=[n.street,n.houseNumber].filter(Boolean),a=o.length>0?o.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:i},properties:{...P(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:a,...n.street&&{streetName:n.street},...n.houseNumber&&{streetNumber:n.houseNumber},...n.city&&{municipality:n.city},...n.region&&{countrySubdivision:n.region},...n.postalCode&&{postalCode:n.postalCode},...n.country&&{country:n.country}},...r&&{chargingConnectionInfo:{plugType:r.chargingPlugType,currentInA:r.chargingCurrentInA,voltageInV:r.chargingVoltageInV,chargingPowerInkW:r.chargingPowerInkW,currentType:jr(r.chargingCurrentType),chargingSpeed:Ae(r.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:Ae(e.chargingParkPowerInkW)}}}},Nr=(e,t)=>{const r=(t?.vehicle?.model)?.engine?.charging?.maxChargeKWH;return{lengthInMeters:e.lengthInMeters,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,trafficDelayInSeconds:e.trafficDelayInSeconds,trafficLengthInMeters:e.trafficLengthInMeters,travelTimeInSeconds:e.travelTimeInSeconds,departureTime:new Date(e.departureTime),arrivalTime:new Date(e.arrivalTime),deviationDistanceInMeters:e.deviationDistance,fuelConsumptionInLiters:e.fuelConsumptionInLiters,...e.deviationPoint&&{deviationPoint:[e.deviationPoint.longitude,e.deviationPoint.latitude]},totalChargingTimeInSeconds:e.totalChargingTimeInSeconds,batteryConsumptionInkWh:e.batteryConsumptionInkWh,...r&&e.batteryConsumptionInkWh&&{batteryConsumptionInPCT:100*e.batteryConsumptionInkWh/r},remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...r&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/r},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:Ur(e.chargingInformationAtEndOfLeg,r)}}},Hr=(e,t)=>e.reduce((e,r,n)=>{const i=0===n?0:e[n-1]?.endPointIndex;let a;return x(i)||(a=0===i?r.points?.length>0?r.points.length-1:0:i+r.points?.length),e.push({...!x(i)&&{startPointIndex:i},...a&&{endPointIndex:a},summary:Nr(r.summary,t),id:o()}),e},[]),Vr=e=>({id:o(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),Gr=e=>({...Vr(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),Kr=e=>({...Vr(e),countryCodeISO3:e.countryCode}),zr=e=>"other"===e.travelMode?Vr(e):null,$r=e=>{if(e.tec?.causes?.length)return e.tec.causes.map(e=>(e=>{switch(e){case 1:return"jam";case 2:return"accident";case 3:return"roadworks";case 4:return"narrow-lanes";case 5:return"road-closed";case 9:return"danger";case 11:return"animals-on-road";case 13:return"broken-down-vehicle";case 16:return"lane-closed";case 17:return"wind";case 18:return"fog";case 19:return"rain";case 22:return"frost";case 23:return"flooding";default:return"other"}})(e.mainCauseCode));switch(e.simpleCategory){case"JAM":return["jam"];case"ROAD_WORK":return["roadworks"];case"ROAD_CLOSURE":return["road-closed"];default:return["other"]}},_r=e=>({...Vr(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:$r(e),magnitudeOfDelay:p[e.magnitudeOfDelay],tec:e.tec}),Jr=e=>({...Vr(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),Yr=e=>({...Vr(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),Zr=e=>({...Vr(e),roadShieldReferences:e.roadShieldReferences}),Qr=(e,t)=>(t[e]||(t[e]=[]),t[e]),Xr=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Vr};case"COUNTRY":return{sectionType:"country",mappingFunction:Kr};case"FERRY":return{sectionType:"ferry",mappingFunction:Vr};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Vr};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Vr};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:Kr};case"TOLL":return{sectionType:"toll",mappingFunction:Vr};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:_r};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:zr};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Vr};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Vr};case"URBAN":return{sectionType:"urban",mappingFunction:Vr};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Vr};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Vr};case"LANES":return{sectionType:"lanes",mappingFunction:Jr};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:Yr};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:Zr};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:Gr}}},en=(e,t)=>{const r={leg:Hr(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const r of e){const e=Xr(r),n=e?.mappingFunction(r);n&&Qr(e.sectionType,t).push(n)}})(e.sections,r),r},tn=1e-4,rn=(e,t)=>Math.abs(e[0]-t[0])<tn&&Math.abs(e[1]-t[1])<tn,nn=(e,t)=>{const r=[];let n=0;for(const i of e.instructions){const e=[i.maneuverPoint.longitude,i.maneuverPoint.latitude];for(let r=n;r<t.length;r++){if(rn(t[r],e)){n=r;break}if(r===t.length-1)break}r.push({...i,maneuverPoint:e,pathPointIndex:n,routePath:i.routePath.map(e=>({...e,point:[e.point.longitude,e.point.latitude]}))})}return{instructions:r}},on=(e,t)=>{const n=e.routes.map((e,n)=>((e,t,n)=>{const i={type:"LineString",coordinates:e.legs.flatMap(e=>e.points?.map(e=>[e.longitude,e.latitude]))};return{type:"Feature",geometry:i,id:o(),bbox:r(i),properties:{index:t,summary:Nr(e.summary,n),sections:en(e,n),...e.guidance&&{guidance:nn(e.guidance,i.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),i=r(n);return{type:"FeatureCollection",...i&&{bbox:i},features:n}},an={requestValidation:{schema:Mr,refinements:[{check:e=>!!e.locations.map(l).includes("path")||e.locations.length>=2,message:"When passing waypoints only: at least 2 must be defined. If passing also paths, at least one path must be defined"}]},buildRequest:Br,sendRequest:U,parseResponse:on,parseResponseError:Ct,getAPIVersion:()=>2},sn={buildCalculateRouteRequest:Br,parseCalculateRouteResponse:on,calculateRouteTemplate:an},cn=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],ln=e=>e instanceof Date?e.toISOString().slice(0,10):e,dn=Array.from({length:24},(e,t)=>t),pn=e=>cn.indexOf(e),un=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));Q(t.searchParams,e);const r=Array.isArray(e.days)?{days:e.days.map(ln)}:{startDate:ln(e.startDate??/* @__PURE__ */new Date),endDate:ln(e.endDate??/* @__PURE__ */new Date)};return{method:"POST",url:t,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...r,dataTypes:e.dataTypes,frcs:"all"===e.functionalRoadClasses?cn.map((e,t)=>t):e.functionalRoadClasses.map(pn),hours:"all"===e.hours?dn:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},mn=e=>({...void 0!==e.v&&{speed:e.v},...void 0!==e.fv&&{freeFlowSpeed:e.fv},...void 0!==e.c&&{congestionLevel:e.c},...void 0!==e.t&&{travelTime:e.t},...void 0!==e.l&&{networkLength:e.l}}),gn=e=>({...void 0!==e.date&&{date:new Date(e.date)},...void 0!==e.year&&{year:e.year},...void 0!==e.month&&{month:e.month},...void 0!==e.week&&{week:e.week},...void 0!==e.hour&&{hour:e.hour},...void 0!==e.day&&{day:e.day},...mn(e)}),hn=e=>({tileCentre:[e.lon,e.lat],...mn(e)}),yn=e=>({startDate:new Date(e.startDate),endDate:new Date(e.endDate),labels:e.labels}),bn=e=>({...e.yearly&&{yearly:e.yearly.map(gn)},...e.monthly&&{monthly:e.monthly.map(gn)},...e.weekly&&{weekly:e.weekly.map(gn)},...e.daily&&{daily:e.daily.map(gn)},...e.hourly&&{hourly:e.hourly.map(gn)},...e.average&&{average:e.average.map(gn)}}),fn=e=>{const t={};for(const[r,n]of Object.entries(e))t[r]=n.map(yn);return t},vn=e=>{return{type:e.type,id:e.id,geometry:e.geometry,properties:(t=e.properties,{name:t.name,timezone:t.timezone,level:t.level,baseData:mn(t.baseData),timedData:bn(t.timedData),...t.tiledData&&{tiledData:{tiles:t.tiledData.tiles.map(hn)}},...t.anomalies&&{anomalies:fn(t.anomalies)}})};var t},Sn=e=>({type:"FeatureCollection",properties:{startDate:new Date(e.properties.startDate),endDate:new Date(e.properties.endDate),dataTypes:e.properties.dataTypes,heatmap:e.properties.heatmap,frcs:e.properties.frcs},features:e.features.map(vn)}),Rn=C.union([C.date(),C.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]).describe("Date — either a Date object or an ISO 'YYYY-MM-DD' string"),Tn=C.union([C.object({type:C.literal("Polygon"),coordinates:C.array(C.array(C.array(C.number()))).min(1)}),C.object({type:C.literal("MultiPolygon"),coordinates:C.array(C.array(C.array(C.array(C.number())))).min(1)})]).describe("GeoJSON Polygon or MultiPolygon geometry defining the analysis region"),Cn=e=>e instanceof Date?e:new Date(e),xn={requestValidation:{schema:E.extend({name:C.string().optional().describe("Name for the analysis report"),startDate:Rn.optional(),endDate:Rn.optional().describe("End date — must be within 31 days from startDate; defaults to today when omitted"),days:C.array(Rn).min(1).optional().describe("Specific dates for analysis — mutually exclusive with startDate/endDate"),dataTypes:C.array(C.enum(["NETWORK_LENGTH","CONGESTION_LEVEL","FREE_FLOW_SPEED","TRAVEL_TIME","SPEED"])).min(1).describe("Traffic metrics to include"),functionalRoadClasses:C.union([C.array(C.enum([...cn])).min(1),C.literal("all")]).describe("Functional road classes to include, or 'all' for every class"),hours:C.union([C.array(C.number().int().min(0).max(23)).min(1),C.literal("all")]).describe("Hours of the day to analyze (0–23), or 'all' for every hour"),geometry:Tn}).refine(e=>{const t=void 0!==e.days,r=void 0!==e.startDate;if(t&&r)return!1;if(!t&&!r)return!1;if(void 0!==e.startDate){const t=((void 0!==e.endDate?Cn(e.endDate):/* @__PURE__ */new Date).getTime()-Cn(e.startDate).getTime())/864e5;return t>=0&&t<=31}return!0},{message:"Provide either startDate (with optional endDate, within 31 days) or days — but not both"})},buildRequest:un,sendRequest:U,parseResponse:Sn},Pn={buildTrafficAreaAnalyticsRequest:un,parseTrafficAreaAnalyticsResponse:Sn,trafficAreaAnalyticsTemplate:xn},In=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidentDetails`)(e)),n=t.searchParams;if(Q(n,e),((e,t)=>{te(e,"fields","{incidents{type,geometry{type,coordinates},properties{id,iconCategory,magnitudeOfDelay,events{description,code,iconCategory},startTime,endTime,from,to,length,delay,roadNumbers,timeValidity,probabilityOfOccurrence,numberOfReports,lastReportTime,tmc{countryCode,tableNumber,tableVersion,direction,points{location,offset}}}}}"),te(e,"t",t.trafficModelId),ee(e,"categoryFilter",t.categoryFilter?.map(R)),ee(e,"timeValidityFilter",t.timeValidityFilter)})(n,e),"bbox"in e&&e.bbox){const i=r(e.bbox);return i&&n.append("bbox",i.join(",")),{method:"GET",url:t}}const{ids:i}=e;return i.length>5?{method:"POST",url:t,data:{ids:i}}:(n.append("ids",i.join(",")),{method:"GET",url:t})},wn=e=>({description:e.description,code:e.code,category:d(e.iconCategory)}),An=e=>{const t=e.properties;return{type:"Feature",geometry:e.geometry,properties:{id:t.id,category:d(t.iconCategory),magnitudeOfDelay:p[t.magnitudeOfDelay]??"unknown",events:(t.events??[]).map(wn),...t.startTime&&{startTime:new Date(t.startTime)},...t.endTime&&{endTime:new Date(t.endTime)},...t.from&&{from:t.from},...t.to&&{to:t.to},...void 0!==t.length&&{lengthInMeters:t.length},...void 0!==t.delay&&{delayInSeconds:t.delay},...t.roadNumbers&&{roadNumbers:t.roadNumbers},timeValidity:t.timeValidity,...t.probabilityOfOccurrence&&{probabilityOfOccurrence:t.probabilityOfOccurrence},...void 0!==t.numberOfReports&&{numberOfReports:t.numberOfReports},...t.lastReportTime&&{lastReportTime:new Date(t.lastReportTime)},...t.tmc&&{tmc:(r=t.tmc,{countryCode:r.countryCode,tableNumber:r.tableNumber,tableVersion:r.tableVersion,direction:r.direction,points:(r.points??[]).map(e=>({location:e.location,...void 0!==e.offset&&{offset:e.offset}}))})}}};var r},Ln=e=>({type:"FeatureCollection",features:(e.incidents??[]).filter(e=>null!==e).map(An)}),Dn={requestValidation:{schema:E.extend({bbox:_.optional(),ids:C.array(C.string()).optional().describe("List of incident IDs"),trafficModelId:C.string().optional().describe("Traffic Model ID for temporal consistency"),categoryFilter:C.array(C.enum([...S])).optional().describe("Incident category filter"),timeValidityFilter:C.array(C.enum(["present","future"])).optional().describe("Time validity filter")}).refine(e=>!(e.bbox&&e.ids),{message:"Provide either bbox or ids, not both"})},buildRequest:In,sendRequest:U,parseResponse:Ln},Mn={alongRouteSearch:qe,reverseGeocode:Ir,geocode:Xe,geometryData:st,geometrySearch:ht,calculateRoute:sn,reachableRange:Sr,evChargingStationsAvailability:Ge,trafficAreaAnalytics:Pn,trafficIncidentDetails:{buildTrafficIncidentDetailsRequest:In,parseTrafficIncidentDetailsResponse:Ln,trafficIncidentDetailsTemplate:Dn},placeByID:Tt,autocompleteSearch:Be},On=async(e,t)=>F(e,{...Ve,...t},"EVChargingStationsAvailability"),En=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const r=await On({id:t}),n=e.properties.poi;return r?{...e,properties:{...e.properties,...n&&{poi:{...n,openingHours:r.openingHours}},chargingPark:{...e.properties.chargingPark,availability:r}}}:void 0}catch(r){return void console.error(r)}};async function kn(e,t){const n=[];for(const r of e.features){const e=await En(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:r(n)}}var Fn=e=>Boolean(e&&"availability"in e&&e.availability),Wn=async(e,t)=>F(e,{...Qe,...t},"Geocode"),qn=async e=>{const t=await Wn({query:e,limit:1});if(!t.features[0])throw new Error(`geocodeOne: no results found for "${e}"`);return t.features[0]};async function Bn(e,t){const r=await F(e,{...at,...t},"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?r:((e,t)=>{const r=e.features.reduce((e,t)=>{const r=t.properties.dataSources?.geometry?.id;return r&&(e[r]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),n=t.features.map(e=>e.id&&r[e.id]?{...e,properties:r[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:n}})(e.geometries,r)}var jn=async(e,t)=>F(e,{...Rt,...t},"PlaceById"),Un=/* @__PURE__ */new Map,Nn=/* @__PURE__ */new Map,Hn="en-GB",Vn=e=>e??Hn,Gn=e=>e.toLowerCase().replaceAll(" ",""),Kn=e=>{const t={};for(const r of e){const e=[r.name,...r.synonyms].map(Gn);for(const n of e)t[n]=r}return t},zn=E.extend({filters:C.array(C.string()).optional().describe("Case-insensitive filter strings applied client-side to category names and synonyms. Results from all strings are merged and deduplicated.")}),$n=e=>({code:f[e.id],name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>f[e]).filter(e=>!!e),synonyms:e.synonyms}),_n={requestValidation:{schema:zn},buildRequest:e=>{const t=e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/poiCategories.json`,r=new URL(t);return Q(r.searchParams,e),r},getAPIVersion:()=>1,sendRequest:B,parseResponse:e=>({poiCategories:e.poiCategories.map($n)})},Jn=(e,t)=>{const r=(e=>Nn.get(e??Hn)??{})(e),n=/* @__PURE__ */new Map;for(const i of t){const e=Gn(i);for(const[t,i]of Object.entries(r))t.includes(e)&&n.set(i.code,i)}for(const i of n.values())for(const e of i.childCategoryCodes)n.delete(e);return[...n.values()]},Yn=async(e={})=>{const{language:t}=g(e);let r=(e=>Un.get(Vn(e)))(t);return r||(r=(await F(e,_n,"POICategories")).poiCategories,((e,t)=>{const r=Vn(e);Un.set(r,t),Nn.set(r,Kn(t))})(t,r)),e.filters?.length?{poiCategories:Jn(t,e.filters)}:{poiCategories:r}},Zn=async(e={})=>{const{poiCategories:t}=await Yn(e);return t.map(e=>e.code)},Qn=async(e,t)=>F(e,{...vr,...t},"Reachable Range"),Xn=async(e,t,n)=>{const i=[];for(const r of e){t?.signal?.throwIfAborted();try{i.push(await Qn(r,n))}catch(a){if(!(a instanceof L)||403===a.status||429===a.status)throw a}}const o=r(i);return{type:"FeatureCollection",...o&&{bbox:o},features:i}},ei=async(e,t)=>F(e,{...Pr,...t},"ReverseGeocode"),ti=async(e,t)=>F(e,{...an,...t},"Routing"),ri=C.object({minFuzzyLevel:C.number().min(1).max(4).optional().describe("Minimum fuzzy matching level (1-4, higher allows more typos)"),maxFuzzyLevel:C.number().min(1).max(4).optional().describe("Maximum fuzzy matching level (1-4, higher allows more typos)")}),ni=ge.extend(Ke.extend(ri.shape).shape),ii=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:ce(e.details)}};break;case"NEARBY":t={...e,details:{position:ce({lon:e.details.lon,lat:e.details.lat}),text:e.details.text,query:e.details.query}};break;case"BOOKMARK":case"W3W":t=e}return t},oi={requestValidation:{schema:ni},buildRequest:e=>{const t=new URL(`${(e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/search/${e.query??""}.json`)(e)}`);ne(t,e);const n=t.searchParams;te(n,"typeahead",e.typeahead),te(n,"ofs",e.offset),ee(n,"countrySet",e.countries),te(n,"radius",e.radiusMeters);const i=e.boundingBox&&r(e.boundingBox);return i&&(n.append("topLeft",$e([i[3],i[0]])),n.append("btmRight",$e([i[1],i[2]]))),te(n,"minFuzzyLevel",e.minFuzzyLevel),te(n,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:B,parseResponse:e=>{const t=e.results.map(Oe),i=n(r(t));return{type:"FeatureCollection",properties:{...Ee(e.summary),queryIntent:e.summary.queryIntent.map(ii)},features:t,...i&&{bbox:i}}}},ai=async(e,t)=>"route"in e?We(e,t):"geometries"in e?gt(e,t):(async(e,t)=>F(e,{...oi,...t},"FuzzySearch"))(e,t),si=async e=>{const t=await ai({query:e,limit:1});if(!t.features[0])throw new Error(`searchOne: no results found for "${e}"`);return t.features[0]},ci=async(e,t)=>F(e,{...xn,...t},"TrafficAreaAnalytics"),li=async(e,t)=>F(e,{...Dn,...t},"TrafficIncidentDetails");export{A as APIErrorCode,w as SDKError,L as SDKServiceError,pe as autocompleteSearch,or as budgetTypes,M as buildResponseError,O as buildValidationError,Qn as calculateReachableRange,Xn as calculateReachableRanges,ti as calculateRoute,Mn as customizeService,On as evChargingStationsAvailability,Wn as geocode,qn as geocodeOne,Bn as geometryData,Yn as getPOICategories,Zn as getPOICategoryCodes,En as getPlaceWithEVAvailability,kn as getPlacesWithEVAvailability,Fn as hasChargingAvailability,D as parseDefaultResponseError,jn as placeById,ei as reverseGeocode,Ue as routeTypes,ai as search,si as searchOne,ci as trafficAreaAnalytics,li as trafficIncidentDetails};
2
+ //# sourceMappingURL=services.es.js.map