@tomtom-org/maps-sdk 0.47.4 → 0.47.5

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.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tomtom-org/maps-sdk",
3
3
  "author": "TomTom International B.V.",
4
4
  "license": "See in LICENSE.txt",
5
- "version": "0.47.4",
5
+ "version": "0.47.5",
6
6
  "description": "TomTom Maps for JavaScript",
7
7
  "keywords": [
8
8
  "tomtom",
@@ -29,7 +29,7 @@
29
29
  "@turf/turf": "^7.3.5",
30
30
  "lodash-es": "^4.18.1",
31
31
  "maplibre-gl": "^5.24.0",
32
- "zod": "~4.3.6"
32
+ "zod": "^4.4.3"
33
33
  },
34
34
  "size-limit": [
35
35
  {
@@ -1,2 +1,2 @@
1
- import{areaAnalyticsMetricKeys as e,avoidableTypes as t,bboxFromCoordsArray as n,bboxFromGeoJSON as r,bboxOnlyIfWithArea as a,currentTypes as o,generateId as i,generateTomTomHeaders as s,getPosition as c,getPositionStrict as p,getRoutePlanningLocationType as u,iconToTrafficIncidentCategory as l,indexedMagnitudes as d,inputSectionTypes as m,inputSectionTypesWithGuidance as g,mergeFromGlobal as y,plugTypes as h,poiCategories as f,poiCategoriesToID as b,poiIDsToCategories as R,toPointGeometry as T,trafficIncidentRequestCategories as v,trafficIncidentToIconCategory as S,views as C}from"@tomtom-org/maps-sdk/core";import{z as P}from"zod";import{isNil as I,omit as x}from"lodash-es";var w=/* @__PURE__ */function(e){return e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e}({}),A=class e extends Error{constructor(t,n,r){super(t),this.service=n,this.issues=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},L={[w.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[w.FORBIDDEN]:"Request failed with status code 403"},D=class extends A{constructor(e,t,n){super(e,t),this.status=n,this.status&&L[this.status]&&(this.message=L[this.status])}},M=(e,t)=>{const{data:n,message:r,status:a}=e;return new D(n?.error||n?.errorText||r,t,a)},E=(e,t,n)=>{if(e.status){const r=e;return n?n(r,t):M(r,t)}return new A(e.message,t)},O=(e,t)=>new A(e.message,t,e.issues),F=P.object({apiKey:P.string().optional(),commonBaseURL:P.string().optional(),customServiceBaseURL:P.string().optional(),language:P.string().optional()}),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}},U=async(e,t,n)=>{const r=t.getAPIVersion?.(e),a=y({...e,...r&&{apiVersion:r}});if(void 0===e.validateRequest||e.validateRequest)try{((e,t)=>{const n=(t?.schema?F.extend(t.schema.shape):F).superRefine((e,n)=>{if("commonBaseURL"in e||"customServiceBaseURL"in e||n.addIssue({code:"custom",message:"commonBaseURL or customServiceBaseURL is required"}),t?.refinements?.length)for(const r of t.refinements)r.check(e)||n.addIssue({code:"custom",message:r.message})}).safeParse(e);if(!n.success)throw new k(n.error)})(a,t.requestValidation)}catch(c){throw O(c,n)}const o=t.buildRequest(a),i=s(a);e.onAPIRequest?.(o);try{const n=await t.sendRequest(o,i);return e.onAPIResponse?.(o,n),t.parseResponse(await n.data,a)}catch(c){throw e.onAPIResponse?.(o,c),E(c,n,t.parseResponseError)}},B=class e extends Error{constructor(t,n,r){super(n??`HTTP Error ${t}`),this.name="FetchError",this.status=t,this.data=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},j=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,n;const r=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:r?.includes("application/json")?(n=await e.json(),t=n?.errorText??n?.message??n?.detailedError?.message):r?.includes("text/xml")&&(n=await e.text(),t=e.statusText),new B(e.status,t,n)},W=async(e,t)=>j(await fetch(e,{headers:t})),q=async(e,t)=>j(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),N=async(e,t)=>{const n=e.method;if("GET"===n)return W(e.url,t);if("POST"===n)return q(e,t);throw new Error(`Unsupported HTTP method received: ${n}`)},H=P.array(P.array(P.number())),K=P.object({type:P.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]),coordinates:P.union([P.array(P.number()),H,P.array(P.array(P.array(P.number()))),P.array(P.array(P.array(P.array(P.number()))))]),radius:P.optional(P.number()),radiusMeters:P.optional(P.number()),bbox:P.optional(P.array(P.number()))}).check(P.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),V=P.object({type:P.literal("Feature"),geometry:K,id:P.optional(P.union([P.string(),P.number()])),properties:P.any(),bbox:P.optional(P.array(P.number()))}),_=P.object({type:P.literal("FeatureCollection"),features:P.array(V),id:P.optional(P.union([P.string(),P.number()])),properties:P.any(),bbox:P.optional(P.array(P.number()))}),$=P.union([P.tuple([P.number().min(-180).max(180),P.number().min(-90).max(90)]),P.tuple([P.number().min(-180).max(180),P.number().min(-90).max(90),P.number()]),P.object({type:P.literal("Point"),coordinates:P.array(P.number())}),V]),G=P.union([P.array(P.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),P.array(P.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]),z=P.union([K,V,_]),Y=P.union([G,z,P.array(z)]),Z=P.object({query:P.string().optional(),position:$.optional(),limit:P.number().max(100).optional(),extendedPostalCodesFor:P.array(P.string()).optional(),mapcodes:P.array(P.string()).optional(),view:P.enum(C).optional(),geographyTypes:P.array(P.string()).optional()}),J=P.object({indexes:P.array(P.string()).optional(),poiCategories:P.array(P.enum(f)).optional(),poiBrands:P.array(P.string()).optional(),connectors:P.array(P.string()).optional(),fuelTypes:P.array(P.string()).optional(),openingHours:P.string().optional(),timeZone:P.string().optional(),relatedPois:P.string().optional(),minPowerKW:P.number().optional(),maxPowerKW:P.number().optional(),minFuzzyLevel:P.number().optional(),maxFuzzyLevel:P.number().optional()}),Q=Z.extend(J.shape),X=P.object({type:P.literal("LineString"),coordinates:H}),ee=P.object({type:P.literal("Feature"),geometry:X}),te=H,ne=P.union([X,ee,te]),re=P.object({route:ne,maxDetourTimeSeconds:P.number().int().positive()}),ae=P.object({sortBy:P.enum(["detourTime","detourOffset"]).optional()}),oe=Q.extend({...re.shape,...ae.shape}),ie=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},se=(e,t,n)=>{for(const r of n||[])e.append(t,r)},ce=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},pe=(e,t,n)=>{!I(n)&&e.append(t,String(n))},ue=(e,t)=>{const n=c(t);n&&(e.append("lat",String(n[1])),e.append("lon",String(n[0])))},le=(e,t)=>{const n=e.searchParams;ie(n,t),pe(n,"limit",t.limit),ue(n,"position"in t?t.position:void 0),ce(n,"fuelSet",t.fuelTypes),ce(n,"idxSet",t.indexes),ce(n,"brandSet",t.poiBrands),t.poiCategories&&ce(n,"categorySet",t.poiCategories.map(e=>b[e])),ce(n,"connectorSet",t.connectors),ce(n,"mapcodes",t.mapcodes),ce(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),pe(n,"minPowerKW",t.minPowerKW),pe(n,"maxPowerKW",t.maxPowerKW),pe(n,"view",t.view),pe(n,"openingHours",t.openingHours),pe(n,"timeZone",t.timeZone),pe(n,"relatedPois",t.relatedPois),ce(n,"entityTypeSet",t.geographyTypes)},de=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/searchAlongRoute/${e.query??""}.json`)(e));le(t,e);const n=t.searchParams;return n.append("maxDetourTime",String(e.maxDetourTimeSeconds)),pe(n,"sortBy",e.sortBy),pe(n,"spreadingMode","plan"),{url:t,data:{route:{points:(r=e.route,Array.isArray(r)?{type:"LineString",coordinates:r}:"Feature"===r.type?r.geometry:r).coordinates.map(e=>({lat:e[1],lon:e[0]}))}}};var r},me=e=>{const t={count:0,statusCounts:{}};for(const n of e)for(const e of n.chargingPoints)t.count++,t.statusCounts[e.status]=(t.statusCounts[e.status]||0)+1;return t},ge=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,ye=(e,t,n)=>{if(e)for(const r of e){const e=n.find(e=>ge(r,e.connector));if(e){if(e.count++,t){const n=e.statusCounts;e.statusCounts[t]=(n[t]||0)+1}}else n.push({connector:r,count:1,statusCounts:t?{[t]:1}:{}})}},he=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>ge(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},fe=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)ye(e.connectors,e.status,t);return t},be=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",Re=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},Te=e=>`${e[1]},${e[0]}`,ve=e=>{let t,n;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=Re(e.southWest),n=Re(e.northEast)),[t[0],t[1],n[0],n[1]]},Se=e=>[e.lon,e.lat],Ce=e=>{const{year:t,month:n,day:r}=(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:n,day:r,hour:e.hour,minute:e.minute,date:new Date(t,n-1,r,e.hour,e.minute)}},Pe=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,Ie=e=>{const t=e.timeRanges.map(e=>({start:Ce(e.startTime),end:Ce(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:Pe(t)}},xe=e=>{const{position:t,entryPoints:n,poi:r,id:a,dist:o,boundingBox:i,chargingPark:s,...c}=e,p=s?.connectors?.map(e=>({...x(e,"connectorType"),type:e.connectorType,chargingSpeed:be(e.ratedPowerKW)}));return{type:"Feature",geometry:T(Se(t)),...i&&{bbox:ve(i)},id:a,properties:{...x(c,"viewport"),...o&&{distance:o},...n?.length&&{entryPoints:n.map(e=>({...e,position:Se(e.position)}))},...p?.length&&{chargingPark:{...s,connectors:he(p)}},...r&&{poi:{name:r.name,categories:(r.categorySet?.map(e=>R[e.id])??[]).filter(e=>!!e),localizedCategories:r.categories??[],...r.phone&&{phone:r.phone},...r.brands&&{brands:r.brands.map(e=>e.name)},...r.url&&{url:r.url},...r.openingHours&&{openingHours:Ie(r.openingHours)},...r.timeZone&&{timeZone:r.timeZone}}}}}},we=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:Se(t)},...n}},Ae=e=>{const t=e.results.map(xe),n=a(r(t));return{type:"FeatureCollection",properties:{...we(e.summary)},features:t,...n&&{bbox:n}}},Le={requestValidation:{schema:oe},buildRequest:de,sendRequest:q,parseResponse:Ae},De=async(e,t)=>U(e,{...Le,...t},"AlongRouteSearch"),Me=P.object({query:P.string()}),Ee=P.object({position:$.optional(),limit:P.number().max(100).optional(),radiusMeters:P.number().optional(),countries:P.array(P.string()).optional(),resultType:P.array(P.string()).optional()}),Oe=Me.extend(Ee.shape),Fe=e=>{const t=new URL(`${n=e,n.customServiceBaseURL||`${n.commonBaseURL}/maps/orbis/places/autocomplete/${n.query}.json`}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",ie(r,e),pe(r,"limit",e.limit),ue(r,e.position),ce(r,"countrySet",e.countries),pe(r,"radius",e.radiusMeters),ce(r,"resultSet",e.resultType),t},ke=e=>{const{position:t,...n}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:Se(t)},radiusMeters:n.radius}},results:(r=e.results,r.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...n}=e;return{...n,category:R[Number(t)]}}return e})})))};var r},Ue={requestValidation:{schema:Oe},buildRequest:Fe,sendRequest:W,parseResponse:ke},Be=async(e,t)=>U(e,{...Ue,...t},"Autocomplete"),je={alongRouteSearch:De,buildAlongRouteSearchRequest:de,parseAlongRouteSearchResponse:Ae,alongRouteSearchTemplate:Le},We={autocompleteSearch:Be,buildAutocompleteSearchRequest:Fe,parseAutocompleteSearchResponse:ke,autocompleteSearchTemplate:Ue},qe=F.extend({id:P.string()}),Ne=["fast","short","efficient","thrilling"],He=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/ev/id`)(e)),n=t.searchParams;return ie(n,e),n.append("id",e.id),t},Ke=e=>{const t=e.results?.[0];return t?{id:t.id,accessType:t.accessType,chargingStations:(n=t.chargingStations,n.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,connectors:e.connectors?.map(e=>({...e,chargingSpeed:be(e.ratedPowerKW)}))}))}))),chargingPointAvailability:me(t.chargingStations),connectorAvailabilities:fe(t.chargingStations),...t.openingHours&&{openingHours:Ie(t.openingHours)}}:void 0;var n},Ve={requestValidation:{schema:qe},buildRequest:He,sendRequest:W,parseResponse:Ke,parseResponseError:(e,t)=>new D(e.data?.detailedError?.message??e.message,t,e.status)},_e={buildEVChargingStationsAvailabilityRequest:He,parseEVChargingStationsAvailabilityResponse:Ke,evChargingStationsAvailabilityTemplate:Ve},$e=P.object({typeahead:P.boolean().optional(),offset:P.number().max(1900).optional(),radiusMeters:P.number().optional(),boundingBox:Y.optional(),countries:P.array(P.string()).optional()}),Ge=F.extend(Z.shape).extend($e.shape).extend({query:P.string()}),ze=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",Ye=(e,t)=>{const n=e.length;if(n<=t)return e;const r=[];let a;const o=Math.ceil(n/t);for(a=0;a<n;a+=o)r.push(e[a]);return t>1&&a>=n-o&&(r.length<t?r.push(e[n-1]):r[r.length-1]=e[n-1]),r},Ze=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/geocode`)(e)}/${e.query}.json`),n=t.searchParams;ie(n,e),e.typeahead&&n.append("typeahead",String(e.typeahead)),!I(e.limit)&&n.append("limit",String(e.limit)),!I(e.offset)&&n.append("ofs",String(e.offset)),ue(n,e.position),e.countries&&n.append("countrySet",ze(e.countries)),!I(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const a=e.boundingBox&&r(e.boundingBox);return a&&(n.append("topLeft",ze([a[3],a[0]])),n.append("btmRight",ze([a[1],a[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",ze(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",ze(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",ze(e.geographyTypes)),t},Je=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:a,addressRanges:o,entityType:i,id:s,...c}=e;return{type:"Feature",geometry:T(Se(t)),...n&&{bbox:ve(n)},id:s,properties:{...x(c,"viewport"),...r&&{distance:r},...i&&{geographyType:i.split(",")},...a&&{entryPoints:a.map(e=>({...e,position:Se(e.position)}))},...o&&{addressRanges:{...o,from:Se(o.from),to:Se(o.to)}}}}},Qe=e=>{const t=e.results.map(Je),n=a(r(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}},Xe={requestValidation:{schema:Ge},buildRequest:Ze,sendRequest:W,parseResponse:Qe},et={buildGeocodingRequest:Ze,parseGeocodingResponse:Qe,geocodingTemplate:Xe},tt=P.object({geometries:P.union([_,P.array(P.union([P.string(),V])).min(1).max(20)])}),nt=P.object({zoom:P.number().min(0).max(22).optional()}),rt=tt.extend(nt.shape),at=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),ot=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/additionalData.json`)(e)),n=t.searchParams;return n.append("apiVersion",String(e.apiVersion)),n.append("key",e.apiKey),((e,t)=>{let n;n=Array.isArray(t)?"string"==typeof t[0]?t:at(t):at(t.features),e.append("geometries",ze(n))})(n,e.geometries),pe(n,"geometriesZoom",e.zoom),t},it=e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??i(),bbox:r(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:r(t),features:t}},st={requestValidation:{schema:rt},buildRequest:ot,sendRequest:W,parseResponse:it},ct={buildGeometryDataRequest:ot,parseGeometryDataResponse:it,geometryDataTemplate:st},pt=P.object({geometries:P.array(P.union([_,K]))}),ut=Q.extend(pt.shape),lt=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:Te(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:Ye(e.coordinates[0],50).map(e=>Te(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const r=n(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=>lt({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>lt({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>lt(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},dt=e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}/maps/orbis/places/geometrySearch/${n.query??""}.json`}`);var n;return le(t,e),{url:t,data:{geometryList:e.geometries.flatMap(lt)}}},mt=e=>{const t=e.results.map(xe),n=a(r(t));return{type:"FeatureCollection",properties:{...we(e.summary)},features:t,...n&&{bbox:n}}},gt={requestValidation:{schema:ut},buildRequest:dt,sendRequest:q,parseResponse:mt},yt=async(e,t)=>U(e,{...gt,...t},"GeometrySearch"),ht={geometrySearch:yt,buildGeometrySearchRequest:dt,parseGeometrySearchResponse:mt,geometrySearchTemplate:gt},ft=P.object({entityId:P.string()}),bt=P.object({mapcodes:P.array(P.string()).optional(),view:P.enum(C).optional(),openingHours:P.string().optional(),timeZone:P.string().optional(),relatedPois:P.string().optional()}),Rt=ft.extend(bt.shape),Tt=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/place.json`)(e)}`),n=t.searchParams;return ie(n,e),pe(n,"entityId",e.entityId),ce(n,"mapcodes",e.mapcodes),pe(n,"view",e.view),pe(n,"openingHours",e.openingHours),pe(n,"timeZone",e.timeZone),pe(n,"relatedPois",e.relatedPois),t},vt=e=>e.results?.length?xe(e.results[0]):void 0,St={requestValidation:{schema:Rt},buildRequest:Tt,sendRequest:W,parseResponse:vt},Ct={buildPlaceByIdRequest:Tt,parsePlaceByIdResponse:vt,placeByIdTemplate:St},Pt=(e,t)=>{const{data:n,message:r,status:a}=e;return new D(n?.error?.description??n?.detailedError?.message??r,t,a)},It=P.number().positive(),xt=P.number().min(0),wt=P.number().min(0).max(100),At=It.optional(),Lt=xt.optional(),Dt=P.number().min(0).max(1).optional(),Mt=P.object({speedKMH:P.number(),consumptionUnitsPer100KM:P.number()}),Et={efficiency:P.object({acceleration:Dt,deceleration:Dt,uphill:Dt,downhill:Dt}).optional()},Ot=P.array(Mt).min(1).max(25),Ft=P.object({...Et,speedsToConsumptionsLiters:Ot,auxiliaryPowerInLitersPerHour:Lt,fuelEnergyDensityInMJoulesPerLiter:P.number().min(1).optional()}),kt=P.object({...Et,speedsToConsumptionsKWH:Ot,auxiliaryPowerInkW:Lt,consumptionInKWHPerKMAltitudeGain:P.number().max(500).optional(),recuperationInKWHPerKMAltitudeLoss:Lt}),Ut=P.object({currentType:P.enum(o),plugTypes:P.array(P.enum(h)).min(1),efficiency:Dt,baseLoadInkW:Lt,maxPowerInkW:Lt,maxVoltageInV:Lt,maxCurrentInA:Lt,voltageRange:P.object({minVoltageInV:Lt,maxVoltageInV:P.number().optional()}).optional()}),Bt=P.object({stateOfChargeInkWh:xt,maxPowerInkW:It}),jt=P.object({maxChargeKWH:It,batteryCurve:P.array(Bt).max(20).optional(),chargingConnectors:P.array(Ut).min(1).optional(),chargingTimeOffsetInSec:Lt}),Wt=P.object({consumption:Ft}),qt=P.object({consumption:kt,charging:jt.optional()}),Nt=P.object({lengthMeters:At,widthMeters:At,heightMeters:At,weightKG:At,axleWeightKG:At}).optional(),Ht=P.object({variantId:P.string()}),Kt=P.object({dimensions:Nt,engine:P.union([Wt,qt]).optional()}),Vt=P.union([Ht,Kt]).optional(),_t=P.object({heading:P.number().min(0).max(360).optional()}),$t=_t.extend({currentFuelInLiters:xt}),Gt=_t.extend({currentChargePCT:wt}),zt=_t.extend({currentChargeInkWh:xt}),Yt=P.union([Gt,zt]),Zt=P.object({minChargeAtDestinationPCT:wt,minChargeAtChargingStopsPCT:P.number().min(0).max(50)}),Jt=P.object({minChargeAtDestinationInkWh:xt,minChargeAtChargingStopsInkWh:xt}),Qt=P.union([Zt,Jt]),Xt=P.object({chargingPreferences:Qt.optional()}),en={model:Vt,restrictions:P.object({loadTypes:P.array(P.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional(),maxSpeedKMH:P.number().min(0).max(250).optional(),adrCode:P.enum(["B","C","D","E"]).optional(),commercial:P.boolean().optional()}).optional()},tn=P.object({...en,engineType:P.undefined(),state:_t.optional(),preferences:P.object({}).optional()}),nn=P.object({...en,engineType:P.literal("combustion"),state:$t.optional(),preferences:P.object({}).optional()}),rn=P.object({...en,engineType:P.literal("electric"),state:Yt.optional(),preferences:Xt.optional()}),an=P.union([P.discriminatedUnion("engineType",[nn,rn]),tn]),on=P.object({costModel:P.object({avoid:P.array(P.enum(t)).optional(),traffic:P.enum(["live","historical"]).optional(),routeType:P.enum(Ne).optional(),avoidAreas:P.array(Y).max(10).optional(),thrillingParams:P.object({hilliness:P.enum(["low","normal","high"]).optional(),windingness:P.enum(["low","normal","high"]).optional()}).optional()}).optional(),travelMode:P.string().optional(),vehicle:an.optional(),when:P.object({option:P.enum(["departAt","arriveBy"]),date:P.date()}).optional()}),sn=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],cn=P.object({origin:$,budget:P.object({type:P.enum(sn),value:P.number().min(0)})}),pn=P.object({maxFerryLengthMeters:P.number().min(0).optional(),smoothing:P.enum(["none","weak","strong"]).optional()}),un=on.extend(cn.extend(pn.shape).shape),ln=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),dn=(e,t,n)=>{((e,t)=>{t&&(!I(t.acceleration)&&e.append("accelerationEfficiency",String(t.acceleration)),!I(t.deceleration)&&e.append("decelerationEfficiency",String(t.deceleration)),!I(t.uphill)&&e.append("uphillEfficiency",String(t.uphill)),!I(t.downhill)&&e.append("downhillEfficiency",String(t.downhill)))})(e,n.consumption.efficiency),"electric"===t?(((e,t)=>{t.speedsToConsumptionsKWH&&e.append("constantSpeedConsumptionInkWhPerHundredkm",ln(t.speedsToConsumptionsKWH)),!I(t.auxiliaryPowerInkW)&&e.append("auxiliaryPowerInkW",String(t.auxiliaryPowerInkW)),!I(t.consumptionInKWHPerKMAltitudeGain)&&e.append("consumptionInkWhPerkmAltitudeGain",String(t.consumptionInKWHPerKMAltitudeGain)),!I(t.recuperationInKWHPerKMAltitudeLoss)&&e.append("recuperationInkWhPerkmAltitudeLoss",String(t.recuperationInKWHPerKMAltitudeLoss))})(e,n.consumption),((e,t)=>{const n=t.charging;n?.maxChargeKWH&&e.append("maxChargeInkWh",String(n.maxChargeKWH))})(e,n)):((e,t)=>{const n=t.consumption;n.speedsToConsumptionsLiters&&e.append("constantSpeedConsumptionInLitersPerHundredkm",ln(n.speedsToConsumptionsLiters)),!I(n.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(n.auxiliaryPowerInLitersPerHour)),!I(n.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(n.fuelEnergyDensityInMJoulesPerLiter))})(e,n)},mn=(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&&dn(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},gn=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),mn(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 n=t.state;n.currentFuelInLiters&&e.append("currentFuelInLiters",String(n.currentFuelInLiters))}else if("electric"===t.engineType){const n=t.state,r=n,a=n;if(r.currentChargeInkWh)e.append("currentChargeInkWh",String(r.currentChargeInkWh));else if(a.currentChargePCT&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine.charging?.maxChargeKWH;n&&e.append("currentChargeInkWh",String(n*a.currentChargePCT/100))}}})(e,t),((e,t)=>{if(t.preferences&&"engineType"in t&&"electric"===t.engineType){const n=t.preferences;if(n.chargingPreferences){const r=n.chargingPreferences,a=r,o=r;if(a.minChargeAtChargingStopsInkWh||a.minChargeAtDestinationInkWh)e.append("minChargeAtDestinationInkWh",String(a.minChargeAtDestinationInkWh)),e.append("minChargeAtChargingStopsInkWh",String(a.minChargeAtChargingStopsInkWh));else if((o.minChargeAtChargingStopsPCT||o.minChargeAtDestinationPCT)&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine.charging?.maxChargeKWH;n&&(e.append("minChargeAtDestinationInkWh",String(n*o.minChargeAtDestinationPCT/100)),e.append("minChargeAtChargingStopsInkWh",String(n*o.minChargeAtChargingStopsPCT/100)))}}}})(e,t),((e,t)=>{const n=t.restrictions;n&&(se(e,"vehicleLoadType",n.loadTypes),n.adrCode&&e.append("vehicleAdrTunnelRestrictionCode",n.adrCode),n.commercial&&e.append("vehicleCommercial",String(n.commercial)),n.maxSpeedKMH&&e.append("vehicleMaxSpeed",String(n.maxSpeedKMH)))})(e,t))},yn=(e,t)=>{const n=t.costModel;se(e,"avoid",n?.avoid),pe(e,"traffic",n?.traffic),((e,t)=>{if(t?.date){const n=t.date.toISOString();"departAt"===t.option?e.append("departAt",n):"arriveBy"===t.option&&e.append("arriveAt",n)}})(e,t.when),pe(e,"routeType",n?.routeType),pe(e,"travelMode",t.travelMode),gn(e,t.vehicle)},hn=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},fn=(e,t)=>{const n=t.budget;switch(n.type){case"timeMinutes":e.append("timeBudgetInSec",(60*n.value).toString());break;case"distanceKM":e.append("distanceBudgetInMeters",(1e3*n.value).toString());break;case"spentFuelLiters":e.append("fuelBudgetInLiters",n.value.toString());break;case"spentChargePCT":{const r=hn(t);null!=r&&e.append("energyBudgetInkWh",(r*n.value/100).toString());break}case"remainingChargeCPT":{const r=(e=>{const t=e.vehicle;if(!t?.state)return;const n=t.state;if(null!=n.currentChargePCT){const t=hn(e);if(null!=t)return t*n.currentChargePCT/100}})(t),a=hn(t);if(null!=a&&null!=r){const t=a*n.value/100;e.append("energyBudgetInkWh",Math.max(0,r-t).toString())}break}default:e.append(n.type,n.value.toString())}},bn=e=>{const t=(e=>{const t=p(e.origin);return`${t[1]},${t[0]}`})(e),n=new URL(((e,t)=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange/${t}/json`)(e,t)),r=n.searchParams;return ie(r,e),r.delete("language"),yn(r,e),fn(r,e),pe(r,"maxFerryLengthInMeters",e.maxFerryLengthMeters),pe(r,"smoothing",e.smoothing??"strong"),{method:"GET",url:n}},Rn=(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}},Tn={requestValidation:{schema:un},buildRequest:bn,sendRequest:N,parseResponse:Rn,parseResponseError:Pt,getAPIVersion:()=>2},vn={buildReachableRangeRequest:bn,parseReachableRangeResponse:Rn,reachableRangeTemplate:Tn},Sn=e=>{const t=p(e.position),n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),r=n.searchParams;return ie(r,e),e.allowFreeformNewline&&r.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&r.append("entityType",ze(e.geographyType)),!I(e.heading)&&r.append("heading",String(e.heading)),e.mapcodes&&r.append("mapcodes",ze(e.mapcodes)),e.number&&r.append("number",e.number),!I(e.radiusMeters)&&r.append("radius",String(e.radiusMeters)),e.returnSpeedLimit&&r.append("returnSpeedLimit",String(e.returnSpeedLimit)),e.returnRoadUse&&r.append("returnRoadUse",String(e.returnRoadUse)),e.roadUses&&r.append("roadUse",JSON.stringify(e.roadUses)),n},Cn=(e,t)=>{const n=e.addresses[0],{boundingBox:r,sideOfStreet:a,offsetPosition:o,...s}=n?.address||{};return{type:"Feature",geometry:T(p(t.position)),...r&&{bbox:ve(r)},id:i(),...n&&{properties:{type:n?.entityType?"Geography":s.streetNumber?"Point Address":"Street",address:s,...n.dataSources&&{dataSources:n.dataSources},...n.mapcodes&&{mapcodes:n.mapcodes},...a&&{sideOfStreet:a},...o&&{offsetPosition:Re(o)},originalPosition:Re(n.position)}}}},Pn=P.object({position:$}),In=P.object({allowFreeformNewline:P.boolean().optional(),geographyType:P.array(P.string()).optional(),heading:P.number().min(-360).max(360).optional(),mapcodes:P.array(P.string()).optional(),number:P.string().optional(),radiusMeters:P.number().optional(),returnMatchType:P.boolean().optional(),returnRoadUse:P.boolean().optional(),returnSpeedLimit:P.boolean().optional(),roadUses:P.array(P.string()).optional(),view:P.enum(C).optional()}),xn={requestValidation:{schema:Pn.extend(In.shape)},buildRequest:Sn,sendRequest:W,parseResponse:Cn},wn={buildRevGeoRequest:Sn,parseRevGeoResponse:Cn,reverseGeocodingTemplate:xn},An=P.union([$,K]),Ln=P.union([H,V]),Dn=P.object({locations:P.array(P.union([An,Ln])).min(1)}),Mn=P.object({computeAdditionalTravelTimeFor:P.enum(["none","all"]).optional(),vehicleHeading:P.number().min(0).max(359.5).optional(),maxAlternatives:P.number().min(0).max(5).optional(),sectionTypes:P.array(P.enum(g)).optional()}),En=on.extend(Dn.extend(Mn.shape).shape),On=e=>(e.vehicle?.preferences)?.chargingPreferences,Fn=e=>Array.isArray(e)?e:e.geometry.coordinates,kn=(e,t,n)=>((e,t)=>e.map(e=>{const n=Te(p(e,{useEntryPoint:t})),r=(e=>e.properties||null)(e)?.radiusMeters;return r?`circle(${n},${r})`:n}).join(":"))(t.includes("path")?((e,t,n)=>{let r;const a=e[0];r="path"===t[0]?Fn(a)[0]:p(a,{useEntryPoint:n});const o=e[e.length-1];let i;if("path"===t[t.length-1]){const e=Fn(o);i=e[e.length-1]}else i=p(o,{useEntryPoint:n});return[r,i]})(e,t,n):e,n),Un=e=>({latitude:e[1],longitude:e[0]}),Bn=(e,t,n)=>{const r=[],a=[];return e.forEach((o,i)=>{"path"===t[i]?((e,t,n,r,a)=>{const o=r.length;for(const i of Fn(e))r.push(Un(i));Array.isArray(e)||(e.properties.sections.leg.forEach((e,n)=>{(t>0||n>0)&&a.push({supportingPointIndex:o+e.startPointIndex,waypointSourceType:"USER_DEFINED"})}),t<n.length-1&&a.push({supportingPointIndex:o+e.geometry.coordinates.length-1,waypointSourceType:"USER_DEFINED"}))})(o,i,e,r,a):((e,t,n,r,a,o)=>{r.push(Un(p(e,{useEntryPoint:o}))),t>0&&t<n.length-1&&a.push({supportingPointIndex:r.length-1,waypointSourceType:"USER_DEFINED"})})(o,i,e,r,a,n)}),{supportingPoints:r,...a.length&&{pointWaypoints:a}}},jn=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,a,o,i]=t;return{southWestCorner:{latitude:a,longitude:n},northEastCorner:{latitude:i,longitude:o}}})}),Wn=e=>{const t=e.locations.map(u),n=e.useEntryPoints??"main-when-available",r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${On(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${kn(e.locations,t,n)}/json`),a=r.searchParams;ie(a,e),"language"in e||a.append("language","en-GB"),yn(a,e),pe(a,"computeTravelTimeFor",e.computeAdditionalTravelTimeFor),((e,t)=>{if(t?.guidance){const n=t.guidance;e.append("instructionsType",n.type),e.append("guidanceVersion",String(n.version??2)),e.append("instructionPhonetics",n.phonetics??"IPA"),e.append("language",t.language??"en-US")}})(a,e),!I(e.maxAlternatives)&&a.append("maxAlternatives",String(e.maxAlternatives)),((e,t,n)=>{se(e,"sectionType",(t??(n?g:m)).map(e=>"vehicleRestricted"===e?"travelMode":e))})(a,e.sectionTypes,!!e.guidance?.type);for(const i of e.extendedRouteRepresentations??["distance","travelTime"])a.append("extendedRouteRepresentation",i);const o=((e,t,n)=>{const r=t.includes("path"),a=!!On(e),o=e.costModel?.avoidAreas;if(!r&&!a&&!o)return null;const i=(e.vehicle?.model)?.engine?.charging;return{...r&&Bn(e.locations,t,n),...a&&i&&{chargingParameters:x(i,"maxChargeKWH")},...o?.length&&{avoidAreas:jn(o)}}})(e,t,n);return o?{method:"POST",url:r,data:o}:{method:"GET",url:r}},qn=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},Nn=(e,t)=>{const n=e.chargingConnectionInfo,r=e.chargingParkLocation,a=[r.coordinate.longitude,r.coordinate.latitude],o=[r.street,r.houseNumber].filter(Boolean),i=o.length>0?o.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:a},properties:{...x(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:i,...r.street&&{streetName:r.street},...r.houseNumber&&{streetNumber:r.houseNumber},...r.city&&{municipality:r.city},...r.region&&{countrySubdivision:r.region},...r.postalCode&&{postalCode:r.postalCode},...r.country&&{country:r.country}},...n&&{chargingConnectionInfo:{plugType:n.chargingPlugType,currentInA:n.chargingCurrentInA,voltageInV:n.chargingVoltageInV,chargingPowerInkW:n.chargingPowerInkW,currentType:qn(n.chargingCurrentType),chargingSpeed:be(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:be(e.chargingParkPowerInkW)}}}},Hn=(e,t)=>{const n=(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,...n&&e.batteryConsumptionInkWh&&{batteryConsumptionInPCT:100*e.batteryConsumptionInkWh/n},remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...n&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/n},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:Nn(e.chargingInformationAtEndOfLeg,n)}}},Kn=(e,t)=>e.reduce((e,n,r)=>{const a=0===r?0:e[r-1]?.endPointIndex;let o;return I(a)||(o=0===a?n.points?.length>0?n.points.length-1:0:a+n.points?.length),e.push({...!I(a)&&{startPointIndex:a},...o&&{endPointIndex:o},summary:Hn(n.summary,t),id:i()}),e},[]),Vn=e=>({id:i(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),_n=e=>({...Vn(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),$n=e=>({...Vn(e),countryCodeISO3:e.countryCode}),Gn=e=>"other"===e.travelMode?Vn(e):null,zn=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"]}},Yn=e=>({...Vn(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:zn(e),magnitudeOfDelay:d[e.magnitudeOfDelay],tec:e.tec}),Zn=e=>({...Vn(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),Jn=e=>({...Vn(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),Qn=e=>({...Vn(e),roadShieldReferences:e.roadShieldReferences}),Xn=(e,t)=>(t[e]||(t[e]=[]),t[e]),er=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Vn};case"COUNTRY":return{sectionType:"country",mappingFunction:$n};case"FERRY":return{sectionType:"ferry",mappingFunction:Vn};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Vn};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Vn};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:$n};case"TOLL":return{sectionType:"toll",mappingFunction:Vn};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:Yn};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:Gn};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Vn};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Vn};case"URBAN":return{sectionType:"urban",mappingFunction:Vn};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Vn};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Vn};case"LANES":return{sectionType:"lanes",mappingFunction:Zn};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:Jn};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:Qn};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:_n}}},tr=(e,t)=>{const n={leg:Kn(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const n of e){const e=er(n),r=e?.mappingFunction(n);r&&Xn(e.sectionType,t).push(r)}})(e.sections,n),n},nr=1e-4,rr=(e,t)=>Math.abs(e[0]-t[0])<nr&&Math.abs(e[1]-t[1])<nr,ar=(e,t)=>{const n=[];let r=0;for(const a of e.instructions){const e=[a.maneuverPoint.longitude,a.maneuverPoint.latitude];for(let n=r;n<t.length;n++){if(rr(t[n],e)){r=n;break}if(n===t.length-1)break}n.push({...a,maneuverPoint:e,pathPointIndex:r,routePath:a.routePath.map(e=>({...e,point:[e.point.longitude,e.point.latitude]}))})}return{instructions:n}},or=(e,t)=>{const n=e.routes.map((e,n)=>((e,t,n)=>{const a={type:"LineString",coordinates:e.legs.flatMap(e=>e.points?.map(e=>[e.longitude,e.latitude]))};return{type:"Feature",geometry:a,id:i(),bbox:r(a),properties:{index:t,summary:Hn(e.summary,n),sections:tr(e,n),...e.guidance&&{guidance:ar(e.guidance,a.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),a=r(n);return{type:"FeatureCollection",...a&&{bbox:a},features:n}},ir={requestValidation:{schema:En,refinements:[{check:e=>!!e.locations.map(u).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:Wn,sendRequest:N,parseResponse:or,parseResponseError:Pt,getAPIVersion:()=>2},sr={buildCalculateRouteRequest:Wn,parseCalculateRouteResponse:or,calculateRouteTemplate:ir},cr=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],pr={speed:"SPEED",freeFlowSpeed:"FREE_FLOW_SPEED",congestionLevel:"CONGESTION_LEVEL",travelTime:"TRAVEL_TIME",networkLength:"NETWORK_LENGTH"},ur=e=>e instanceof Date?e.toISOString().slice(0,10):e,lr=Array.from({length:24},(e,t)=>t),dr=e=>cr.indexOf(e),mr=t=>{const n=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/areaanalytics/reports/lite`)(t));ie(n.searchParams,t);const r=e=>{const t=/* @__PURE__ */new Date;return t.setDate(t.getDate()-e),t},a=Array.isArray(t.days)?{days:t.days.map(ur)}:{startDate:ur(t.startDate??r(3)),endDate:ur(t.endDate??r(2))};return{method:"POST",url:n,data:{name:t.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...a,dataTypes:"all"===t.metrics?e.map(e=>pr[e]):t.metrics.map(e=>pr[e]),frcs:"all"===t.functionalRoadClasses?cr.map((e,t)=>t):t.functionalRoadClasses.map(dr),hours:"all"===t.hours?lr:t.hours,features:[{type:"Feature",geometry:t.geometry}]}}},gr=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}}),yr=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},...gr(e)}),hr=(e,t)=>{const n=new Date(e);return n.setDate(n.getDate()+t),n},fr=(e,t)=>e.map((e,n)=>{const r=yr(e);return void 0===r.date&&(r.date=hr(t,Math.floor(n/24))),void 0===r.hour&&(r.hour=n%24),r}),br=(e,t)=>e.map((e,n)=>{const r=yr(e);return void 0===r.date&&(r.date=hr(t,n)),r}),Rr=e=>({tileCentre:[e.lon,e.lat],...gr(e)}),Tr=e=>({startDate:new Date(e.startDate),endDate:new Date(e.endDate),labels:e.labels}),vr=(e,t)=>{return{...e.yearly&&{yearly:e.yearly.map(yr)},...e.monthly&&{monthly:e.monthly.map(yr)},...e.weekly&&{weekly:e.weekly.map(yr)},...e.daily&&{daily:br(e.daily,t)},...e.hourly&&{hourly:fr(e.hourly,t)},...e.average&&{average:(n=e.average,n.map((e,t)=>{const n=yr(e);return void 0===n.day&&(n.day=Math.floor(t/24)+1),void 0===n.hour&&(n.hour=t%24),n}))}};var n},Sr={SPEED:"speed",FREE_FLOW_SPEED:"freeFlowSpeed",CONGESTION_LEVEL:"congestionLevel",TRAVEL_TIME:"travelTime",NETWORK_LENGTH:"networkLength"},Cr=e=>{const t={};for(const[n,r]of Object.entries(e)){const e=Sr[n];e&&(t[e]=r.map(Tr))}return t},Pr=(e,t)=>({name:e.name,timezone:e.timezone,level:e.level,baseData:gr(e.baseData),timedData:vr(e.timedData,t),...e.tiledData&&{tiledData:{tiles:e.tiledData.tiles.map(Rr)}},...e.anomalies&&{anomalies:Cr(e.anomalies)}}),Ir=t=>{const n=t.flatMap(e=>e.properties.tiledData?.tiles??[]),r={};for(const a of e){const e=n.map(e=>e[a]).filter(e=>null!=e);e.length>0&&(r[a]={min:Math.min(...e),max:Math.max(...e)})}return r},xr=e=>{const t=new Date(e.properties.startDate),n=e.features.map(e=>((e,t)=>({type:e.type,id:e.id,geometry:e.geometry,properties:Pr(e.properties,t),bbox:r(e.geometry)}))(e,t));return{type:"FeatureCollection",properties:{startDate:t,endDate:new Date(e.properties.endDate),metrics:e.properties.dataTypes.map(e=>Sr[e]).filter(e=>void 0!==e),heatmap:e.properties.heatmap,frcs:e.properties.frcs,ranges:Ir(n)},features:n}},wr=P.union([P.date(),P.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]),Ar=P.union([P.object({type:P.literal("Polygon"),coordinates:P.array(P.array(P.array(P.number()))).min(1)}),P.object({type:P.literal("MultiPolygon"),coordinates:P.array(P.array(P.array(P.array(P.number())))).min(1)})]),Lr=e=>e instanceof Date?e:new Date(e),Dr=e=>{const t=/* @__PURE__ */new Date,n=Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate());return(e=>{const t=Lr(e);return Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate())})(e)<=n-1728e5},Mr={requestValidation:{schema:F.extend({name:P.string().optional(),startDate:wr.optional(),endDate:wr.optional(),days:P.array(wr).min(1).optional(),metrics:P.union([P.array(P.enum([...e])).min(1),P.literal("all")]),functionalRoadClasses:P.union([P.array(P.enum([...cr])).min(1),P.literal("all")]),hours:P.union([P.array(P.number().int().min(0).max(23)).min(1),P.literal("all")]),geometry:Ar}).refine(e=>{const t=void 0!==e.days,n=void 0!==e.startDate;if(t&&n)return!1;if(!t&&!n)return!1;if(void 0!==e.startDate){const t=((void 0!==e.endDate?Lr(e.endDate):/* @__PURE__ */new Date).getTime()-Lr(e.startDate).getTime())/864e5;return t>=1&&t<=31}return!0},{message:"Provide either startDate (with optional endDate, at least 1 day apart and within 31 days) or days — but not both"}).refine(e=>void 0!==e.days?e.days.every(Dr):Dr(e.endDate??/* @__PURE__ */new Date),{message:"Dates must be at least 2 days before today"})},buildRequest:mr,sendRequest:N,parseResponse:xr},Er={buildTrafficAreaAnalyticsRequest:mr,parseTrafficAreaAnalyticsResponse:xr,trafficAreaAnalyticsTemplate:Mr},Or=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidentDetails`)(e)),n=t.searchParams;if(ie(n,e),((e,t)=>{pe(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}}}}}"),pe(e,"t",t.trafficModelId),ce(e,"categoryFilter",t.categoryFilter?.map(S)),ce(e,"timeValidityFilter",t.timeValidityFilter)})(n,e),"bbox"in e&&e.bbox){const a=r(e.bbox);return a&&n.append("bbox",a.join(",")),{method:"GET",url:t}}const{ids:a}=e;return a.length>5?{method:"POST",url:t,data:{ids:a}}:(n.append("ids",a.join(",")),{method:"GET",url:t})},Fr=e=>({description:e.description,code:e.code,category:l(e.iconCategory)}),kr=e=>{const t=e.properties;return{type:"Feature",id:t.id,geometry:e.geometry,properties:{id:t.id,category:l(t.iconCategory),magnitudeOfDelay:d[t.magnitudeOfDelay]??"unknown",events:(t.events??[]).map(Fr),...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:(n=t.tmc,{countryCode:n.countryCode,tableNumber:n.tableNumber,tableVersion:n.tableVersion,direction:n.direction,points:(n.points??[]).map(e=>({location:e.location,...void 0!==e.offset&&{offset:e.offset}}))})}}};var n},Ur=e=>({type:"FeatureCollection",features:(e.incidents??[]).filter(e=>null!==e).map(kr)}),Br={requestValidation:{schema:F.extend({bbox:Y.optional(),ids:P.array(P.string()).optional(),trafficModelId:P.string().optional(),categoryFilter:P.array(P.enum([...v])).optional(),timeValidityFilter:P.array(P.enum(["present","future"])).optional()}).refine(e=>!(e.bbox&&e.ids),{message:"Provide either bbox or ids, not both"})},buildRequest:Or,sendRequest:N,parseResponse:Ur},jr={alongRouteSearch:je,reverseGeocode:wn,geocode:et,geometryData:ct,geometrySearch:ht,calculateRoute:sr,reachableRange:vn,evChargingStationsAvailability:_e,trafficAreaAnalytics:Er,trafficIncidentDetails:{buildTrafficIncidentDetailsRequest:Or,parseTrafficIncidentDetailsResponse:Ur,trafficIncidentDetailsTemplate:Br},placeByID:Ct,autocompleteSearch:We},Wr=async(e,t)=>U(e,{...Ve,...t},"EVChargingStationsAvailability"),qr=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const n=await Wr({id:t}),r=e.properties.poi;return n?{...e,properties:{...e.properties,...r&&{poi:{...r,openingHours:n.openingHours}},chargingPark:{...e.properties.chargingPark,availability:n}}}:void 0}catch(n){return void console.error(n)}};async function Nr(e,t){const n=[];for(const r of e.features){const e=await qr(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:r(n)}}var Hr=e=>Boolean(e&&"availability"in e&&e.availability),Kr=P.array(P.number()).min(2),Vr=P.object({type:P.literal("Polygon"),coordinates:P.array(P.array(P.array(P.number()))),bbox:P.array(P.number()).optional()}),_r=P.object({type:P.literal("MultiPolygon"),coordinates:P.array(P.array(P.array(P.array(P.number())))),bbox:P.array(P.number()).optional()}),$r=P.object({type:P.literal("Circle"),coordinates:Kr,radius:P.number().positive()}),Gr=P.object({type:P.literal("FeatureCollection"),features:P.array(P.object({type:P.literal("Feature"),geometry:P.union([Vr,_r]),properties:P.any().optional()}))}),zr=P.union([Vr,_r,$r,Gr]),Yr=P.tuple([P.number(),P.number(),P.number(),P.number()]),Zr=P.object({bbox:Yr}),Jr=P.union([Yr,Zr]),Qr=P.enum(["POI","PointAddress","Street"]),Xr=P.object({municipalities:P.array(P.string()).optional(),boundingBoxes:P.array(Jr).optional(),geometries:P.array(zr).optional(),placeTypes:P.array(Qr).min(1).optional(),offset:P.number().int().min(0).max(1e4).optional(),limit:P.number().int().min(1).max(1e4).optional()}),ea=Q.extend($e.extend(Xr.shape).shape),ta=e=>{const[t,n]=e.coordinates,r=e.radius/6371e3*(180/Math.PI),a=r/Math.cos(n*Math.PI/180),o=[];for(let i=0;i<64;i++){const e=2*Math.PI*i/64;o.push([t+a*Math.cos(e),n+r*Math.sin(e)])}return o.push(o[0]),{type:"Polygon",coordinates:[o]}},na=e=>{switch(e.type){case"Polygon":case"MultiPolygon":return[e];case"Circle":return[ta(e)];case"FeatureCollection":return e.features.map(e=>e.geometry)}},ra=e=>(e=>{if(e.length<2)return e;const[t,n]=[e[0],e[e.length-1]];return t[0]===n[0]&&t[1]===n[1]?e:[...e,[...t]]})((e=>e.filter((t,n)=>0===n||t[0]!==e[n-1][0]||t[1]!==e[n-1][1]))(e)),aa=e=>"Polygon"===e.type?{...e,coordinates:e.coordinates.map(ra)}:{...e,coordinates:e.coordinates.map(e=>e.map(ra))},oa={POI:"POI",PointAddress:"Point Address",Street:"Street"},ia=e=>{const t=(e=>{const t=/* @__PURE__ */new Set;for(const n of e.categorySet??[])t.add(Number(n));return e.preferredCategoryId&&t.add(Number(e.preferredCategoryId)),[...t].filter(e=>Number.isFinite(e))})(e);t.sort((e,t)=>t-e);const n=/* @__PURE__ */new Set,r=[];for(const a of t){const e=R[a];e&&!n.has(e)&&(n.add(e),r.push(e))}return r},sa=e=>{const{id:t,position:n,address:r,score:a,distance_m:o,type:i,viewport:s}=e,c=oa[i??"POI"],p=(e=>{if(e?.name)return{name:e.name,categories:ia(e),localizedCategories:e.classifications?.map(e=>e.name)??[],...e.phone&&{phone:e.phone},...e.url&&{url:e.url},...e.brands?.length&&{brands:e.brands.map(e=>e.name)},...e.timeZone?.ianaId&&{timeZone:e.timeZone}}})(e.poi),u=(e=>{if(!e)return;const[[t,n],[r,a]]=e.coordinates;return[t,n,r,a]})(s);return{type:"Feature",id:t,geometry:T(n),...u&&{bbox:u},properties:{type:c,...r&&{address:r},...p&&{poi:p},...void 0!==a&&{score:a},...void 0!==o&&{distance:o}}}},ca=(e,t)=>{const n=!!c(t.position),r=n?c(t.position):null;return{query:t.query??"",queryType:n?"NEARBY":"NON_NEAR",queryTime:0,numResults:e.hits.length,offset:t.offset??0,totalResults:e.total,fuzzyLevel:0,...r&&{geoBias:r}}},pa={requestValidation:{schema:ea,refinements:[{check:e=>!!(e.position||e.boundingBox||e.boundingBoxes?.length||e.geometries?.length||e.municipalities?.length),message:"A geographic bias is required: provide one of position, boundingBox(es), geometries, or municipalities."}]},buildRequest:e=>{const t=new URL("/places",(e=>e.customServiceBaseURL??"https://search-places-poc.whitebush-bbe9c5f7.westeurope.azurecontainerapps.io")(e)),n=(e=>{const t=c(e.position);if(t)return{coordinates:t,radius_km:e.radiusMeters&&e.radiusMeters>0?e.radiusMeters/1e3:2}})(e),a=(e=>e.poiCategories?.length?e.poiCategories.map(e=>String(b[e])):void 0)(e),o=(e=>{const t=[...e.boundingBox?[e.boundingBox]:[],...e.boundingBoxes??[]].map(e=>r(e)).filter(e=>void 0!==e);return t.length?t:void 0})(e),i=(e=>{if(!e.geometries?.length)return;const t=e.geometries.flatMap(na).map(aa);return t.length?t:void 0})(e),s=(e=>e.municipalities?.length?e.municipalities:void 0)(e);return{url:t,data:{...e.query&&{q:e.query},...e.countries?.[0]&&{country:e.countries[0]},...s&&{municipalities:s},...e.poiBrands?.[0]&&{brand:e.poiBrands[0]},...a&&{categories:a},...e.placeTypes?.length&&{types:e.placeTypes},...n&&{near:n},...o&&{bboxes:o},...i&&{geometries:i},...void 0!==e.offset&&{from:e.offset},...void 0!==e.limit&&{size:e.limit}}}},sendRequest:q,parseResponse:(e,t)=>{const n=e.hits.map(sa),o=a(r(n));return{type:"FeatureCollection",properties:ca(e,t),features:n,...o&&{bbox:o}}}},ua=async(e,t)=>U(e,{...pa,...t},"ExplorationSearch"),la=async(e,t)=>U(e,{...Xe,...t},"Geocode"),da=async e=>{const t=await la({query:e,limit:1});if(!t.features[0])throw new Error(`geocodeOne: no results found for "${e}"`);return t.features[0]};async function ma(e,t){const n=await U(e,{...st,...t},"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?n:((e,t)=>{const n=e.features.reduce((e,t)=>{const n=t.properties.dataSources?.geometry?.id;return n&&(e[n]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),r=t.features.map(e=>e.id&&n[e.id]?{...e,properties:n[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:r}})(e.geometries,n)}var ga=async(e,t)=>U(e,{...St,...t},"PlaceById"),ya=/* @__PURE__ */new Map,ha=/* @__PURE__ */new Map,fa="en-GB",ba=e=>e??fa,Ra=e=>e.toLowerCase().replaceAll(/[\s\-_,]+/g,""),Ta=e=>{const t={};for(const n of e){const e=[n.name,...n.synonyms].map(Ra);for(const r of e)t[r]=n}return t},va=F.extend({filters:P.array(P.string()).optional()}),Sa=e=>{const t=R[e.id];return t?{code:t,name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>R[e]).filter(e=>!!e),synonyms:e.synonyms}:(console.error(`Received unknown POI category ID ${e.id} (${e.name}). This category will be skipped and unavailable for filtering.`),null)},Ca={requestValidation:{schema:va},buildRequest:e=>{const t=e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/poiCategories.json`,n=new URL(t);return ie(n.searchParams,e),n},getAPIVersion:()=>1,sendRequest:W,parseResponse:e=>({poiCategories:e.poiCategories.map(Sa).filter(e=>null!==e)})},Pa=(e,t)=>{const n=(e=>ha.get(e??fa)??{})(e),r=/* @__PURE__ */new Map;for(const a of t){const e=Ra(a);for(const[t,a]of Object.entries(n))t.includes(e)&&a&&r.set(a.code,a)}for(const a of r.values())for(const e of a.childCategoryCodes)r.delete(e);return[...r.values()]},Ia=async(e={})=>{const{language:t}=y(e);let n=(e=>ya.get(ba(e)))(t);return n||(n=(await U(e,Ca,"POICategories")).poiCategories,((e,t)=>{const n=ba(e);ya.set(n,t),ha.set(n,Ta(t))})(t,n)),e.filters?.length?{poiCategories:Pa(t,e.filters)}:{poiCategories:n}},xa=async(e={})=>{const{poiCategories:t}=await Ia(e);return t.map(e=>e.code)},wa=async(e,t)=>U(e,{...Tn,...t},"Reachable Range"),Aa=async(e,t,n)=>{const a=[];for(const r of e){t?.signal?.throwIfAborted();try{a.push(await wa(r,n))}catch(i){if(!(i instanceof D)||403===i.status||429===i.status)throw i}}const o=r(a);return{type:"FeatureCollection",...o&&{bbox:o},features:a}},La=async(e,t)=>U(e,{...xn,...t},"ReverseGeocode"),Da=async(e,t)=>U(e,{...ir,...t},"Routing"),Ma=P.object({minFuzzyLevel:P.number().min(1).max(4).optional(),maxFuzzyLevel:P.number().min(1).max(4).optional()}),Ea=Q.extend($e.extend(Ma.shape).shape),Oa=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:Se(e.details)}};break;case"NEARBY":t={...e,details:{position:Se({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},Fa={requestValidation:{schema:Ea},buildRequest:e=>{const t=new URL(`${(e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/search/${e.query??""}.json`)(e)}`);le(t,e);const n=t.searchParams;pe(n,"typeahead",e.typeahead),pe(n,"ofs",e.offset),ce(n,"countrySet",e.countries),pe(n,"radius",e.radiusMeters);const a=e.boundingBox&&r(e.boundingBox);return a&&(n.append("topLeft",ze([a[3],a[0]])),n.append("btmRight",ze([a[1],a[2]]))),pe(n,"minFuzzyLevel",e.minFuzzyLevel),pe(n,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:W,parseResponse:e=>{const t=e.results.map(xe),n=a(r(t));return{type:"FeatureCollection",properties:{...we(e.summary),queryIntent:e.summary.queryIntent.map(Oa)},features:t,...n&&{bbox:n}}}},ka=async(e,t)=>"route"in e?De(e,t):"geometries"in e?yt(e,t):(async(e,t)=>U(e,{...Fa,...t},"FuzzySearch"))(e,t),Ua=async e=>{const t=await ka({query:e,limit:1});if(!t.features[0])throw new Error(`searchOne: no results found for "${e}"`);return t.features[0]},Ba=async(e,t)=>U(e,{...Mr,...t},"TrafficAreaAnalytics"),ja=async(e,t)=>U(e,{...Br,...t},"TrafficIncidentDetails");export{L as APIErrorCode,A as SDKError,D as SDKServiceError,De as alongRouteSearch,Be as autocompleteSearch,sn as budgetTypes,E as buildResponseError,O as buildValidationError,wa as calculateReachableRange,Aa as calculateReachableRanges,Da as calculateRoute,jr as customizeService,Wr as evChargingStationsAvailability,ua as explorationSearch,la as geocode,da as geocodeOne,ma as geometryData,Ia as getPOICategories,xa as getPOICategoryCodes,qr as getPlaceWithEVAvailability,Nr as getPlacesWithEVAvailability,Hr as hasChargingAvailability,M as parseDefaultResponseError,ga as placeById,La as reverseGeocode,Ne as routeTypes,ka as search,Ua as searchOne,Ba as trafficAreaAnalytics,ja as trafficIncidentDetails};
1
+ import{TomTomConfig as e,areaAnalyticsMetricKeys as t,avoidableTypes as n,bboxFromCoordsArray as r,bboxFromGeoJSON as a,bboxOnlyIfWithArea as o,currentTypes as i,generateId as s,generateTomTomHeaders as c,getPosition as p,getPositionStrict as u,getRoutePlanningLocationType as l,iconToTrafficIncidentCategory as d,indexedMagnitudes as m,inputSectionTypes as g,inputSectionTypesWithGuidance as y,mergeFromGlobal as h,plugTypes as f,poiCategories as b,poiCategoriesToID as T,poiIDsToCategories as R,toPointGeometry as v,trafficIncidentRequestCategories as S,trafficIncidentToIconCategory as C,views as P}from"@tomtom-org/maps-sdk/core";import{z as I}from"zod";import{isNil as x,omit as w}from"lodash-es";var A=/* @__PURE__ */function(e){return e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e}({}),L=class e extends Error{constructor(t,n,r){super(t),this.service=n,this.issues=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},D={[A.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[A.FORBIDDEN]:"Request failed with status code 403"},M=class extends L{constructor(e,t,n){super(e,t),this.status=n,this.status&&D[this.status]&&(this.message=D[this.status])}},E=(e,t)=>{const{data:n,message:r,status:a}=e;return new M(n?.error||n?.errorText||r,t,a)},O=(e,t,n)=>{if(e.status){const r=e;return n?n(r,t):E(r,t)}return new L(e.message,t)},F=(e,t)=>new L(e.message,t,e.issues),k=I.object({apiKey:I.string().optional(),commonBaseURL:I.string().optional(),customServiceBaseURL:I.string().optional(),language:I.string().optional()}),j=(e,t=0)=>{const n=e.path.length>0?`${e.path.join(".")}: `:"";if("invalid_union"===e.code){const r=e.unionErrors;if(r?.length)return`${n}no matching union member (${r.map((e,n)=>`option[${n}]: { ${e.issues.map(e=>j(e,t+1)).join(", ")} }`).join(" | ")})`}return`${n}${e.message}`},U=class extends Error{constructor(e){super(`${e.issues.map(e=>j(e)).join("; ")}\nIssues: ${JSON.stringify(e.issues,null,2)}`),this.issues=e.issues}},B=async(e,t,n)=>{const r=t.getAPIVersion?.(e),a=h({...e,...r&&{apiVersion:r}});if(void 0===e.validateRequest||e.validateRequest)try{((e,t)=>{const n=(t?.schema?k.extend(t.schema.shape):k).superRefine((e,n)=>{if("commonBaseURL"in e||"customServiceBaseURL"in e||n.addIssue({code:"custom",message:"commonBaseURL or customServiceBaseURL is required"}),t?.refinements?.length)for(const r of t.refinements)r.check(e)||n.addIssue({code:"custom",message:r.message})}).safeParse(e);if(!n.success)throw new U(n.error)})(a,t.requestValidation)}catch(s){throw F(s,n)}const o=t.buildRequest(a),i=c(a);e.onAPIRequest?.(o);try{const n=await t.sendRequest(o,i);return e.onAPIResponse?.(o,n),t.parseResponse(await n.data,a)}catch(s){throw e.onAPIResponse?.(o,s),O(s,n,t.parseResponseError)}},W=class e extends Error{constructor(t,n,r){super(n??`HTTP Error ${t}`),this.name="FetchError",this.status=t,this.data=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},q=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,n;const r=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:r?.includes("application/json")?(n=await e.json(),t=n?.errorText??n?.message??n?.detailedError?.message):r?.includes("text/xml")&&(n=await e.text(),t=e.statusText),new W(e.status,t,n)},N=async t=>{const n=e.instance.get().retry;if(!n)return t();const{initialWaitMs:r,backoffFactor:a,timeoutMs:o}=n,i=Date.now();let s=r,c=await t();for(;429===c.status;){const e=Number.parseInt(c.headers.get("retry-after")??"",10),n=Number.isFinite(e)?1e3*e:s;if(Date.now()-i+n>o)break;await c.text().catch(()=>{}),await new Promise(e=>setTimeout(e,n)),s*=a,c=await t()}return c},H=async(e,t)=>q(await N(()=>fetch(e,{headers:t}))),K=async(e,t)=>q(await N(()=>fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}}))),$=async(e,t)=>{const n=e.method;if("GET"===n)return H(e.url,t);if("POST"===n)return K(e,t);throw new Error(`Unsupported HTTP method received: ${n}`)},V=I.array(I.array(I.number())),_=I.object({type:I.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]),coordinates:I.union([I.array(I.number()),V,I.array(I.array(I.array(I.number()))),I.array(I.array(I.array(I.array(I.number()))))]),radius:I.optional(I.number()),radiusMeters:I.optional(I.number()),bbox:I.optional(I.array(I.number()))}).check(I.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),G=I.object({type:I.literal("Feature"),geometry:_,id:I.optional(I.union([I.string(),I.number()])),properties:I.unknown().optional(),bbox:I.optional(I.array(I.number()))}),z=I.object({type:I.literal("FeatureCollection"),features:I.array(G),id:I.optional(I.union([I.string(),I.number()])),properties:I.unknown().optional(),bbox:I.optional(I.array(I.number()))}),Y=I.union([I.tuple([I.number().min(-180).max(180),I.number().min(-90).max(90)]),I.tuple([I.number().min(-180).max(180),I.number().min(-90).max(90),I.number()]),I.object({type:I.literal("Point"),coordinates:I.array(I.number())}),G]),Z=I.union([I.array(I.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),I.array(I.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]),J=I.union([_,G,z]),Q=I.union([Z,J,I.array(J)]),X=I.object({query:I.string().optional(),position:Y.optional(),limit:I.number().max(100).optional(),extendedPostalCodesFor:I.array(I.string()).optional(),mapcodes:I.array(I.string()).optional(),view:I.enum(P).optional(),geographyTypes:I.array(I.string()).optional()}),ee=I.object({indexes:I.array(I.string()).optional(),poiCategories:I.array(I.enum(b)).optional(),poiBrands:I.array(I.string()).optional(),connectors:I.array(I.string()).optional(),fuelTypes:I.array(I.string()).optional(),openingHours:I.string().optional(),timeZone:I.string().optional(),relatedPois:I.string().optional(),minPowerKW:I.number().optional(),maxPowerKW:I.number().optional(),minFuzzyLevel:I.number().optional(),maxFuzzyLevel:I.number().optional()}),te=X.extend(ee.shape),ne=I.object({type:I.literal("LineString"),coordinates:V}),re=I.object({type:I.literal("Feature"),geometry:ne}),ae=V,oe=I.union([ne,re,ae]),ie=I.object({route:oe,maxDetourTimeSeconds:I.number().int().positive()}),se=I.object({sortBy:I.enum(["detourTime","detourOffset"]).optional()}),ce=te.extend({...ie.shape,...se.shape}),pe=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},ue=(e,t,n)=>{for(const r of n||[])e.append(t,r)},le=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},de=(e,t,n)=>{!x(n)&&e.append(t,String(n))},me=(e,t)=>{const n=p(t);n&&(e.append("lat",String(n[1])),e.append("lon",String(n[0])))},ge=(e,t)=>{const n=e.searchParams;pe(n,t),de(n,"limit",t.limit),me(n,"position"in t?t.position:void 0),le(n,"fuelSet",t.fuelTypes),le(n,"idxSet",t.indexes),le(n,"brandSet",t.poiBrands),t.poiCategories&&le(n,"categorySet",t.poiCategories.map(e=>T[e])),le(n,"connectorSet",t.connectors),le(n,"mapcodes",t.mapcodes),le(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),de(n,"minPowerKW",t.minPowerKW),de(n,"maxPowerKW",t.maxPowerKW),de(n,"view",t.view),de(n,"openingHours",t.openingHours),de(n,"timeZone",t.timeZone),de(n,"relatedPois",t.relatedPois),le(n,"entityTypeSet",t.geographyTypes)},ye=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/searchAlongRoute/${e.query??""}.json`)(e));ge(t,e);const n=t.searchParams;return n.append("maxDetourTime",String(e.maxDetourTimeSeconds)),de(n,"sortBy",e.sortBy),de(n,"spreadingMode","plan"),{url:t,data:{route:{points:(r=e.route,Array.isArray(r)?{type:"LineString",coordinates:r}:"Feature"===r.type?r.geometry:r).coordinates.map(e=>({lat:e[1],lon:e[0]}))}}};var r},he=e=>{const t={count:0,statusCounts:{}};for(const n of e)for(const e of n.chargingPoints)t.count++,t.statusCounts[e.status]=(t.statusCounts[e.status]||0)+1;return t},fe=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,be=(e,t,n)=>{if(e)for(const r of e){const e=n.find(e=>fe(r,e.connector));if(e){if(e.count++,t){const n=e.statusCounts;e.statusCounts[t]=(n[t]||0)+1}}else n.push({connector:r,count:1,statusCounts:t?{[t]:1}:{}})}},Te=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>fe(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},Re=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)be(e.connectors,e.status,t);return t},ve=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",Se=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},Ce=e=>`${e[1]},${e[0]}`,Pe=e=>{let t,n;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=Se(e.southWest),n=Se(e.northEast)),[t[0],t[1],n[0],n[1]]},Ie=e=>[e.lon,e.lat],xe=e=>{const{year:t,month:n,day:r}=(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:n,day:r,hour:e.hour,minute:e.minute,date:new Date(t,n-1,r,e.hour,e.minute)}},we=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,Ae=e=>{const t=e.timeRanges.map(e=>({start:xe(e.startTime),end:xe(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:we(t)}},Le=e=>{const{position:t,entryPoints:n,poi:r,id:a,dist:o,boundingBox:i,chargingPark:s,...c}=e,p=s?.connectors?.map(e=>({...w(e,"connectorType"),type:e.connectorType,chargingSpeed:ve(e.ratedPowerKW)}));return{type:"Feature",geometry:v(Ie(t)),...i&&{bbox:Pe(i)},id:a,properties:{...w(c,"viewport"),...o&&{distance:o},...n?.length&&{entryPoints:n.map(e=>({...e,position:Ie(e.position)}))},...p?.length&&{chargingPark:{...s,connectors:Te(p)}},...r&&{poi:{name:r.name,categories:(r.categorySet?.map(e=>R[e.id])??[]).filter(e=>!!e),localizedCategories:r.categories??[],...r.phone&&{phone:r.phone},...r.brands&&{brands:r.brands.map(e=>e.name)},...r.url&&{url:r.url},...r.openingHours&&{openingHours:Ae(r.openingHours)},...r.timeZone&&{timeZone:r.timeZone}}}}}},De=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:Ie(t)},...n}},Me=e=>{const t=e.results.map(Le),n=o(a(t));return{type:"FeatureCollection",properties:{...De(e.summary)},features:t,...n&&{bbox:n}}},Ee={requestValidation:{schema:ce},buildRequest:ye,sendRequest:K,parseResponse:Me},Oe=async(e,t)=>B(e,{...Ee,...t},"AlongRouteSearch"),Fe=I.object({query:I.string()}),ke=I.object({position:Y.optional(),limit:I.number().max(100).optional(),radiusMeters:I.number().optional(),countries:I.array(I.string()).optional(),resultType:I.array(I.string()).optional()}),je=Fe.extend(ke.shape),Ue=e=>{const t=new URL(`${n=e,n.customServiceBaseURL||`${n.commonBaseURL}/maps/orbis/places/autocomplete/${n.query}.json`}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",pe(r,e),de(r,"limit",e.limit),me(r,e.position),le(r,"countrySet",e.countries),de(r,"radius",e.radiusMeters),le(r,"resultSet",e.resultType),t},Be=e=>{const{position:t,...n}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:Ie(t)},radiusMeters:n.radius}},results:(r=e.results,r.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...n}=e;return{...n,category:R[Number(t)]}}return e})})))};var r},We={requestValidation:{schema:je},buildRequest:Ue,sendRequest:H,parseResponse:Be},qe=async(e,t)=>B(e,{...We,...t},"Autocomplete"),Ne={alongRouteSearch:Oe,buildAlongRouteSearchRequest:ye,parseAlongRouteSearchResponse:Me,alongRouteSearchTemplate:Ee},He={autocompleteSearch:qe,buildAutocompleteSearchRequest:Ue,parseAutocompleteSearchResponse:Be,autocompleteSearchTemplate:We},Ke=k.extend({id:I.string()}),$e=["fast","short","efficient","thrilling"],Ve=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/ev/id`)(e)),n=t.searchParams;return pe(n,e),n.append("id",e.id),t},_e=e=>{const t=e.results?.[0];return t?{id:t.id,accessType:t.accessType,chargingStations:(n=t.chargingStations,n.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,connectors:e.connectors?.map(e=>({...e,chargingSpeed:ve(e.ratedPowerKW)}))}))}))),chargingPointAvailability:he(t.chargingStations),connectorAvailabilities:Re(t.chargingStations),...t.openingHours&&{openingHours:Ae(t.openingHours)}}:void 0;var n},Ge={requestValidation:{schema:Ke},buildRequest:Ve,sendRequest:H,parseResponse:_e,parseResponseError:(e,t)=>new M(e.data?.detailedError?.message??e.message,t,e.status)},ze={buildEVChargingStationsAvailabilityRequest:Ve,parseEVChargingStationsAvailabilityResponse:_e,evChargingStationsAvailabilityTemplate:Ge},Ye=I.object({typeahead:I.boolean().optional(),offset:I.number().max(1900).optional(),radiusMeters:I.number().optional(),boundingBox:Q.optional(),countries:I.array(I.string()).optional()}),Ze=k.extend(X.shape).extend(Ye.shape).extend({query:I.string()}),Je=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",Qe=(e,t)=>{const n=e.length;if(n<=t)return e;const r=[];let a;const o=Math.ceil(n/t);for(a=0;a<n;a+=o)r.push(e[a]);return t>1&&a>=n-o&&(r.length<t?r.push(e[n-1]):r[r.length-1]=e[n-1]),r},Xe=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/geocode`)(e)}/${e.query}.json`),n=t.searchParams;pe(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)),me(n,e.position),e.countries&&n.append("countrySet",Je(e.countries)),!x(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const r=e.boundingBox&&a(e.boundingBox);return r&&(n.append("topLeft",Je([r[3],r[0]])),n.append("btmRight",Je([r[1],r[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",Je(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",Je(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",Je(e.geographyTypes)),t},et=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:a,addressRanges:o,entityType:i,id:s,...c}=e;return{type:"Feature",geometry:v(Ie(t)),...n&&{bbox:Pe(n)},id:s,properties:{...w(c,"viewport"),...r&&{distance:r},...i&&{geographyType:i.split(",")},...a&&{entryPoints:a.map(e=>({...e,position:Ie(e.position)}))},...o&&{addressRanges:{...o,from:Ie(o.from),to:Ie(o.to)}}}}},tt=e=>{const t=e.results.map(et),n=o(a(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}},nt={requestValidation:{schema:Ze},buildRequest:Xe,sendRequest:H,parseResponse:tt},rt={buildGeocodingRequest:Xe,parseGeocodingResponse:tt,geocodingTemplate:nt},at=I.object({geometries:I.union([z,I.array(I.union([I.string(),G])).min(1).max(20)])}),ot=I.object({zoom:I.number().min(0).max(22).optional()}),it=at.extend(ot.shape),st=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),ct=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/additionalData.json`)(e)),n=t.searchParams;return n.append("apiVersion",String(e.apiVersion)),n.append("key",e.apiKey),((e,t)=>{let n;n=Array.isArray(t)?"string"==typeof t[0]?t:st(t):st(t.features),e.append("geometries",Je(n))})(n,e.geometries),de(n,"geometriesZoom",e.zoom),t},pt=e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??s(),bbox:a(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:a(t),features:t}},ut={requestValidation:{schema:it},buildRequest:ct,sendRequest:H,parseResponse:pt},lt={buildGeometryDataRequest:ct,parseGeometryDataResponse:pt,geometryDataTemplate:ut},dt=I.object({geometries:I.array(I.union([z,_]))}),mt=te.extend(dt.shape),gt=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:Ce(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:Qe(e.coordinates[0],50).map(e=>Ce(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const n=r(e[0]);if(n){const r=Math.abs((n[2]-n[0])*(n[3]-n[1]));t.set(e,r)}}),t=new Map([...t.entries()].sort((e,t)=>t[1]-e[1]).splice(0,50)),[...t.keys()]})(e).flatMap(e=>gt({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>gt({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>gt(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},yt=e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}/maps/orbis/places/geometrySearch/${n.query??""}.json`}`);var n;return ge(t,e),{url:t,data:{geometryList:e.geometries.flatMap(gt)}}},ht=e=>{const t=e.results.map(Le),n=o(a(t));return{type:"FeatureCollection",properties:{...De(e.summary)},features:t,...n&&{bbox:n}}},ft={requestValidation:{schema:mt},buildRequest:yt,sendRequest:K,parseResponse:ht},bt=async(e,t)=>B(e,{...ft,...t},"GeometrySearch"),Tt={geometrySearch:bt,buildGeometrySearchRequest:yt,parseGeometrySearchResponse:ht,geometrySearchTemplate:ft},Rt=I.object({entityId:I.string()}),vt=I.object({mapcodes:I.array(I.string()).optional(),view:I.enum(P).optional(),openingHours:I.string().optional(),timeZone:I.string().optional(),relatedPois:I.string().optional()}),St=Rt.extend(vt.shape),Ct=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/place.json`)(e)}`),n=t.searchParams;return pe(n,e),de(n,"entityId",e.entityId),le(n,"mapcodes",e.mapcodes),de(n,"view",e.view),de(n,"openingHours",e.openingHours),de(n,"timeZone",e.timeZone),de(n,"relatedPois",e.relatedPois),t},Pt=e=>e.results?.length?Le(e.results[0]):void 0,It={requestValidation:{schema:St},buildRequest:Ct,sendRequest:H,parseResponse:Pt},xt={buildPlaceByIdRequest:Ct,parsePlaceByIdResponse:Pt,placeByIdTemplate:It},wt=(e,t)=>{const{data:n,message:r,status:a}=e;return new M(n?.error?.description??n?.detailedError?.message??r,t,a)},At=I.number().positive(),Lt=I.number().min(0),Dt=I.number().min(0).max(100),Mt=At.optional(),Et=Lt.optional(),Ot=I.number().min(0).max(1).optional(),Ft=I.object({speedKMH:I.number(),consumptionUnitsPer100KM:I.number()}),kt={efficiency:I.object({acceleration:Ot,deceleration:Ot,uphill:Ot,downhill:Ot}).optional()},jt=I.array(Ft).min(1).max(25),Ut=I.object({...kt,speedsToConsumptionsLiters:jt,auxiliaryPowerInLitersPerHour:Et,fuelEnergyDensityInMJoulesPerLiter:I.number().min(1).optional()}),Bt=I.object({...kt,speedsToConsumptionsKWH:jt,auxiliaryPowerInkW:Et,consumptionInKWHPerKMAltitudeGain:I.number().max(500).optional(),recuperationInKWHPerKMAltitudeLoss:Et}),Wt=I.object({currentType:I.enum(i),plugTypes:I.array(I.enum(f)).min(1),efficiency:Ot,baseLoadInkW:Et,maxPowerInkW:Et,maxVoltageInV:Et,maxCurrentInA:Et,voltageRange:I.object({minVoltageInV:Et,maxVoltageInV:I.number().optional()}).optional()}),qt=I.object({stateOfChargeInkWh:Lt,maxPowerInkW:At}),Nt=I.object({maxChargeKWH:At,batteryCurve:I.array(qt).max(20).optional(),chargingConnectors:I.array(Wt).min(1).optional(),chargingTimeOffsetInSec:Et}),Ht=I.object({consumption:Ut}),Kt=I.object({consumption:Bt,charging:Nt.optional()}),$t=I.object({lengthMeters:Mt,widthMeters:Mt,heightMeters:Mt,weightKG:Mt,axleWeightKG:Mt}).optional(),Vt=I.object({variantId:I.string()}),_t=I.object({dimensions:$t,engine:I.union([Ht,Kt]).optional()}),Gt=I.union([Vt,_t]).optional(),zt=I.object({heading:I.number().min(0).max(360).optional()}),Yt=zt.extend({currentFuelInLiters:Lt}),Zt=zt.extend({currentChargePCT:Dt}),Jt=zt.extend({currentChargeInkWh:Lt}),Qt=I.union([Zt,Jt]),Xt=I.object({minChargeAtDestinationPCT:Dt,minChargeAtChargingStopsPCT:I.number().min(0).max(50)}),en=I.object({minChargeAtDestinationInkWh:Lt,minChargeAtChargingStopsInkWh:Lt}),tn=I.union([Xt,en]),nn=I.object({chargingPreferences:tn.optional()}),rn={model:Gt,restrictions:I.object({loadTypes:I.array(I.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional(),maxSpeedKMH:I.number().min(0).max(250).optional(),adrCode:I.enum(["B","C","D","E"]).optional(),commercial:I.boolean().optional()}).optional()},an=I.object({...rn,engineType:I.undefined().optional(),state:zt.optional(),preferences:I.object({}).optional()}),on=I.object({...rn,engineType:I.literal("combustion"),state:Yt.optional(),preferences:I.object({}).optional()}),sn=I.object({...rn,engineType:I.literal("electric"),state:Qt.optional(),preferences:nn.optional()}),cn=I.union([I.discriminatedUnion("engineType",[on,sn]),an]),pn=I.object({costModel:I.object({avoid:I.array(I.enum(n)).optional(),traffic:I.enum(["live","historical"]).optional(),routeType:I.enum($e).optional(),avoidAreas:I.array(Q).max(10).optional(),thrillingParams:I.object({hilliness:I.enum(["low","normal","high"]).optional(),windingness:I.enum(["low","normal","high"]).optional()}).optional()}).optional(),travelMode:I.string().optional(),vehicle:cn.optional(),when:I.object({option:I.enum(["departAt","arriveBy"]),date:I.date()}).optional()}),un=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],ln=I.object({origin:Y,budget:I.object({type:I.enum(un),value:I.number().min(0)})}),dn=I.object({maxFerryLengthMeters:I.number().min(0).optional(),smoothing:I.enum(["none","weak","strong"]).optional()}),mn=pn.extend(ln.extend(dn.shape).shape),gn=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),yn=(e,t,n)=>{((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,n.consumption.efficiency),"electric"===t?(((e,t)=>{t.speedsToConsumptionsKWH&&e.append("constantSpeedConsumptionInkWhPerHundredkm",gn(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,n.consumption),((e,t)=>{const n=t.charging;n?.maxChargeKWH&&e.append("maxChargeInkWh",String(n.maxChargeKWH))})(e,n)):((e,t)=>{const n=t.consumption;n.speedsToConsumptionsLiters&&e.append("constantSpeedConsumptionInLitersPerHundredkm",gn(n.speedsToConsumptionsLiters)),!x(n.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(n.auxiliaryPowerInLitersPerHour)),!x(n.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(n.fuelEnergyDensityInMJoulesPerLiter))})(e,n)},hn=(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&&yn(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},fn=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),hn(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 n=t.state;n.currentFuelInLiters&&e.append("currentFuelInLiters",String(n.currentFuelInLiters))}else if("electric"===t.engineType){const n=t.state,r=n,a=n;if(r.currentChargeInkWh)e.append("currentChargeInkWh",String(r.currentChargeInkWh));else if(a.currentChargePCT&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine.charging?.maxChargeKWH;n&&e.append("currentChargeInkWh",String(n*a.currentChargePCT/100))}}})(e,t),((e,t)=>{if(t.preferences&&"engineType"in t&&"electric"===t.engineType){const n=t.preferences;if(n.chargingPreferences){const r=n.chargingPreferences,a=r,o=r;if(a.minChargeAtChargingStopsInkWh||a.minChargeAtDestinationInkWh)e.append("minChargeAtDestinationInkWh",String(a.minChargeAtDestinationInkWh)),e.append("minChargeAtChargingStopsInkWh",String(a.minChargeAtChargingStopsInkWh));else if((o.minChargeAtChargingStopsPCT||o.minChargeAtDestinationPCT)&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine.charging?.maxChargeKWH;n&&(e.append("minChargeAtDestinationInkWh",String(n*o.minChargeAtDestinationPCT/100)),e.append("minChargeAtChargingStopsInkWh",String(n*o.minChargeAtChargingStopsPCT/100)))}}}})(e,t),((e,t)=>{const n=t.restrictions;n&&(ue(e,"vehicleLoadType",n.loadTypes),n.adrCode&&e.append("vehicleAdrTunnelRestrictionCode",n.adrCode),n.commercial&&e.append("vehicleCommercial",String(n.commercial)),n.maxSpeedKMH&&e.append("vehicleMaxSpeed",String(n.maxSpeedKMH)))})(e,t))},bn=(e,t)=>{const n=t.costModel;ue(e,"avoid",n?.avoid),de(e,"traffic",n?.traffic),((e,t)=>{if(t?.date){const n=t.date.toISOString();"departAt"===t.option?e.append("departAt",n):"arriveBy"===t.option&&e.append("arriveAt",n)}})(e,t.when),de(e,"routeType",n?.routeType),de(e,"travelMode",t.travelMode),fn(e,t.vehicle)},Tn=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},Rn=(e,t)=>{const n=t.budget;switch(n.type){case"timeMinutes":e.append("timeBudgetInSec",(60*n.value).toString());break;case"distanceKM":e.append("distanceBudgetInMeters",(1e3*n.value).toString());break;case"spentFuelLiters":e.append("fuelBudgetInLiters",n.value.toString());break;case"spentChargePCT":{const r=Tn(t);null!=r&&e.append("energyBudgetInkWh",(r*n.value/100).toString());break}case"remainingChargeCPT":{const r=(e=>{const t=e.vehicle;if(!t?.state)return;const n=t.state;if(null!=n.currentChargePCT){const t=Tn(e);if(null!=t)return t*n.currentChargePCT/100}})(t),a=Tn(t);if(null!=a&&null!=r){const t=a*n.value/100;e.append("energyBudgetInkWh",Math.max(0,r-t).toString())}break}default:e.append(n.type,n.value.toString())}},vn=e=>{const t=(e=>{const t=u(e.origin);return`${t[1]},${t[0]}`})(e),n=new URL(((e,t)=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange/${t}/json`)(e,t)),r=n.searchParams;return pe(r,e),r.delete("language"),bn(r,e),Rn(r,e),de(r,"maxFerryLengthInMeters",e.maxFerryLengthMeters),de(r,"smoothing",e.smoothing??"strong"),{method:"GET",url:n}},Sn=(e,t)=>{const n={type:"Polygon",coordinates:[e.reachableRange.boundary.map(e=>[e.longitude,e.latitude])]};return{type:"Feature",geometry:n,bbox:a(n),properties:t}},Cn={requestValidation:{schema:mn},buildRequest:vn,sendRequest:$,parseResponse:Sn,parseResponseError:wt,getAPIVersion:()=>2},Pn={buildReachableRangeRequest:vn,parseReachableRangeResponse:Sn,reachableRangeTemplate:Cn},In=e=>{const t=u(e.position),n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),r=n.searchParams;return pe(r,e),e.allowFreeformNewline&&r.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&r.append("entityType",Je(e.geographyType)),!x(e.heading)&&r.append("heading",String(e.heading)),e.mapcodes&&r.append("mapcodes",Je(e.mapcodes)),e.number&&r.append("number",e.number),!x(e.radiusMeters)&&r.append("radius",String(e.radiusMeters)),e.returnSpeedLimit&&r.append("returnSpeedLimit",String(e.returnSpeedLimit)),e.returnRoadUse&&r.append("returnRoadUse",String(e.returnRoadUse)),e.roadUses&&r.append("roadUse",JSON.stringify(e.roadUses)),n},xn=(e,t)=>{const n=e.addresses[0],{boundingBox:r,sideOfStreet:a,offsetPosition:o,...i}=n?.address||{};return{type:"Feature",geometry:v(u(t.position)),...r&&{bbox:Pe(r)},id:s(),...n&&{properties:{type:n?.entityType?"Geography":i.streetNumber?"Point Address":"Street",address:i,...n.dataSources&&{dataSources:n.dataSources},...n.mapcodes&&{mapcodes:n.mapcodes},...a&&{sideOfStreet:a},...o&&{offsetPosition:Se(o)},originalPosition:Se(n.position)}}}},wn=I.object({position:Y}),An=I.object({allowFreeformNewline:I.boolean().optional(),geographyType:I.array(I.string()).optional(),heading:I.number().min(-360).max(360).optional(),mapcodes:I.array(I.string()).optional(),number:I.string().optional(),radiusMeters:I.number().optional(),returnMatchType:I.boolean().optional(),returnRoadUse:I.boolean().optional(),returnSpeedLimit:I.boolean().optional(),roadUses:I.array(I.string()).optional(),view:I.enum(P).optional()}),Ln={requestValidation:{schema:wn.extend(An.shape)},buildRequest:In,sendRequest:H,parseResponse:xn},Dn={buildRevGeoRequest:In,parseRevGeoResponse:xn,reverseGeocodingTemplate:Ln},Mn=I.union([Y,_]),En=I.union([V,G]),On=I.object({locations:I.array(I.union([Mn,En])).min(1)}),Fn=I.object({computeAdditionalTravelTimeFor:I.enum(["none","all"]).optional(),vehicleHeading:I.number().min(0).max(359.5).optional(),maxAlternatives:I.number().min(0).max(5).optional(),sectionTypes:I.array(I.enum(y)).optional()}),kn=pn.extend(On.extend(Fn.shape).shape),jn=e=>(e.vehicle?.preferences)?.chargingPreferences,Un=e=>Array.isArray(e)?e:e.geometry.coordinates,Bn=(e,t,n)=>((e,t)=>e.map(e=>{const n=Ce(u(e,{useEntryPoint:t})),r=(e=>e.properties||null)(e)?.radiusMeters;return r?`circle(${n},${r})`:n}).join(":"))(t.includes("path")?((e,t,n)=>{let r;const a=e[0];r="path"===t[0]?Un(a)[0]:u(a,{useEntryPoint:n});const o=e[e.length-1];let i;if("path"===t[t.length-1]){const e=Un(o);i=e[e.length-1]}else i=u(o,{useEntryPoint:n});return[r,i]})(e,t,n):e,n),Wn=e=>({latitude:e[1],longitude:e[0]}),qn=(e,t,n)=>{const r=[],a=[];return e.forEach((o,i)=>{"path"===t[i]?((e,t,n,r,a)=>{const o=r.length;for(const i of Un(e))r.push(Wn(i));Array.isArray(e)||(e.properties.sections.leg.forEach((e,n)=>{(t>0||n>0)&&a.push({supportingPointIndex:o+e.startPointIndex,waypointSourceType:"USER_DEFINED"})}),t<n.length-1&&a.push({supportingPointIndex:o+e.geometry.coordinates.length-1,waypointSourceType:"USER_DEFINED"}))})(o,i,e,r,a):((e,t,n,r,a,o)=>{r.push(Wn(u(e,{useEntryPoint:o}))),t>0&&t<n.length-1&&a.push({supportingPointIndex:r.length-1,waypointSourceType:"USER_DEFINED"})})(o,i,e,r,a,n)}),{supportingPoints:r,...a.length&&{pointWaypoints:a}}},Nn=e=>({rectangles:e.map(e=>{const t=a(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");const[n,r,o,i]=t;return{southWestCorner:{latitude:r,longitude:n},northEastCorner:{latitude:i,longitude:o}}})}),Hn=e=>{const t=e.locations.map(l),n=e.useEntryPoints??"main-when-available",r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${jn(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${Bn(e.locations,t,n)}/json`),a=r.searchParams;pe(a,e),"language"in e||a.append("language","en-GB"),bn(a,e),de(a,"computeTravelTimeFor",e.computeAdditionalTravelTimeFor),((e,t)=>{if(t?.guidance){const n=t.guidance;e.append("instructionsType",n.type),e.append("guidanceVersion",String(n.version??2)),e.append("instructionPhonetics",n.phonetics??"IPA"),e.append("language",t.language??"en-US")}})(a,e),!x(e.maxAlternatives)&&a.append("maxAlternatives",String(e.maxAlternatives)),((e,t,n)=>{ue(e,"sectionType",(t??(n?y:g)).map(e=>"vehicleRestricted"===e?"travelMode":e))})(a,e.sectionTypes,!!e.guidance?.type);for(const i of e.extendedRouteRepresentations??["distance","travelTime"])a.append("extendedRouteRepresentation",i);const o=((e,t,n)=>{const r=t.includes("path"),a=!!jn(e),o=e.costModel?.avoidAreas;if(!r&&!a&&!o)return null;const i=(e.vehicle?.model)?.engine?.charging;return{...r&&qn(e.locations,t,n),...a&&i&&{chargingParameters:w(i,"maxChargeKWH")},...o?.length&&{avoidAreas:Nn(o)}}})(e,t,n);return o?{method:"POST",url:r,data:o}:{method:"GET",url:r}},Kn=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},$n=(e,t)=>{const n=e.chargingConnectionInfo,r=e.chargingParkLocation,a=[r.coordinate.longitude,r.coordinate.latitude],o=[r.street,r.houseNumber].filter(Boolean),i=o.length>0?o.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:a},properties:{...w(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:i,...r.street&&{streetName:r.street},...r.houseNumber&&{streetNumber:r.houseNumber},...r.city&&{municipality:r.city},...r.region&&{countrySubdivision:r.region},...r.postalCode&&{postalCode:r.postalCode},...r.country&&{country:r.country}},...n&&{chargingConnectionInfo:{plugType:n.chargingPlugType,currentInA:n.chargingCurrentInA,voltageInV:n.chargingVoltageInV,chargingPowerInkW:n.chargingPowerInkW,currentType:Kn(n.chargingCurrentType),chargingSpeed:ve(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:ve(e.chargingParkPowerInkW)}}}},Vn=(e,t)=>{const n=(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,...n&&e.batteryConsumptionInkWh&&{batteryConsumptionInPCT:100*e.batteryConsumptionInkWh/n},remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...n&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/n},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:$n(e.chargingInformationAtEndOfLeg,n)}}},_n=(e,t)=>e.reduce((e,n,r)=>{const a=0===r?0:e[r-1]?.endPointIndex;let o;return x(a)||(o=0===a?n.points?.length>0?n.points.length-1:0:a+n.points?.length),e.push({...!x(a)&&{startPointIndex:a},...o&&{endPointIndex:o},summary:Vn(n.summary,t),id:s()}),e},[]),Gn=e=>({id:s(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),zn=e=>({...Gn(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),Yn=e=>({...Gn(e),countryCodeISO3:e.countryCode}),Zn=e=>"other"===e.travelMode?Gn(e):null,Jn=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"]}},Qn=e=>({...Gn(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:Jn(e),magnitudeOfDelay:m[e.magnitudeOfDelay],tec:e.tec}),Xn=e=>({...Gn(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),er=e=>({...Gn(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),tr=e=>({...Gn(e),roadShieldReferences:e.roadShieldReferences}),nr=(e,t)=>(t[e]||(t[e]=[]),t[e]),rr=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Gn};case"COUNTRY":return{sectionType:"country",mappingFunction:Yn};case"FERRY":return{sectionType:"ferry",mappingFunction:Gn};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Gn};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Gn};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:Yn};case"TOLL":return{sectionType:"toll",mappingFunction:Gn};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:Qn};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:Zn};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Gn};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Gn};case"URBAN":return{sectionType:"urban",mappingFunction:Gn};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Gn};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Gn};case"LANES":return{sectionType:"lanes",mappingFunction:Xn};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:er};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:tr};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:zn}}},ar=(e,t)=>{const n={leg:_n(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const n of e){const e=rr(n),r=e?.mappingFunction(n);r&&nr(e.sectionType,t).push(r)}})(e.sections,n),n},or=1e-4,ir=(e,t)=>Math.abs(e[0]-t[0])<or&&Math.abs(e[1]-t[1])<or,sr=(e,t)=>{const n=[];let r=0;for(const a of e.instructions){const e=[a.maneuverPoint.longitude,a.maneuverPoint.latitude];for(let n=r;n<t.length;n++){if(ir(t[n],e)){r=n;break}if(n===t.length-1)break}n.push({...a,maneuverPoint:e,pathPointIndex:r,routePath:a.routePath.map(e=>({...e,point:[e.point.longitude,e.point.latitude]}))})}return{instructions:n}},cr=(e,t)=>{const n=e.routes.map((e,n)=>((e,t,n)=>{const r={type:"LineString",coordinates:e.legs.flatMap(e=>e.points?.map(e=>[e.longitude,e.latitude]))};return{type:"Feature",geometry:r,id:s(),bbox:a(r),properties:{index:t,summary:Vn(e.summary,n),sections:ar(e,n),...e.guidance&&{guidance:sr(e.guidance,r.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),r=a(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},pr={requestValidation:{schema:kn,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:Hn,sendRequest:$,parseResponse:cr,parseResponseError:wt,getAPIVersion:()=>2},ur={buildCalculateRouteRequest:Hn,parseCalculateRouteResponse:cr,calculateRouteTemplate:pr},lr=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],dr={speed:"SPEED",freeFlowSpeed:"FREE_FLOW_SPEED",congestionLevel:"CONGESTION_LEVEL",travelTime:"TRAVEL_TIME",networkLength:"NETWORK_LENGTH"},mr=e=>e instanceof Date?e.toISOString().slice(0,10):e,gr=Array.from({length:24},(e,t)=>t),yr=e=>lr.indexOf(e),hr=e=>{const n=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));pe(n.searchParams,e);const r=e=>{const t=/* @__PURE__ */new Date;return t.setDate(t.getDate()-e),t},a=Array.isArray(e.days)?{days:e.days.map(mr)}:{startDate:mr(e.startDate??r(3)),endDate:mr(e.endDate??r(2))};return{method:"POST",url:n,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...a,dataTypes:"all"===e.metrics?t.map(e=>dr[e]):e.metrics.map(e=>dr[e]),frcs:"all"===e.functionalRoadClasses?lr.map((e,t)=>t):e.functionalRoadClasses.map(yr),hours:"all"===e.hours?gr:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},fr=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}}),br=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},...fr(e)}),Tr=(e,t)=>{const n=new Date(e);return n.setDate(n.getDate()+t),n},Rr=(e,t)=>e.map((e,n)=>{const r=br(e);return void 0===r.date&&(r.date=Tr(t,Math.floor(n/24))),void 0===r.hour&&(r.hour=n%24),r}),vr=(e,t)=>e.map((e,n)=>{const r=br(e);return void 0===r.date&&(r.date=Tr(t,n)),r}),Sr=e=>({tileCentre:[e.lon,e.lat],...fr(e)}),Cr=e=>({startDate:new Date(e.startDate),endDate:new Date(e.endDate),labels:e.labels}),Pr=(e,t)=>{return{...e.yearly&&{yearly:e.yearly.map(br)},...e.monthly&&{monthly:e.monthly.map(br)},...e.weekly&&{weekly:e.weekly.map(br)},...e.daily&&{daily:vr(e.daily,t)},...e.hourly&&{hourly:Rr(e.hourly,t)},...e.average&&{average:(n=e.average,n.map((e,t)=>{const n=br(e);return void 0===n.day&&(n.day=Math.floor(t/24)+1),void 0===n.hour&&(n.hour=t%24),n}))}};var n},Ir={SPEED:"speed",FREE_FLOW_SPEED:"freeFlowSpeed",CONGESTION_LEVEL:"congestionLevel",TRAVEL_TIME:"travelTime",NETWORK_LENGTH:"networkLength"},xr=e=>{const t={};for(const[n,r]of Object.entries(e)){const e=Ir[n];e&&(t[e]=r.map(Cr))}return t},wr=(e,t)=>({name:e.name,timezone:e.timezone,level:e.level,baseData:fr(e.baseData),timedData:Pr(e.timedData,t),...e.tiledData&&{tiledData:{tiles:e.tiledData.tiles.map(Sr)}},...e.anomalies&&{anomalies:xr(e.anomalies)}}),Ar=e=>{const n=e.flatMap(e=>e.properties.tiledData?.tiles??[]),r={};for(const a of t){const e=n.map(e=>e[a]).filter(e=>null!=e);e.length>0&&(r[a]={min:Math.min(...e),max:Math.max(...e)})}return r},Lr=e=>{const t=new Date(e.properties.startDate),n=e.features.map(e=>((e,t)=>({type:e.type,id:e.id,geometry:e.geometry,properties:wr(e.properties,t),bbox:a(e.geometry)}))(e,t));return{type:"FeatureCollection",properties:{startDate:t,endDate:new Date(e.properties.endDate),metrics:e.properties.dataTypes.map(e=>Ir[e]).filter(e=>void 0!==e),heatmap:e.properties.heatmap,frcs:e.properties.frcs,ranges:Ar(n)},features:n}},Dr=I.union([I.date(),I.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]),Mr=I.union([I.object({type:I.literal("Polygon"),coordinates:I.array(I.array(I.array(I.number()))).min(1)}),I.object({type:I.literal("MultiPolygon"),coordinates:I.array(I.array(I.array(I.array(I.number())))).min(1)})]),Er=e=>e instanceof Date?e:new Date(e),Or=e=>{const t=/* @__PURE__ */new Date,n=Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate());return(e=>{const t=Er(e);return Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate())})(e)<=n-1728e5},Fr={requestValidation:{schema:k.extend({name:I.string().optional(),startDate:Dr.optional(),endDate:Dr.optional(),days:I.array(Dr).min(1).optional(),metrics:I.union([I.array(I.enum([...t])).min(1),I.literal("all")]),functionalRoadClasses:I.union([I.array(I.enum([...lr])).min(1),I.literal("all")]),hours:I.union([I.array(I.number().int().min(0).max(23)).min(1),I.literal("all")]),geometry:Mr}).refine(e=>{const t=void 0!==e.days,n=void 0!==e.startDate;if(t&&n)return!1;if(!t&&!n)return!1;if(void 0!==e.startDate){const t=((void 0!==e.endDate?Er(e.endDate):/* @__PURE__ */new Date).getTime()-Er(e.startDate).getTime())/864e5;return t>=1&&t<=31}return!0},{message:"Provide either startDate (with optional endDate, at least 1 day apart and within 31 days) or days — but not both"}).refine(e=>void 0!==e.days?e.days.every(Or):Or(e.endDate??/* @__PURE__ */new Date),{message:"Dates must be at least 2 days before today"})},buildRequest:hr,sendRequest:$,parseResponse:Lr},kr={buildTrafficAreaAnalyticsRequest:hr,parseTrafficAreaAnalyticsResponse:Lr,trafficAreaAnalyticsTemplate:Fr},jr=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidentDetails`)(e)),n=t.searchParams;if(pe(n,e),((e,t)=>{de(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}}}}}"),de(e,"t",t.trafficModelId),le(e,"categoryFilter",t.categoryFilter?.map(C)),le(e,"timeValidityFilter",t.timeValidityFilter)})(n,e),"bbox"in e&&e.bbox){const r=a(e.bbox);return r&&n.append("bbox",r.join(",")),{method:"GET",url:t}}const{ids:r}=e;return r.length>5?{method:"POST",url:t,data:{ids:r}}:(n.append("ids",r.join(",")),{method:"GET",url:t})},Ur=e=>({description:e.description,code:e.code,category:d(e.iconCategory)}),Br=e=>{const t=e.properties;return{type:"Feature",id:t.id,geometry:e.geometry,properties:{id:t.id,category:d(t.iconCategory),magnitudeOfDelay:m[t.magnitudeOfDelay]??"unknown",events:(t.events??[]).map(Ur),...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:(n=t.tmc,{countryCode:n.countryCode,tableNumber:n.tableNumber,tableVersion:n.tableVersion,direction:n.direction,points:(n.points??[]).map(e=>({location:e.location,...void 0!==e.offset&&{offset:e.offset}}))})}}};var n},Wr=e=>({type:"FeatureCollection",features:(e.incidents??[]).filter(e=>null!==e).map(Br)}),qr={requestValidation:{schema:k.extend({bbox:Q.optional(),ids:I.array(I.string()).optional(),trafficModelId:I.string().optional(),categoryFilter:I.array(I.enum([...S])).optional(),timeValidityFilter:I.array(I.enum(["present","future"])).optional()}).refine(e=>!(e.bbox&&e.ids),{message:"Provide either bbox or ids, not both"})},buildRequest:jr,sendRequest:$,parseResponse:Wr},Nr={alongRouteSearch:Ne,reverseGeocode:Dn,geocode:rt,geometryData:lt,geometrySearch:Tt,calculateRoute:ur,reachableRange:Pn,evChargingStationsAvailability:ze,trafficAreaAnalytics:kr,trafficIncidentDetails:{buildTrafficIncidentDetailsRequest:jr,parseTrafficIncidentDetailsResponse:Wr,trafficIncidentDetailsTemplate:qr},placeByID:xt,autocompleteSearch:He},Hr=async(e,t)=>B(e,{...Ge,...t},"EVChargingStationsAvailability"),Kr=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const n=await Hr({id:t}),r=e.properties.poi;return n?{...e,properties:{...e.properties,...r&&{poi:{...r,openingHours:n.openingHours}},chargingPark:{...e.properties.chargingPark,availability:n}}}:void 0}catch(n){return void console.error(n)}};async function $r(e,t){const n=[];for(const r of e.features){const e=await Kr(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:a(n)}}var Vr=e=>Boolean(e&&"availability"in e&&e.availability),_r=I.array(I.number()).min(2),Gr=I.object({type:I.literal("Polygon"),coordinates:I.array(I.array(I.array(I.number()))),bbox:I.array(I.number()).optional()}),zr=I.object({type:I.literal("MultiPolygon"),coordinates:I.array(I.array(I.array(I.array(I.number())))),bbox:I.array(I.number()).optional()}),Yr=I.object({type:I.literal("Circle"),coordinates:_r,radius:I.number().positive()}),Zr=I.object({type:I.literal("FeatureCollection"),features:I.array(I.object({type:I.literal("Feature"),geometry:I.union([Gr,zr]),properties:I.any().optional()}))}),Jr=I.union([Gr,zr,Yr,Zr]),Qr=I.tuple([I.number(),I.number(),I.number(),I.number()]),Xr=I.object({bbox:Qr}),ea=I.union([Qr,Xr]),ta=I.enum(["POI","PointAddress","Street"]),na=I.object({municipalities:I.array(I.string()).optional(),boundingBoxes:I.array(ea).optional(),geometries:I.array(Jr).optional(),placeTypes:I.array(ta).min(1).optional(),offset:I.number().int().min(0).max(1e4).optional(),limit:I.number().int().min(1).max(1e4).optional()}),ra=te.extend(Ye.extend(na.shape).shape),aa=e=>{const[t,n]=e.coordinates,r=e.radius/6371e3*(180/Math.PI),a=r/Math.cos(n*Math.PI/180),o=[];for(let i=0;i<64;i++){const e=2*Math.PI*i/64;o.push([t+a*Math.cos(e),n+r*Math.sin(e)])}return o.push(o[0]),{type:"Polygon",coordinates:[o]}},oa=e=>{switch(e.type){case"Polygon":case"MultiPolygon":return[e];case"Circle":return[aa(e)];case"FeatureCollection":return e.features.map(e=>e.geometry)}},ia=e=>(e=>{if(e.length<2)return e;const[t,n]=[e[0],e[e.length-1]];return t[0]===n[0]&&t[1]===n[1]?e:[...e,[...t]]})((e=>e.filter((t,n)=>0===n||t[0]!==e[n-1][0]||t[1]!==e[n-1][1]))(e)),sa=e=>"Polygon"===e.type?{...e,coordinates:e.coordinates.map(ia)}:{...e,coordinates:e.coordinates.map(e=>e.map(ia))},ca={POI:"POI",PointAddress:"Point Address",Street:"Street"},pa=e=>{const t=(e=>{const t=/* @__PURE__ */new Set;for(const n of e.categorySet??[])t.add(Number(n));return e.preferredCategoryId&&t.add(Number(e.preferredCategoryId)),[...t].filter(e=>Number.isFinite(e))})(e);t.sort((e,t)=>t-e);const n=/* @__PURE__ */new Set,r=[];for(const a of t){const e=R[a];e&&!n.has(e)&&(n.add(e),r.push(e))}return r},ua=e=>{const{id:t,position:n,address:r,score:a,distance_m:o,type:i,viewport:s}=e,c=ca[i??"POI"],p=(e=>{if(e?.name)return{name:e.name,categories:pa(e),localizedCategories:e.classifications?.map(e=>e.name)??[],...e.phone&&{phone:e.phone},...e.url&&{url:e.url},...e.brands?.length&&{brands:e.brands.map(e=>e.name)},...e.timeZone?.ianaId&&{timeZone:e.timeZone}}})(e.poi),u=(e=>{if(!e)return;const[[t,n],[r,a]]=e.coordinates;return[t,n,r,a]})(s);return{type:"Feature",id:t,geometry:v(n),...u&&{bbox:u},properties:{type:c,...r&&{address:r},...p&&{poi:p},...void 0!==a&&{score:a},...void 0!==o&&{distance:o}}}},la=(e,t)=>{const n=!!p(t.position),r=n?p(t.position):null;return{query:t.query??"",queryType:n?"NEARBY":"NON_NEAR",queryTime:0,numResults:e.hits.length,offset:t.offset??0,totalResults:e.total,fuzzyLevel:0,...r&&{geoBias:r}}},da={requestValidation:{schema:ra,refinements:[{check:e=>!!(e.position||e.boundingBox||e.boundingBoxes?.length||e.geometries?.length||e.municipalities?.length),message:"A geographic bias is required: provide one of position, boundingBox(es), geometries, or municipalities."}]},buildRequest:e=>{const t=new URL("/places",(e=>e.customServiceBaseURL??"https://search-places-poc.whitebush-bbe9c5f7.westeurope.azurecontainerapps.io")(e)),n=(e=>{const t=p(e.position);if(t)return{coordinates:t,radius_km:e.radiusMeters&&e.radiusMeters>0?e.radiusMeters/1e3:2}})(e),r=(e=>e.poiCategories?.length?e.poiCategories.map(e=>String(T[e])):void 0)(e),o=(e=>{const t=[...e.boundingBox?[e.boundingBox]:[],...e.boundingBoxes??[]].map(e=>a(e)).filter(e=>void 0!==e);return t.length?t:void 0})(e),i=(e=>{if(!e.geometries?.length)return;const t=e.geometries.flatMap(oa).map(sa);return t.length?t:void 0})(e),s=(e=>e.municipalities?.length?e.municipalities:void 0)(e);return{url:t,data:{...e.query&&{q:e.query},...e.countries?.[0]&&{country:e.countries[0]},...s&&{municipalities:s},...e.poiBrands?.[0]&&{brand:e.poiBrands[0]},...r&&{categories:r},...e.placeTypes?.length&&{types:e.placeTypes},...n&&{near:n},...o&&{bboxes:o},...i&&{geometries:i},...void 0!==e.offset&&{from:e.offset},...void 0!==e.limit&&{size:e.limit}}}},sendRequest:K,parseResponse:(e,t)=>{const n=e.hits.map(ua),r=o(a(n));return{type:"FeatureCollection",properties:la(e,t),features:n,...r&&{bbox:r}}}},ma=async(e,t)=>B(e,{...da,...t},"ExplorationSearch"),ga=async(e,t)=>B(e,{...nt,...t},"Geocode"),ya=async e=>{const t=await ga({query:e,limit:1});if(!t.features[0])throw new Error(`geocodeOne: no results found for "${e}"`);return t.features[0]};async function ha(e,t){const n=await B(e,{...ut,...t},"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?n:((e,t)=>{const n=e.features.reduce((e,t)=>{const n=t.properties.dataSources?.geometry?.id;return n&&(e[n]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),r=t.features.map(e=>e.id&&n[e.id]?{...e,properties:n[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:r}})(e.geometries,n)}var fa=async(e,t)=>B(e,{...It,...t},"PlaceById"),ba=/* @__PURE__ */new Map,Ta=/* @__PURE__ */new Map,Ra="en-GB",va=e=>e??Ra,Sa=e=>e.toLowerCase().replaceAll(/[\s\-_,]+/g,""),Ca=e=>{const t={};for(const n of e){const e=[n.name,...n.synonyms].map(Sa);for(const r of e)t[r]=n}return t},Pa=k.extend({filters:I.array(I.string()).optional()}),Ia=e=>{const t=R[e.id];return t?{code:t,name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>R[e]).filter(e=>!!e),synonyms:e.synonyms}:(console.error(`Received unknown POI category ID ${e.id} (${e.name}). This category will be skipped and unavailable for filtering.`),null)},xa={requestValidation:{schema:Pa},buildRequest:e=>{const t=e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/poiCategories.json`,n=new URL(t);return pe(n.searchParams,e),n},getAPIVersion:()=>1,sendRequest:H,parseResponse:e=>({poiCategories:e.poiCategories.map(Ia).filter(e=>null!==e)})},wa=(e,t)=>{const n=(e=>Ta.get(e??Ra)??{})(e),r=/* @__PURE__ */new Map;for(const a of t){const e=Sa(a);for(const[t,a]of Object.entries(n))t.includes(e)&&a&&r.set(a.code,a)}for(const a of r.values())for(const e of a.childCategoryCodes)r.delete(e);return[...r.values()]},Aa=async(e={})=>{const{language:t}=h(e);let n=(e=>ba.get(va(e)))(t);return n||(n=(await B(e,xa,"POICategories")).poiCategories,((e,t)=>{const n=va(e);ba.set(n,t),Ta.set(n,Ca(t))})(t,n)),e.filters?.length?{poiCategories:wa(t,e.filters)}:{poiCategories:n}},La=async(e={})=>{const{poiCategories:t}=await Aa(e);return t.map(e=>e.code)},Da=async(e,t)=>B(e,{...Cn,...t},"Reachable Range"),Ma=async(e,t,n)=>{const r=[];for(const a of e){t?.signal?.throwIfAborted();try{r.push(await Da(a,n))}catch(i){if(!(i instanceof M)||403===i.status||429===i.status)throw i}}const o=a(r);return{type:"FeatureCollection",...o&&{bbox:o},features:r}},Ea=async(e,t)=>B(e,{...Ln,...t},"ReverseGeocode"),Oa=async(e,t)=>B(e,{...pr,...t},"Routing"),Fa=I.object({minFuzzyLevel:I.number().min(1).max(4).optional(),maxFuzzyLevel:I.number().min(1).max(4).optional()}),ka=te.extend(Ye.extend(Fa.shape).shape),ja=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:Ie(e.details)}};break;case"NEARBY":t={...e,details:{position:Ie({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},Ua={requestValidation:{schema:ka},buildRequest:e=>{const t=new URL(`${(e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/places/search/${e.query??""}.json`)(e)}`);ge(t,e);const n=t.searchParams;de(n,"typeahead",e.typeahead),de(n,"ofs",e.offset),le(n,"countrySet",e.countries),de(n,"radius",e.radiusMeters);const r=e.boundingBox&&a(e.boundingBox);return r&&(n.append("topLeft",Je([r[3],r[0]])),n.append("btmRight",Je([r[1],r[2]]))),de(n,"minFuzzyLevel",e.minFuzzyLevel),de(n,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:H,parseResponse:e=>{const t=e.results.map(Le),n=o(a(t));return{type:"FeatureCollection",properties:{...De(e.summary),queryIntent:e.summary.queryIntent.map(ja)},features:t,...n&&{bbox:n}}}},Ba=async(e,t)=>"route"in e?Oe(e,t):"geometries"in e?bt(e,t):(async(e,t)=>B(e,{...Ua,...t},"FuzzySearch"))(e,t),Wa=async e=>{const t=await Ba({query:e,limit:1});if(!t.features[0])throw new Error(`searchOne: no results found for "${e}"`);return t.features[0]},qa=async(e,t)=>B(e,{...Fr,...t},"TrafficAreaAnalytics"),Na=async(e,t)=>B(e,{...qr,...t},"TrafficIncidentDetails");export{D as APIErrorCode,L as SDKError,M as SDKServiceError,Oe as alongRouteSearch,qe as autocompleteSearch,un as budgetTypes,O as buildResponseError,F as buildValidationError,Da as calculateReachableRange,Ma as calculateReachableRanges,Oa as calculateRoute,Nr as customizeService,Hr as evChargingStationsAvailability,ma as explorationSearch,ga as geocode,ya as geocodeOne,ha as geometryData,Aa as getPOICategories,La as getPOICategoryCodes,Kr as getPlaceWithEVAvailability,$r as getPlacesWithEVAvailability,Vr as hasChargingAvailability,E as parseDefaultResponseError,fa as placeById,Ea as reverseGeocode,$e as routeTypes,Ba as search,Wa as searchOne,qa as trafficAreaAnalytics,Na as trafficIncidentDetails};
2
2
  //# sourceMappingURL=services.es.js.map