@tomtom-org/maps-sdk 0.45.10 → 0.45.12
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/CHANGELOG.md +28 -0
- package/core/dist/core.es.js +1 -1
- package/core/dist/core.es.js.map +1 -1
- package/core/dist/index.d.ts +5 -34
- package/map/dist/index.d.ts +126 -140
- package/map/dist/map.es.js +1 -1
- package/map/dist/map.es.js.map +1 -1
- package/package.json +2 -2
- package/services/dist/index.d.ts +39 -2
- package/services/dist/services.es.js +1 -1
- package/services/dist/services.es.js.map +1 -1
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.45.
|
|
5
|
+
"version": "0.45.12",
|
|
6
6
|
"description": "TomTom Maps for JavaScript",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"tomtom",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"nodejs"
|
|
19
19
|
],
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@biomejs/biome": "^2.4.
|
|
21
|
+
"@biomejs/biome": "^2.4.5",
|
|
22
22
|
"@size-limit/file": "^11.2.0",
|
|
23
23
|
"@size-limit/preset-app": "^11.2.0",
|
|
24
24
|
"size-limit": "^11.2.0",
|
package/services/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { EntryPoint } from '@tomtom-org/maps-sdk/core';
|
|
|
15
15
|
import { EVChargingStationWithAvailabilityPlaceProps } from '@tomtom-org/maps-sdk/core';
|
|
16
16
|
import { Fuel } from '@tomtom-org/maps-sdk/core';
|
|
17
17
|
import { GeographyType } from '@tomtom-org/maps-sdk/core';
|
|
18
|
-
import {
|
|
18
|
+
import { GeoJSON as GeoJSON_2 } from 'geojson';
|
|
19
19
|
import { GetPositionEntryPointOption } from '@tomtom-org/maps-sdk/core';
|
|
20
20
|
import { GlobalConfig } from '@tomtom-org/maps-sdk/core';
|
|
21
21
|
import { Guidance } from '@tomtom-org/maps-sdk/core';
|
|
@@ -74,7 +74,7 @@ import { ZodObject } from 'zod';
|
|
|
74
74
|
export declare type AdditionalDataAPI = {
|
|
75
75
|
providerID: string;
|
|
76
76
|
error?: string;
|
|
77
|
-
geometryData:
|
|
77
|
+
geometryData: GeoJSON_2;
|
|
78
78
|
};
|
|
79
79
|
|
|
80
80
|
/**
|
|
@@ -635,6 +635,21 @@ export declare type AutocompleteSearchSegmentType = 'brand' | 'category' | 'plai
|
|
|
635
635
|
*/
|
|
636
636
|
declare type AutocompleteSearchTemplate = ServiceTemplate<AutocompleteSearchParams, URL, AutocompleteSearchResponseAPI, AutocompleteSearchResponse>;
|
|
637
637
|
|
|
638
|
+
/**
|
|
639
|
+
* @ignore
|
|
640
|
+
*/
|
|
641
|
+
declare type AvoidAreasAPI = {
|
|
642
|
+
rectangles: AvoidRectangleAPI[];
|
|
643
|
+
};
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* @ignore
|
|
647
|
+
*/
|
|
648
|
+
declare type AvoidRectangleAPI = {
|
|
649
|
+
southWestCorner: LatitudeLongitudePointAPI;
|
|
650
|
+
northEastCorner: LatitudeLongitudePointAPI;
|
|
651
|
+
};
|
|
652
|
+
|
|
638
653
|
/**
|
|
639
654
|
* @ignore
|
|
640
655
|
*/
|
|
@@ -1205,6 +1220,7 @@ declare type CalculateRoutePOSTDataAPI = {
|
|
|
1205
1220
|
supportingPoints?: LatitudeLongitudePointAPI[];
|
|
1206
1221
|
pointWaypoints?: PointWaypointAPI[];
|
|
1207
1222
|
chargingParameters?: ChargingParametersAPI;
|
|
1223
|
+
avoidAreas?: AvoidAreasAPI;
|
|
1208
1224
|
};
|
|
1209
1225
|
|
|
1210
1226
|
/**
|
|
@@ -3055,6 +3071,27 @@ export declare type CostModel = {
|
|
|
3055
3071
|
* @default None
|
|
3056
3072
|
*/
|
|
3057
3073
|
avoid?: Avoidable[];
|
|
3074
|
+
/**
|
|
3075
|
+
* Rectangular areas for the routing engine to bypass, each expressed as a {@link HasBBox}.
|
|
3076
|
+
*
|
|
3077
|
+
* Up to 10 rectangles are supported. Useful for avoiding construction zones,
|
|
3078
|
+
* restricted areas, or known congestion points.
|
|
3079
|
+
*
|
|
3080
|
+
* @remarks
|
|
3081
|
+
* Constraints per rectangle:
|
|
3082
|
+
* - Maximum size: ~160×160 km
|
|
3083
|
+
* - Cannot cross the 180th meridian
|
|
3084
|
+
* - Latitude must be between −80° and +80°
|
|
3085
|
+
*
|
|
3086
|
+
* @example
|
|
3087
|
+
* ```typescript
|
|
3088
|
+
* // Avoid an area using a BBox array [west, south, east, north]
|
|
3089
|
+
* avoidAreas: [
|
|
3090
|
+
* [2.265938, 48.81851, 2.41115, 48.90309]
|
|
3091
|
+
* ]
|
|
3092
|
+
* ```
|
|
3093
|
+
*/
|
|
3094
|
+
avoidAreas?: HasBBox[];
|
|
3058
3095
|
/**
|
|
3059
3096
|
* Decides how traffic is considered for computing routes.
|
|
3060
3097
|
*
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{mergeFromGlobal as e,generateTomTomHeaders as t,getPosition as n,poiCategoriesToID as r,toPointGeometry as i,views as o,bboxFromGeoJSON as a,bboxOnlyIfWithArea as s,generateId as c,bboxFromCoordsArray as p,plugTypes as d,currentTypes as l,avoidableTypes as u,getPositionStrict as m,getRoutePlanningLocationType as g,inputSectionTypesWithGuidance as h,inputSectionTypes as y,indexedMagnitudes as b,trafficIncidentToIconCategory as f,iconToTrafficIncidentCategory as S,trafficIncidentCategories as v}from"@tomtom-org/maps-sdk/core";import{z as T}from"zod";import{isNil as x,omit as C}from"lodash-es";var P=/* @__PURE__ */(e=>(e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e))(P||{});class R extends Error{constructor(e,t,n){super(e),this.service=t,this.issues=n,Error.captureStackTrace&&Error.captureStackTrace(this,R)}}const I={[P.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[P.FORBIDDEN]:"Request failed with status code 403"};class w extends R{constructor(e,t,n){super(e,t),this.status=n,this.status&&I[this.status]&&(this.message=I[this.status])}}const L=(e,t)=>{const{data:n,message:r,status:i}=e;return new w(n?.error||n?.errorText||r,t,i)},A=(e,t,n)=>{if(e.status){const r=e;return n?n(r,t):L(r,t)}return new R(e.message,t)},M=(e,t)=>new R(e.message,t,e.issues),k=T.object({apiKey:T.string().optional().describe("TomTom API key for authentication"),commonBaseURL:T.string().optional().describe("Common base URL for all services"),customServiceBaseURL:T.string().optional().describe("Custom base URL for specific service"),language:T.string().optional().describe('Language code for response text (e.g., "en-US", "nl-NL")')});class F extends Error{constructor(e){super(e.issues.map(e=>`${e.path.length>0?`${e.path.join(".")}: `:""}${e.message}`).join("; ")),this.issues=e.issues}}const E=async(n,r,i)=>{const o=r.getAPIVersion?.(n),a=e({...n,...o&&{apiVersion:o}});if(void 0===n.validateRequest||n.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 F(n.error)})(a,r.requestValidation)}catch(p){return Promise.reject(M(p,i))}const s=r.buildRequest(a),c=t(a);n.onAPIRequest?.(s);try{const e=await r.sendRequest(s,c);return n.onAPIResponse?.(s,e),r.parseResponse(await e.data,a)}catch(p){return n.onAPIResponse?.(s,p),Promise.reject(A(p,i,r.parseResponseError))}};class W extends Error{constructor(e,t,n){super(t??`HTTP Error ${e}`),this.name="FetchError",this.status=e,this.data=n,Error.captureStackTrace&&Error.captureStackTrace(this,W)}}const O=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)},j=async(e,t)=>O(await fetch(e,{headers:t})),q=async(e,t)=>O(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),B=async(e,t)=>{const n=e.method;if("GET"===n)return j(e.url,t);if("POST"===n)return q(e,t);throw new Error(`Unsupported HTTP method received: ${n}`)},U=T.array(T.array(T.number())).describe("Array of coordinate arrays representing a line string"),D=T.object({type:T.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]).describe("GeoJSON geometry type"),coordinates:T.union([T.array(T.number()),U,T.array(T.array(T.array(T.number()))),T.array(T.array(T.array(T.array(T.number()))))]).describe("Coordinate array(s) for the geometry"),radius:T.optional(T.number()).describe("Radius for Circle geometries"),radiusMeters:T.optional(T.number()).describe("Radius in meters for Circle geometries"),bbox:T.optional(T.array(T.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}).check(T.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),N=T.object({type:T.literal("Feature").describe("GeoJSON type identifier"),geometry:D.describe("GeoJSON geometry object"),id:T.optional(T.union([T.string(),T.number()])).describe("Optional feature identifier"),properties:T.any().describe("Feature properties"),bbox:T.optional(T.array(T.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),H=T.object({type:T.literal("FeatureCollection").describe("GeoJSON type identifier"),features:T.array(N).describe("Array of GeoJSON features"),id:T.optional(T.union([T.string(),T.number()])).describe("Optional collection identifier"),properties:T.any().describe("Collection properties"),bbox:T.optional(T.array(T.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),V=T.union([T.tuple([T.number().min(-180).max(180),T.number().min(-90).max(90)]),T.tuple([T.number().min(-180).max(180),T.number().min(-90).max(90),T.number()]),T.object({type:T.literal("Point"),coordinates:T.array(T.number())}),N]).describe("Geographic position as [longitude, latitude] tuple, Point geometry, or Feature"),K=T.union([T.array(T.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),T.array(T.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]).describe("GeoJSON bounding box array [minLng, minLat, maxLng, maxLat] or [minLng, minLat, minAlt, maxLng, maxLat, maxAlt]"),G=T.union([D,N,H]).describe("Any GeoJSON object (Geometry, Feature, or FeatureCollection)"),z=T.union([K,G,T.array(G)]).describe("Bounding box as array, GeoJSON object, or array of GeoJSON objects"),$=T.object({query:T.string().describe("Partial search query for autocomplete suggestions")}),_=T.object({position:V.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:T.number().max(100).optional().describe("Maximum number of autocomplete suggestions to return (1-100)"),radiusMeters:T.number().optional().describe("Search radius in meters around the specified position"),countries:T.array(T.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)"),resultType:T.array(T.string()).optional().describe("Types of results to include in suggestions")}),J=$.extend(_.shape),Y=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},Z=(e,t,n)=>{for(const r of n||[])e.append(t,r)},Q=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},X=(e,t,n)=>{!x(n)&&e.append(t,String(n))},ee=(e,t)=>{const r=n(t);r&&(e.append("lat",String(r[1])),e.append("lon",String(r[0])))},te="/maps/orbis/places",ne=(e,t)=>{const n=e.searchParams;Y(n,t),X(n,"limit",t.limit),ee(n,t.position),Q(n,"fuelSet",t.fuelTypes),Q(n,"idxSet",t.indexes),Q(n,"brandSet",t.poiBrands),t.poiCategories&&Q(n,"categorySet",t.poiCategories.map(e=>"number"!=typeof e?r[e]:e)),Q(n,"connectorSet",t.connectors),Q(n,"mapcodes",t.mapcodes),Q(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),X(n,"minPowerKW",t.minPowerKW),X(n,"maxPowerKW",t.maxPowerKW),X(n,"view",t.view),X(n,"openingHours",t.openingHours),X(n,"timeZone",t.timeZone),X(n,"relatedPois",t.relatedPois),Q(n,"entityTypeSet",t.geographyTypes)},re=e=>{const t=new URL(`${n=e,n.customServiceBaseURL||`${n.commonBaseURL}${te}/autocomplete/${n.query}.json`}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",Y(r,e),X(r,"limit",e.limit),ee(r,e.position),Q(r,"countrySet",e.countries),X(r,"radius",e.radiusMeters),Q(r,"resultSet",e.resultType),t},ie=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},oe=e=>`${e[1]},${e[0]}`,ae=e=>{let t,n;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=ie(e.southWest),n=ie(e.northEast)),[t[0],t[1],n[0],n[1]]},se=e=>[e.lon,e.lat],ce=e=>{const{position:t,...n}=e.context.geoBias||{};return{...e,context:{...e.context,geoBias:{...t&&{position:se(t)},radiusMeters:n.radius}}}},pe={requestValidation:{schema:J},buildRequest:re,sendRequest:j,parseResponse:ce},de=async(e,t)=>E(e,{...pe,...t},"Autocomplete"),le={autocompleteSearch:de,buildAutocompleteSearchRequest:re,parseAutocompleteSearchResponse:ce,autocompleteSearchTemplate:pe},ue=k.extend({id:T.string().describe("Unique identifier of the EV charging station")}),me=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}${te}/ev/id`)(e)),n=t.searchParams;return Y(n,e),n.append("id",e.id),t},ge=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",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},ye=(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=>ye(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}:{}})}},fe=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>ye(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},Se=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)be(e.connectors,e.status,t);return t},ve=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)}},Te=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,xe=e=>{const t=e.timeRanges.map(e=>({start:ve(e.startTime),end:ve(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:Te(t)}},Ce=e=>{const{position:t,entryPoints:n,poi:r,id:o,dist:a,boundingBox:s,chargingPark:c,...p}=e,d=c?.connectors?.map(e=>({...C(e,"connectorType"),type:e.connectorType,chargingSpeed:ge(e.ratedPowerKW)}));return{type:"Feature",geometry:i(se(t)),...s&&{bbox:ae(s)},id:o,properties:{...C(p,"viewport"),...a&&{distance:a},...n?.length&&{entryPoints:n.map(e=>({...e,position:se(e.position)}))},...d?.length&&{chargingPark:{...c,connectors:fe(d)}},...r&&{poi:{...C(r,"categorySet","openingHours"),brands:r?.brands?.map(e=>e.name)??[],categoryIds:r?.categorySet?.map(e=>e.id)??[],...r?.openingHours&&{openingHours:xe(r?.openingHours)}}}}}},Pe=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:se(t)},...n}},Re=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:ge(e.ratedPowerKW)}))}))}))),chargingPointAvailability:he(t.chargingStations),connectorAvailabilities:Se(t.chargingStations),...t.openingHours&&{openingHours:xe(t.openingHours)}}:void 0;var n},Ie={requestValidation:{schema:ue},buildRequest:me,sendRequest:j,parseResponse:Re,parseResponseError:(e,t)=>{const n=e.data?.detailedError?.message??e.message;return new w(n,t,e.status)}},we={buildEVChargingStationsAvailabilityRequest:me,parseEVChargingStationsAvailabilityResponse:Re,evChargingStationsAvailabilityTemplate:Ie},Le=T.object({typeahead:T.boolean().optional().describe("Enable predictive/autocomplete mode for partial input queries"),offset:T.number().max(1900).optional().describe("Starting position within result set for pagination (zero-based index)"),radiusMeters:T.number().optional().describe("Search radius in meters around the specified position"),boundingBox:z.optional().describe("Bounding box to constrain search results to a rectangular area"),countries:T.array(T.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)")}),Ae=T.object({query:T.string().describe("Search query for places, addresses, or locations")}),Me=T.object({position:V.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:T.number().max(100).optional().describe("Maximum number of results to return (1-100)"),extendedPostalCodesFor:T.array(T.string()).optional().describe("Indexes for which to include extended postal codes in results"),mapcodes:T.array(T.string()).optional().describe("Request mapcode representations for locations (Local, International, Alternative)"),view:T.enum(o).optional().describe("Geopolitical view for disputed territories"),geographyTypes:T.array(T.string()).optional().describe("Filter results to specific geography types (Country, Municipality, etc.)")}),ke=Ae.extend(Me.shape),Fe=k.extend(ke.shape).extend(Le.shape),Ee=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",We=(e,t)=>{const n=e.length;if(n<=t)return e;const r=[];let i;const o=Math.ceil(n/t);for(i=0;i<n;i+=o)r.push(e[i]);return i>=n-o&&(r.length<t?r.push(e[n-1]):r[r.length-1]=e[n-1]),r},Oe=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/geocode`)(e)}/${e.query}.json`),n=t.searchParams;Y(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)),ee(n,e.position),e.countries&&n.append("countrySet",Ee(e.countries)),!x(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const r=e.boundingBox&&a(e.boundingBox);return r&&(n.append("topLeft",Ee([r[3],r[0]])),n.append("btmRight",Ee([r[1],r[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",Ee(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",Ee(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",Ee(e.geographyTypes)),t},je=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:o,addressRanges:a,entityType:s,id:c,...p}=e;return{type:"Feature",geometry:i(se(t)),...n&&{bbox:ae(n)},id:c,properties:{...C(p,"viewport"),...r&&{distance:r},...s&&{geographyType:s.split(",")},...o&&{entryPoints:o.map(e=>({...e,position:se(e.position)}))},...a&&{addressRanges:{...a,from:se(a.from),to:se(a.to)}}}}},qe=e=>{const t=e.results.map(je),n=s(a(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}},Be={requestValidation:{schema:Fe},buildRequest:Oe,sendRequest:j,parseResponse:qe},Ue={buildGeocodingRequest:Oe,parseGeocodingResponse:qe,geocodingTemplate:Be},De=T.object({geometries:T.union([H,T.array(T.union([T.string(),N])).min(1).max(20)]).describe("GeoJSON FeatureCollection or array of geometry IDs/Features (max 20)")}),Ne=T.object({zoom:T.number().min(0).max(22).optional().describe("Zoom level for geometry data simplification (0-22)")}),He=De.extend(Ne.shape),Ve=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),Ke=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/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:Ve(t):Ve(t.features),e.append("geometries",Ee(n))})(n,e.geometries),X(n,"geometriesZoom",e.zoom),t},Ge=e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??c(),bbox:a(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:a(t),features:t}},ze={requestValidation:{schema:He},buildRequest:Ke,sendRequest:j,parseResponse:Ge},$e={buildGeometryDataRequest:Ke,parseGeometryDataResponse:Ge,geometryDataTemplate:ze},_e=T.object(r),Je=T.object({indexes:T.array(T.string()).optional().describe("Search indexes to query (Geo, PAD, Addr, Str, XStr, POI)"),poiCategories:T.array(T.union([T.number(),T.keyof(_e)])).optional().describe("Filter results to specific POI categories"),poiBrands:T.array(T.string()).optional().describe("Filter results to specific POI brands"),connectors:T.array(T.string()).optional().describe("Filter EV charging stations by connector types"),fuelTypes:T.array(T.string()).optional().describe("Filter fuel stations by available fuel types"),openingHours:T.string().optional().describe("Request opening hours information for POIs"),timeZone:T.string().optional().describe("Request timezone information for POI locations (iana)"),relatedPois:T.string().optional().describe("Related POI inclusion mode (off, child, parent, all)"),minPowerKW:T.number().optional().describe("Minimum charging power in kilowatts for EV charging stations"),maxPowerKW:T.number().optional().describe("Maximum charging power in kilowatts for EV charging stations"),minFuzzyLevel:T.number().optional().describe("Minimum fuzzy matching level (1-4)"),mixFuzzyLevel:T.number().optional().describe("Maximum fuzzy matching level (1-4)")}),Ye=ke.extend(Je.shape),Ze=T.object({geometries:T.array(T.union([H,D])).describe("Array of GeoJSON geometries or FeatureCollections to search within")}),Qe=Ye.extend(Ze.shape),Xe=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:oe(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:We(e.coordinates[0],50).map(e=>oe(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const n=p(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=>Xe({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>Xe({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>Xe(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},et=e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${te}/geometrySearch/${n.query}.json`}`);var n;return ne(t,e),{url:t,data:{geometryList:e.geometries.flatMap(Xe)}}},tt=e=>{const t=e.results.map(Ce),n=s(a(t));return{type:"FeatureCollection",properties:{...Pe(e.summary)},features:t,...n&&{bbox:n}}},nt={requestValidation:{schema:Qe},buildRequest:et,sendRequest:q,parseResponse:tt},rt=async(e,t)=>E(e,{...nt,...t},"GeometrySearch"),it={geometrySearch:rt,buildGeometrySearchRequest:et,parseGeometrySearchResponse:tt,geometrySearchTemplate:nt},ot=T.object({entityId:T.string().describe("Unique identifier of the place/entity to retrieve")}),at=T.object({mapcodes:T.array(T.string()).optional().describe("Request mapcode representations for location"),view:T.enum(o).optional().describe("Geopolitical view for disputed territories"),openingHours:T.string().optional().describe("Request opening hours information for the place"),timeZone:T.string().optional().describe("Request timezone information for the place location"),relatedPois:T.string().optional().describe("Related POI inclusion mode (off, child, parent, all)")}),st=ot.extend(at.shape),ct=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/place.json`)(e)}`),n=t.searchParams;return Y(n,e),X(n,"entityId",e.entityId),Q(n,"mapcodes",e.mapcodes),X(n,"view",e.view),X(n,"openingHours",e.openingHours),X(n,"timeZone",e.timeZone),X(n,"relatedPois",e.relatedPois),t},pt=e=>e.results?.length?Ce(e.results[0]):void 0,dt={requestValidation:{schema:st},buildRequest:ct,sendRequest:j,parseResponse:pt},lt={buildPlaceByIdRequest:ct,parsePlaceByIdResponse:pt,placeByIdTemplate:dt},ut=(e,t)=>{const{data:n,message:r,status:i}=e;return new w(n?.error?.description??n?.detailedError?.message??r,t,i)},mt=T.number().positive(),gt=T.number().min(0),ht=T.number().min(0).max(100),yt=mt.optional(),bt=gt.optional(),ft=T.number().min(0).max(1).optional(),St=T.object({speedKMH:T.number().describe("Speed in kilometers per hour"),consumptionUnitsPer100KM:T.number().describe("Consumption rate per 100 kilometers")}),vt={efficiency:T.object({acceleration:ft.describe("Acceleration efficiency factor (0-1)"),deceleration:ft.describe("Deceleration efficiency factor (0-1)"),uphill:ft.describe("Uphill efficiency factor (0-1)"),downhill:ft.describe("Downhill efficiency factor (0-1)")}).optional()},Tt=T.array(St).min(1).max(25),xt=T.object({...vt,speedsToConsumptionsLiters:Tt.describe("Array of speed-to-fuel-consumption mappings in liters per 100km"),auxiliaryPowerInLitersPerHour:bt.describe("Auxiliary power consumption in liters per hour"),fuelEnergyDensityInMJoulesPerLiter:T.number().min(1).optional().describe("Fuel energy density in megajoules per liter")}),Ct=T.object({...vt,speedsToConsumptionsKWH:Tt.describe("Array of speed-to-energy-consumption mappings in kWh per 100km"),auxiliaryPowerInkW:bt.describe("Auxiliary power consumption in kilowatts"),consumptionInKWHPerKMAltitudeGain:T.number().max(500).optional().describe("Energy consumption per kilometer of altitude gain in kWh"),recuperationInKWHPerKMAltitudeLoss:bt.describe("Energy recuperation per kilometer of altitude loss in kWh")}),Pt=T.object({currentType:T.enum(l).describe("Type of electrical current (AC or DC)"),plugTypes:T.array(T.enum(d)).min(1).describe("Compatible plug/connector types"),efficiency:ft.describe("Charging efficiency factor (0-1)"),baseLoadInkW:bt.describe("Base load in kilowatts"),maxPowerInkW:bt.describe("Maximum charging power in kilowatts"),maxVoltageInV:bt.describe("Maximum voltage in volts"),maxCurrentInA:bt.describe("Maximum current in amperes"),voltageRange:T.object({minVoltageInV:bt.describe("Minimum voltage in volts"),maxVoltageInV:T.number().optional().describe("Maximum voltage in volts")}).optional().describe("Acceptable voltage range")}),Rt=T.object({stateOfChargeInkWh:gt.describe("State of charge in kilowatt-hours"),maxPowerInkW:mt.describe("Maximum charging power at this state of charge in kilowatts")}),It=T.object({maxChargeKWH:mt.describe("Maximum battery capacity in kilowatt-hours"),batteryCurve:T.array(Rt).max(20).optional().describe("Battery charging curve with up to 20 data points"),chargingConnectors:T.array(Pt).min(1).optional().describe("Available charging connectors on the vehicle"),chargingTimeOffsetInSec:bt.describe("Time offset for charging start in seconds")}),wt=T.object({consumption:xt.describe("Fuel consumption model for combustion engine")}),Lt=T.object({consumption:Ct.describe("Energy consumption model for electric engine"),charging:It.optional().describe("Battery and charging specifications")}),At=T.object({lengthMeters:yt.describe("Vehicle length in meters"),widthMeters:yt.describe("Vehicle width in meters"),heightMeters:yt.describe("Vehicle height in meters"),weightKG:yt.describe("Vehicle weight in kilograms"),axleWeightKG:yt.describe("Vehicle axle weight in kilograms")}).optional(),Mt=T.object({variantId:T.string().describe("Predefined vehicle variant identifier")}),kt=T.object({dimensions:At.describe("Physical dimensions and weight of the vehicle"),engine:T.union([wt,Lt]).optional().describe("Engine type and consumption characteristics")}),Ft=T.union([Mt,kt]).optional(),Et=T.object({heading:T.number().min(0).max(360).optional().describe("Current vehicle heading in degrees (0-360)")}),Wt=Et.extend({currentFuelInLiters:gt.describe("Current fuel level in liters")}),Ot=Et.extend({currentChargePCT:ht.describe("Current battery charge as percentage (0-100)")}),jt=Et.extend({currentChargeInkWh:gt.describe("Current battery charge in kilowatt-hours")}),qt=T.union([Ot,jt]),Bt=T.object({minChargeAtDestinationPCT:ht.describe("Minimum battery charge percentage required at destination (0-100)"),minChargeAtChargingStopsPCT:T.number().min(0).max(50).describe("Minimum battery charge percentage at charging stops (0-50)")}),Ut=T.object({minChargeAtDestinationInkWh:gt.describe("Minimum battery charge in kWh required at destination"),minChargeAtChargingStopsInkWh:gt.describe("Minimum battery charge in kWh at charging stops")}),Dt=T.union([Bt,Ut]),Nt=T.object({chargingPreferences:Dt.optional().describe("Preferences for charging stops along the route")}),Ht={model:Ft,restrictions:T.object({loadTypes:T.array(T.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional().describe("Types of hazardous or restricted loads being carried"),maxSpeedKMH:T.number().min(0).max(250).optional().describe("Maximum vehicle speed in kilometers per hour (0-250)"),adrCode:T.enum(["B","C","D","E"]).optional().describe("ADR tunnel restriction code for hazardous materials"),commercial:T.boolean().optional().describe("Whether the vehicle is used for commercial purposes")}).optional()},Vt=T.object({...Ht,engineType:T.undefined(),state:Et.optional().describe("Current state of the vehicle"),preferences:T.object({}).optional().describe("Vehicle preferences")}),Kt=T.object({...Ht,engineType:T.literal("combustion").describe("Combustion engine type"),state:Wt.optional().describe("Current state of the combustion vehicle including fuel level"),preferences:T.object({}).optional().describe("Combustion vehicle preferences")}),Gt=T.object({...Ht,engineType:T.literal("electric").describe("Electric engine type"),state:qt.optional().describe("Current state of the electric vehicle including battery charge"),preferences:Nt.optional().describe("Electric vehicle preferences including charging requirements")}),zt=T.union([T.discriminatedUnion("engineType",[Kt,Gt]),Vt]),$t=T.object({costModel:T.object({avoid:T.array(T.enum(u)).optional().describe("Road types and features to avoid when calculating route"),traffic:T.enum(["live","historical"]).optional().describe("Traffic consideration mode (live: real-time + historical, historical: typical patterns only)"),routeType:T.enum(["fast","short","efficient","thrilling"]).optional().describe("Route optimization strategy (fast, short, efficient, thrilling)"),thrillingParams:T.object({hilliness:T.enum(["low","normal","high"]).optional().describe("Level of hilliness for thrilling routes"),windingness:T.enum(["low","normal","high"]).optional().describe("Level of windingness for thrilling routes")}).optional().describe("Optional parameters for thrilling route type")}).optional().describe("Cost model criteria for route optimization"),travelMode:T.string().optional().describe("Travel mode (car, truck, pedestrian, bicycle)"),vehicle:zt.optional().describe("Vehicle-specific parameters including dimensions, engine type, and consumption model"),when:T.object({option:T.enum(["departAt","arriveBy"]).describe("Whether to specify a departure or arrival time"),date:T.date().describe("The date and time to depart or arrive")}).optional().describe("Departure or arrival time specification for route planning")}),_t=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],Jt=T.object({origin:V.describe("Starting position [longitude, latitude] for reachable range calculation"),budget:T.object({type:T.enum(_t).describe("Budget type (time, distance, or energy/fuel)"),value:T.number().min(0).describe("Budget value (depends on type: seconds, meters, liters, or kWh)")}).describe("Travel budget constraints for reachable range")}),Yt=T.object({maxFerryLengthMeters:T.number().min(0).optional().describe("Maximum ferry distance in meters to include in range"),smoothing:T.enum(["none","weak","strong"]).optional().describe("Post-processing smoothing level for the polygon boundary")}),Zt=$t.extend(Jt.extend(Yt.shape).shape),Qt=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),Xt=(e,t,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",Qt(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",Qt(n.speedsToConsumptionsLiters)),!x(n.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(n.auxiliaryPowerInLitersPerHour)),!x(n.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(n.fuelEnergyDensityInMJoulesPerLiter))})(e,n)},en=(e,t)=>{t.model&&("variantId"in t.model?e.append("vehicleModelId",t.model.variantId):(((e,t)=>{t&&(t.lengthMeters&&e.append("vehicleLength",String(t.lengthMeters)),t.heightMeters&&e.append("vehicleHeight",String(t.heightMeters)),t.widthMeters&&e.append("vehicleWidth",String(t.widthMeters)),t.weightKG&&e.append("vehicleWeight",String(t.weightKG)),t.axleWeightKG&&e.append("vehicleAxleWeight",String(t.axleWeightKG)))})(e,t.model.dimensions),t.model.engine&&Xt(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},tn=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),en(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,i=n;if(r.currentChargeInkWh)e.append("currentChargeInkWh",String(r.currentChargeInkWh));else if(i.currentChargePCT&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine,r=n.charging?.maxChargeKWH;r&&e.append("currentChargeInkWh",String(r*i.currentChargePCT/100))}}})(e,t),((e,t)=>{if(t.preferences&&"engineType"in t&&"electric"===t.engineType){const n=t.preferences;if(n.chargingPreferences){const r=n.chargingPreferences,i=r,o=r;if(i.minChargeAtChargingStopsInkWh||i.minChargeAtDestinationInkWh)e.append("minChargeAtDestinationInkWh",String(i.minChargeAtDestinationInkWh)),e.append("minChargeAtChargingStopsInkWh",String(i.minChargeAtChargingStopsInkWh));else if((o.minChargeAtChargingStopsPCT||o.minChargeAtDestinationPCT)&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine,r=n.charging?.maxChargeKWH;r&&(e.append("minChargeAtDestinationInkWh",String(r*o.minChargeAtDestinationPCT/100)),e.append("minChargeAtChargingStopsInkWh",String(r*o.minChargeAtChargingStopsPCT/100)))}}}})(e,t),((e,t)=>{const n=t.restrictions;n&&(Z(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))},nn=(e,t)=>{const n=t.costModel;Z(e,"avoid",n?.avoid),X(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),X(e,"routeType",n?.routeType),X(e,"travelMode",t.travelMode),tn(e,t.vehicle)},rn=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},on=(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=rn(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=rn(e);if(null!=t)return t*n.currentChargePCT/100}})(t),i=rn(t);if(null!=i&&null!=r){const t=i*n.value/100;e.append("energyBudgetInkWh",Math.max(0,r-t).toString())}break}default:e.append(n.type,n.value.toString())}},an=e=>{const t=m(e.origin);return{origin:{type:"Point",coordinates:[t[0],t[1]]}}},sn=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`)(e)),n=t.searchParams;return Y(n,e),n.delete("language"),nn(n,e),on(n,e),X(n,"maxFerryLengthInMeters",e.maxFerryLengthMeters),X(n,"smoothing",e.smoothing),{method:"POST",url:t,data:an(e)}},cn=(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}},pn={requestValidation:{schema:Zt},buildRequest:sn,sendRequest:B,parseResponse:cn,parseResponseError:ut,getAPIVersion:()=>3},dn={buildReachableRangeRequest:sn,parseReachableRangeResponse:cn,reachableRangeTemplate:pn},ln=e=>{const t=m(e.position),n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),r=n.searchParams;return Y(r,e),e.allowFreeformNewline&&r.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&r.append("entityType",Ee(e.geographyType)),!x(e.heading)&&r.append("heading",String(e.heading)),e.mapcodes&&r.append("mapcodes",Ee(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},un=(e,t)=>{const n=e.addresses[0],{boundingBox:r,sideOfStreet:o,offsetPosition:a,...s}=n?.address||{};return{type:"Feature",geometry:i(m(t.position)),...r&&{bbox:ae(r)},id:c(),...n&&{properties:{type:n?.entityType?"Geography":s.streetNumber?"Point Address":"Street",address:s,...n.dataSources&&{dataSources:n.dataSources},...n.mapcodes&&{mapcodes:n.mapcodes},...o&&{sideOfStreet:o},...a&&{offsetPosition:ie(a)},originalPosition:ie(n.position)}}}},mn=T.object({position:V.describe("Geographic position [longitude, latitude] to reverse geocode")}),gn=T.object({allowFreeformNewline:T.boolean().optional().describe("Allow newline characters in freeform address"),geographyType:T.array(T.string()).optional().describe("Filter results to specific geography types"),heading:T.number().min(-360).max(360).optional().describe("Vehicle heading in degrees (-360 to 360) for directional results"),mapcodes:T.array(T.string()).optional().describe("Request mapcode representations for location"),number:T.string().optional().describe("Street number for more precise address results"),radiusMeters:T.number().optional().describe("Search radius in meters for reverse geocoding"),returnMatchType:T.boolean().optional().describe("Include match type information in response"),returnRoadUse:T.boolean().optional().describe("Include road use information in response"),returnSpeedLimit:T.boolean().optional().describe("Include speed limit information in response"),roadUses:T.array(T.string()).optional().describe("Filter results to specific road use types"),view:T.enum(o).optional().describe("Geopolitical view for disputed territories")}),hn={requestValidation:{schema:mn.extend(gn.shape)},buildRequest:ln,sendRequest:j,parseResponse:un},yn={buildRevGeoRequest:ln,parseRevGeoResponse:un,reverseGeocodingTemplate:hn},bn=T.union([V,D]).describe("Waypoint as position or geometry"),fn=T.union([U,N]).describe("Path as line string coordinates or feature"),Sn=T.object({locations:T.array(T.union([bn,fn])).min(1).describe("Array of route locations (waypoints or paths) - minimum 2 waypoints or 1 path required")}),vn=T.object({computeAdditionalTravelTimeFor:T.enum(["none","all"]).optional().describe("Calculate additional travel time estimates for different traffic scenarios (none or all)"),vehicleHeading:T.number().min(0).max(359.5).optional().describe("Vehicle heading in degrees (0-359.5) at departure"),maxAlternatives:T.number().min(0).max(5).optional().describe("Maximum number of alternative routes to calculate (0-5)"),sectionTypes:T.array(T.enum(h)).optional().describe("Types of route sections to include in response (toll, ferry, traffic, etc.)")}),Tn=$t.extend(Sn.extend(vn.shape).shape),xn=e=>e.vehicle?.preferences?.chargingPreferences,Cn=e=>Array.isArray(e)?e:e.geometry.coordinates,Pn=(e,t,n)=>((e,t)=>e.map(e=>{const n=oe(m(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 i=e[0];r="path"===t[0]?Cn(i)[0]:m(i,{useEntryPoint:n});const o=e[e.length-1];let a;if("path"===t[t.length-1]){const e=Cn(o);a=e[e.length-1]}else a=m(o,{useEntryPoint:n});return[r,a]})(e,t,n):e,n),Rn=e=>({latitude:e[1],longitude:e[0]}),In=(e,t,n)=>{const r=[],i=[];return e.forEach((o,a)=>{"path"===t[a]?((e,t,n,r,i)=>{const o=r.length;for(const a of Cn(e))r.push(Rn(a));Array.isArray(e)||(e.properties.sections.leg.forEach((e,n)=>{(t>0||n>0)&&i.push({supportingPointIndex:o+e.startPointIndex,waypointSourceType:"USER_DEFINED"})}),t<n.length-1&&i.push({supportingPointIndex:o+e.geometry.coordinates.length-1,waypointSourceType:"USER_DEFINED"}))})(o,a,e,r,i):((e,t,n,r,i,o)=>{r.push(Rn(m(e,{useEntryPoint:o}))),t>0&&t<n.length-1&&i.push({supportingPointIndex:r.length-1,waypointSourceType:"USER_DEFINED"})})(o,a,e,r,i,n)}),{supportingPoints:r,...i.length&&{pointWaypoints:i}}},wn=e=>{const t=e.locations.map(g),n=e.useEntryPoints??"main-when-available",r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${xn(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${Pn(e.locations,t,n)}/json`),i=r.searchParams;Y(i,e),"language"in e||i.append("language","en-GB"),nn(i,e),X(i,"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")}})(i,e),!x(e.maxAlternatives)&&i.append("maxAlternatives",String(e.maxAlternatives)),((e,t,n)=>{const r=(t??(n?h:y)).map(e=>"vehicleRestricted"===e?"travelMode":e);Z(e,"sectionType",r)})(i,e.sectionTypes,!!e.guidance?.type);for(const a of e.extendedRouteRepresentations??["distance","travelTime"])i.append("extendedRouteRepresentation",a);const o=((e,t,n)=>{const r=t.includes("path"),i=!!xn(e);if(!r&&!i)return null;const o=e.vehicle?.model,a=o?.engine?.charging;return{...r&&In(e.locations,t,n),...i&&a&&{chargingParameters:C(a,"maxChargeKWH")}}})(e,t,n);return o?{method:"POST",url:r,data:o}:{method:"GET",url:r}},Ln=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},An=(e,t)=>{const n=e.chargingConnectionInfo,r=e.chargingParkLocation,i=[r.coordinate.longitude,r.coordinate.latitude],o=[r.street,r.houseNumber].filter(Boolean),a=o.length>0?o.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:i},properties:{...C(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:a,...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:Ln(n.chargingCurrentType),chargingSpeed:ge(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:ge(e.chargingParkPowerInkW)}}}},Mn=(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:An(e.chargingInformationAtEndOfLeg,n)}}},kn=(e,t)=>e.reduce((e,n,r)=>{const i=0===r?0:e[r-1]?.endPointIndex;let o;return x(i)||(o=0===i?n.points?.length>0?n.points.length-1:0:i+n.points?.length),e.push({...!x(i)&&{startPointIndex:i},...o&&{endPointIndex:o},summary:Mn(n.summary,t),id:c()}),e},[]),Fn=e=>({id:c(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),En=e=>({...Fn(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),Wn=e=>({...Fn(e),countryCodeISO3:e.countryCode}),On=e=>"other"===e.travelMode?Fn(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=>({...Fn(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:jn(e),magnitudeOfDelay:b[e.magnitudeOfDelay],tec:e.tec}),Bn=e=>({...Fn(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),Un=e=>({...Fn(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),Dn=e=>({...Fn(e),roadShieldReferences:e.roadShieldReferences}),Nn=(e,t)=>(t[e]||(t[e]=[]),t[e]),Hn=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Fn};case"COUNTRY":return{sectionType:"country",mappingFunction:Wn};case"FERRY":return{sectionType:"ferry",mappingFunction:Fn};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Fn};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Fn};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:Wn};case"TOLL":return{sectionType:"toll",mappingFunction:Fn};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:qn};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:On};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Fn};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Fn};case"URBAN":return{sectionType:"urban",mappingFunction:Fn};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Fn};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Fn};case"LANES":return{sectionType:"lanes",mappingFunction:Bn};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:Un};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:Dn};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:En}}},Vn=(e,t)=>{const n={leg:kn(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const n of e){const e=Hn(n),r=e?.mappingFunction(n);r&&Nn(e.sectionType,t).push(r)}})(e.sections,n),n},Kn=1e-4,Gn=(e,t)=>Math.abs(e[0]-t[0])<Kn&&Math.abs(e[1]-t[1])<Kn,zn=(e,t)=>{const n=[];let r=0;for(const i of e.instructions){const e=[i.maneuverPoint.longitude,i.maneuverPoint.latitude];for(let n=r;n<t.length;n++){if(Gn(t[n],e)){r=n;break}if(n===t.length-1)break}n.push({...i,maneuverPoint:e,pathPointIndex:r,routePath:i.routePath.map(e=>({...e,point:[e.point.longitude,e.point.latitude]}))})}return{instructions:n}},$n=(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:c(),bbox:a(r),properties:{index:t,summary:Mn(e.summary,n),sections:Vn(e,n),...e.guidance&&{guidance:zn(e.guidance,r.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),r=a(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},_n={requestValidation:{schema:Tn,refinements:[{check:e=>!!e.locations.map(g).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:B,parseResponse:$n,parseResponseError:ut,getAPIVersion:()=>2},Jn={buildCalculateRouteRequest:wn,parseCalculateRouteResponse:$n,calculateRouteTemplate:_n},Yn=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidentDetails`)(e)),n=t.searchParams;if(Y(n,e),((e,t)=>{X(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}}}}}"),X(e,"t",t.trafficModelId),Q(e,"categoryFilter",t.categoryFilter?.map(f)),Q(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})},Zn=e=>({description:e.description,code:e.code,category:S(e.iconCategory)}),Qn=e=>{const t=e.properties;return{type:"Feature",geometry:e.geometry,properties:{id:t.id,category:S(t.iconCategory),magnitudeOfDelay:b[t.magnitudeOfDelay]??"unknown",events:(t.events??[]).map(Zn),...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},Xn=e=>({type:"FeatureCollection",features:(e.incidents??[]).filter(e=>null!==e).map(Qn)}),er={requestValidation:{schema:k.extend({bbox:z.optional(),ids:T.array(T.string()).optional().describe("List of incident IDs"),trafficModelId:T.string().optional().describe("Traffic Model ID for temporal consistency"),categoryFilter:T.array(T.enum([...v])).optional().describe("Incident category filter"),timeValidityFilter:T.array(T.enum(["present","future"])).optional().describe("Time validity filter")}).refine(e=>!(e.bbox&&e.ids),{message:"Provide either bbox or ids, not both"})},buildRequest:Yn,sendRequest:B,parseResponse:Xn},tr={reverseGeocode:yn,geocode:Ue,geometryData:$e,geometrySearch:it,calculateRoute:Jn,reachableRange:dn,evChargingStationsAvailability:we,trafficIncidentDetails:{buildTrafficIncidentDetailsRequest:Yn,parseTrafficIncidentDetailsResponse:Xn,trafficIncidentDetailsTemplate:er},placeByID:lt,autocompleteSearch:le},nr=async(e,t)=>E(e,{...Ie,...t},"EVChargingStationsAvailability"),rr=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const n=await nr({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 ir(e,t){const n=[];for(const r of e.features){const e=await rr(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:a(n)}}const or=e=>Boolean(e&&"availability"in e&&e.availability),ar=async(e,t)=>E(e,{...Be,...t},"Geocode"),sr=async e=>(await ar({query:e,limit:1})).features[0];async function cr(e,t){const n=await E(e,{...ze,...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)}const pr=async(e,t)=>E(e,{...dt,...t},"PlaceById"),dr=async(e,t)=>E(e,{...pn,...t},"Reachable Range"),lr=async(e,t,n)=>{const r=[];for(const a of e){t?.signal?.throwIfAborted();try{r.push(await dr(a,n))}catch(o){if(!(o instanceof w)||403===o.status||429===o.status)throw o}}const i=a(r);return{type:"FeatureCollection",...i&&{bbox:i},features:r}},ur=async(e,t)=>E(e,{...hn,...t},"ReverseGeocode"),mr=async(e,t)=>E(e,{..._n,...t},"Routing"),gr=T.object({minFuzzyLevel:T.number().min(1).max(4).optional().describe("Minimum fuzzy matching level (1-4, higher allows more typos)"),maxFuzzyLevel:T.number().min(1).max(4).optional().describe("Maximum fuzzy matching level (1-4, higher allows more typos)")}),hr=Ye.extend(Le.extend(gr.shape).shape),yr=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},br={requestValidation:{schema:hr},buildRequest:e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${te}/search/${n.query}.json`}`);var n;ne(t,e);const r=t.searchParams;X(r,"typeahead",e.typeahead),X(r,"ofs",e.offset),Q(r,"countrySet",e.countries),X(r,"radius",e.radiusMeters);const i=e.boundingBox&&a(e.boundingBox);return i&&(r.append("topLeft",Ee([i[3],i[0]])),r.append("btmRight",Ee([i[1],i[2]]))),X(r,"minFuzzyLevel",e.minFuzzyLevel),X(r,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:j,parseResponse:e=>{const t=e.results.map(Ce),n=s(a(t));return{type:"FeatureCollection",properties:{...Pe(e.summary),queryIntent:e.summary.queryIntent.map(yr)},features:t,...n&&{bbox:n}}}},fr=async(e,t)=>"geometries"in e?rt(e,t):(async(e,t)=>E(e,{...br,...t},"FuzzySearch"))(e,t),Sr=async e=>(await fr({query:e,limit:1})).features[0],vr=async(e,t)=>E(e,{...er,...t},"TrafficIncidentDetails");export{I as APIErrorCode,R as SDKError,w as SDKServiceError,de as autocompleteSearch,_t as budgetTypes,A as buildResponseError,M as buildValidationError,dr as calculateReachableRange,lr as calculateReachableRanges,mr as calculateRoute,tr as customizeService,nr as evChargingStationsAvailability,ar as geocode,sr as geocodeOne,cr as geometryData,rr as getPlaceWithEVAvailability,ir as getPlacesWithEVAvailability,or as hasChargingAvailability,L as parseDefaultResponseError,pr as placeById,ur as reverseGeocode,fr as search,Sr as searchOne,vr as trafficIncidentDetails};
|
|
1
|
+
import{mergeFromGlobal as e,generateTomTomHeaders as t,getPosition as n,poiCategoriesToID as r,toPointGeometry as i,views as o,bboxFromGeoJSON as a,bboxOnlyIfWithArea as s,generateId as c,bboxFromCoordsArray as p,plugTypes as d,currentTypes as l,avoidableTypes as u,getPositionStrict as m,getRoutePlanningLocationType as g,inputSectionTypesWithGuidance as h,inputSectionTypes as y,indexedMagnitudes as b,trafficIncidentToIconCategory as f,iconToTrafficIncidentCategory as S,trafficIncidentCategories as v}from"@tomtom-org/maps-sdk/core";import{z as T}from"zod";import{isNil as x,omit as C}from"lodash-es";var P=/* @__PURE__ */(e=>(e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e))(P||{});class R extends Error{constructor(e,t,n){super(e),this.service=t,this.issues=n,Error.captureStackTrace&&Error.captureStackTrace(this,R)}}const I={[P.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[P.FORBIDDEN]:"Request failed with status code 403"};class w extends R{constructor(e,t,n){super(e,t),this.status=n,this.status&&I[this.status]&&(this.message=I[this.status])}}const L=(e,t)=>{const{data:n,message:r,status:i}=e;return new w(n?.error||n?.errorText||r,t,i)},A=(e,t,n)=>{if(e.status){const r=e;return n?n(r,t):L(r,t)}return new R(e.message,t)},M=(e,t)=>new R(e.message,t,e.issues),k=T.object({apiKey:T.string().optional().describe("TomTom API key for authentication"),commonBaseURL:T.string().optional().describe("Common base URL for all services"),customServiceBaseURL:T.string().optional().describe("Custom base URL for specific service"),language:T.string().optional().describe('Language code for response text (e.g., "en-US", "nl-NL")')});class E extends Error{constructor(e){super(e.issues.map(e=>`${e.path.length>0?`${e.path.join(".")}: `:""}${e.message}`).join("; ")),this.issues=e.issues}}const F=async(n,r,i)=>{const o=r.getAPIVersion?.(n),a=e({...n,...o&&{apiVersion:o}});if(void 0===n.validateRequest||n.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 E(n.error)})(a,r.requestValidation)}catch(p){return Promise.reject(M(p,i))}const s=r.buildRequest(a),c=t(a);n.onAPIRequest?.(s);try{const e=await r.sendRequest(s,c);return n.onAPIResponse?.(s,e),r.parseResponse(await e.data,a)}catch(p){return n.onAPIResponse?.(s,p),Promise.reject(A(p,i,r.parseResponseError))}};class W extends Error{constructor(e,t,n){super(t??`HTTP Error ${e}`),this.name="FetchError",this.status=e,this.data=n,Error.captureStackTrace&&Error.captureStackTrace(this,W)}}const O=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)},j=async(e,t)=>O(await fetch(e,{headers:t})),B=async(e,t)=>O(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),q=async(e,t)=>{const n=e.method;if("GET"===n)return j(e.url,t);if("POST"===n)return B(e,t);throw new Error(`Unsupported HTTP method received: ${n}`)},U=T.array(T.array(T.number())).describe("Array of coordinate arrays representing a line string"),D=T.object({type:T.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]).describe("GeoJSON geometry type"),coordinates:T.union([T.array(T.number()),U,T.array(T.array(T.array(T.number()))),T.array(T.array(T.array(T.array(T.number()))))]).describe("Coordinate array(s) for the geometry"),radius:T.optional(T.number()).describe("Radius for Circle geometries"),radiusMeters:T.optional(T.number()).describe("Radius in meters for Circle geometries"),bbox:T.optional(T.array(T.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}).check(T.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),N=T.object({type:T.literal("Feature").describe("GeoJSON type identifier"),geometry:D.describe("GeoJSON geometry object"),id:T.optional(T.union([T.string(),T.number()])).describe("Optional feature identifier"),properties:T.any().describe("Feature properties"),bbox:T.optional(T.array(T.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),H=T.object({type:T.literal("FeatureCollection").describe("GeoJSON type identifier"),features:T.array(N).describe("Array of GeoJSON features"),id:T.optional(T.union([T.string(),T.number()])).describe("Optional collection identifier"),properties:T.any().describe("Collection properties"),bbox:T.optional(T.array(T.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),V=T.union([T.tuple([T.number().min(-180).max(180),T.number().min(-90).max(90)]),T.tuple([T.number().min(-180).max(180),T.number().min(-90).max(90),T.number()]),T.object({type:T.literal("Point"),coordinates:T.array(T.number())}),N]).describe("Geographic position as [longitude, latitude] tuple, Point geometry, or Feature"),K=T.union([T.array(T.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),T.array(T.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]).describe("GeoJSON bounding box array [minLng, minLat, maxLng, maxLat] or [minLng, minLat, minAlt, maxLng, maxLat, maxAlt]"),G=T.union([D,N,H]).describe("Any GeoJSON object (Geometry, Feature, or FeatureCollection)"),z=T.union([K,G,T.array(G)]).describe("Bounding box as array, GeoJSON object, or array of GeoJSON objects"),$=T.object({query:T.string().describe("Partial search query for autocomplete suggestions")}),_=T.object({position:V.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:T.number().max(100).optional().describe("Maximum number of autocomplete suggestions to return (1-100)"),radiusMeters:T.number().optional().describe("Search radius in meters around the specified position"),countries:T.array(T.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)"),resultType:T.array(T.string()).optional().describe("Types of results to include in suggestions")}),J=$.extend(_.shape),Y=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},Z=(e,t,n)=>{for(const r of n||[])e.append(t,r)},Q=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},X=(e,t,n)=>{!x(n)&&e.append(t,String(n))},ee=(e,t)=>{const r=n(t);r&&(e.append("lat",String(r[1])),e.append("lon",String(r[0])))},te="/maps/orbis/places",ne=(e,t)=>{const n=e.searchParams;Y(n,t),X(n,"limit",t.limit),ee(n,t.position),Q(n,"fuelSet",t.fuelTypes),Q(n,"idxSet",t.indexes),Q(n,"brandSet",t.poiBrands),t.poiCategories&&Q(n,"categorySet",t.poiCategories.map(e=>"number"!=typeof e?r[e]:e)),Q(n,"connectorSet",t.connectors),Q(n,"mapcodes",t.mapcodes),Q(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),X(n,"minPowerKW",t.minPowerKW),X(n,"maxPowerKW",t.maxPowerKW),X(n,"view",t.view),X(n,"openingHours",t.openingHours),X(n,"timeZone",t.timeZone),X(n,"relatedPois",t.relatedPois),Q(n,"entityTypeSet",t.geographyTypes)},re=e=>{const t=new URL(`${n=e,n.customServiceBaseURL||`${n.commonBaseURL}${te}/autocomplete/${n.query}.json`}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",Y(r,e),X(r,"limit",e.limit),ee(r,e.position),Q(r,"countrySet",e.countries),X(r,"radius",e.radiusMeters),Q(r,"resultSet",e.resultType),t},ie=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},oe=e=>`${e[1]},${e[0]}`,ae=e=>{let t,n;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=ie(e.southWest),n=ie(e.northEast)),[t[0],t[1],n[0],n[1]]},se=e=>[e.lon,e.lat],ce=e=>{const{position:t,...n}=e.context.geoBias||{};return{...e,context:{...e.context,geoBias:{...t&&{position:se(t)},radiusMeters:n.radius}}}},pe={requestValidation:{schema:J},buildRequest:re,sendRequest:j,parseResponse:ce},de=async(e,t)=>F(e,{...pe,...t},"Autocomplete"),le={autocompleteSearch:de,buildAutocompleteSearchRequest:re,parseAutocompleteSearchResponse:ce,autocompleteSearchTemplate:pe},ue=k.extend({id:T.string().describe("Unique identifier of the EV charging station")}),me=["fast","short","efficient","thrilling"],ge=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}${te}/ev/id`)(e)),n=t.searchParams;return Y(n,e),n.append("id",e.id),t},he=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",ye=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},be=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,fe=(e,t,n)=>{if(e)for(const r of e){const e=n.find(e=>be(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}:{}})}},Se=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>be(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},ve=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)fe(e.connectors,e.status,t);return t},Te=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)}},xe=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,Ce=e=>{const t=e.timeRanges.map(e=>({start:Te(e.startTime),end:Te(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:xe(t)}},Pe=e=>{const{position:t,entryPoints:n,poi:r,id:o,dist:a,boundingBox:s,chargingPark:c,...p}=e,d=c?.connectors?.map(e=>({...C(e,"connectorType"),type:e.connectorType,chargingSpeed:he(e.ratedPowerKW)}));return{type:"Feature",geometry:i(se(t)),...s&&{bbox:ae(s)},id:o,properties:{...C(p,"viewport"),...a&&{distance:a},...n?.length&&{entryPoints:n.map(e=>({...e,position:se(e.position)}))},...d?.length&&{chargingPark:{...c,connectors:Se(d)}},...r&&{poi:{...C(r,"categorySet","openingHours"),brands:r?.brands?.map(e=>e.name)??[],categoryIds:r?.categorySet?.map(e=>e.id)??[],...r?.openingHours&&{openingHours:Ce(r?.openingHours)}}}}}},Re=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:se(t)},...n}},Ie=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:he(e.ratedPowerKW)}))}))}))),chargingPointAvailability:ye(t.chargingStations),connectorAvailabilities:ve(t.chargingStations),...t.openingHours&&{openingHours:Ce(t.openingHours)}}:void 0;var n},we={requestValidation:{schema:ue},buildRequest:ge,sendRequest:j,parseResponse:Ie,parseResponseError:(e,t)=>{const n=e.data?.detailedError?.message??e.message;return new w(n,t,e.status)}},Le={buildEVChargingStationsAvailabilityRequest:ge,parseEVChargingStationsAvailabilityResponse:Ie,evChargingStationsAvailabilityTemplate:we},Ae=T.object({typeahead:T.boolean().optional().describe("Enable predictive/autocomplete mode for partial input queries"),offset:T.number().max(1900).optional().describe("Starting position within result set for pagination (zero-based index)"),radiusMeters:T.number().optional().describe("Search radius in meters around the specified position"),boundingBox:z.optional().describe("Bounding box to constrain search results to a rectangular area"),countries:T.array(T.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)")}),Me=T.object({query:T.string().describe("Search query for places, addresses, or locations")}),ke=T.object({position:V.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:T.number().max(100).optional().describe("Maximum number of results to return (1-100)"),extendedPostalCodesFor:T.array(T.string()).optional().describe("Indexes for which to include extended postal codes in results"),mapcodes:T.array(T.string()).optional().describe("Request mapcode representations for locations (Local, International, Alternative)"),view:T.enum(o).optional().describe("Geopolitical view for disputed territories"),geographyTypes:T.array(T.string()).optional().describe("Filter results to specific geography types (Country, Municipality, etc.)")}),Ee=Me.extend(ke.shape),Fe=k.extend(Ee.shape).extend(Ae.shape),We=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",Oe=(e,t)=>{const n=e.length;if(n<=t)return e;const r=[];let i;const o=Math.ceil(n/t);for(i=0;i<n;i+=o)r.push(e[i]);return i>=n-o&&(r.length<t?r.push(e[n-1]):r[r.length-1]=e[n-1]),r},je=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/geocode`)(e)}/${e.query}.json`),n=t.searchParams;Y(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)),ee(n,e.position),e.countries&&n.append("countrySet",We(e.countries)),!x(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const r=e.boundingBox&&a(e.boundingBox);return r&&(n.append("topLeft",We([r[3],r[0]])),n.append("btmRight",We([r[1],r[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",We(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",We(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",We(e.geographyTypes)),t},Be=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:o,addressRanges:a,entityType:s,id:c,...p}=e;return{type:"Feature",geometry:i(se(t)),...n&&{bbox:ae(n)},id:c,properties:{...C(p,"viewport"),...r&&{distance:r},...s&&{geographyType:s.split(",")},...o&&{entryPoints:o.map(e=>({...e,position:se(e.position)}))},...a&&{addressRanges:{...a,from:se(a.from),to:se(a.to)}}}}},qe=e=>{const t=e.results.map(Be),n=s(a(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}},Ue={requestValidation:{schema:Fe},buildRequest:je,sendRequest:j,parseResponse:qe},De={buildGeocodingRequest:je,parseGeocodingResponse:qe,geocodingTemplate:Ue},Ne=T.object({geometries:T.union([H,T.array(T.union([T.string(),N])).min(1).max(20)]).describe("GeoJSON FeatureCollection or array of geometry IDs/Features (max 20)")}),He=T.object({zoom:T.number().min(0).max(22).optional().describe("Zoom level for geometry data simplification (0-22)")}),Ve=Ne.extend(He.shape),Ke=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),Ge=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/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:Ke(t):Ke(t.features),e.append("geometries",We(n))})(n,e.geometries),X(n,"geometriesZoom",e.zoom),t},ze=e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??c(),bbox:a(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:a(t),features:t}},$e={requestValidation:{schema:Ve},buildRequest:Ge,sendRequest:j,parseResponse:ze},_e={buildGeometryDataRequest:Ge,parseGeometryDataResponse:ze,geometryDataTemplate:$e},Je=T.object(r),Ye=T.object({indexes:T.array(T.string()).optional().describe("Search indexes to query (Geo, PAD, Addr, Str, XStr, POI)"),poiCategories:T.array(T.union([T.number(),T.keyof(Je)])).optional().describe("Filter results to specific POI categories"),poiBrands:T.array(T.string()).optional().describe("Filter results to specific POI brands"),connectors:T.array(T.string()).optional().describe("Filter EV charging stations by connector types"),fuelTypes:T.array(T.string()).optional().describe("Filter fuel stations by available fuel types"),openingHours:T.string().optional().describe("Request opening hours information for POIs"),timeZone:T.string().optional().describe("Request timezone information for POI locations (iana)"),relatedPois:T.string().optional().describe("Related POI inclusion mode (off, child, parent, all)"),minPowerKW:T.number().optional().describe("Minimum charging power in kilowatts for EV charging stations"),maxPowerKW:T.number().optional().describe("Maximum charging power in kilowatts for EV charging stations"),minFuzzyLevel:T.number().optional().describe("Minimum fuzzy matching level (1-4)"),mixFuzzyLevel:T.number().optional().describe("Maximum fuzzy matching level (1-4)")}),Ze=Ee.extend(Ye.shape),Qe=T.object({geometries:T.array(T.union([H,D])).describe("Array of GeoJSON geometries or FeatureCollections to search within")}),Xe=Ze.extend(Qe.shape),et=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:oe(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:Oe(e.coordinates[0],50).map(e=>oe(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const n=p(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=>et({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>et({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>et(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},tt=e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${te}/geometrySearch/${n.query}.json`}`);var n;return ne(t,e),{url:t,data:{geometryList:e.geometries.flatMap(et)}}},nt=e=>{const t=e.results.map(Pe),n=s(a(t));return{type:"FeatureCollection",properties:{...Re(e.summary)},features:t,...n&&{bbox:n}}},rt={requestValidation:{schema:Xe},buildRequest:tt,sendRequest:B,parseResponse:nt},it=async(e,t)=>F(e,{...rt,...t},"GeometrySearch"),ot={geometrySearch:it,buildGeometrySearchRequest:tt,parseGeometrySearchResponse:nt,geometrySearchTemplate:rt},at=T.object({entityId:T.string().describe("Unique identifier of the place/entity to retrieve")}),st=T.object({mapcodes:T.array(T.string()).optional().describe("Request mapcode representations for location"),view:T.enum(o).optional().describe("Geopolitical view for disputed territories"),openingHours:T.string().optional().describe("Request opening hours information for the place"),timeZone:T.string().optional().describe("Request timezone information for the place location"),relatedPois:T.string().optional().describe("Related POI inclusion mode (off, child, parent, all)")}),ct=at.extend(st.shape),pt=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/place.json`)(e)}`),n=t.searchParams;return Y(n,e),X(n,"entityId",e.entityId),Q(n,"mapcodes",e.mapcodes),X(n,"view",e.view),X(n,"openingHours",e.openingHours),X(n,"timeZone",e.timeZone),X(n,"relatedPois",e.relatedPois),t},dt=e=>e.results?.length?Pe(e.results[0]):void 0,lt={requestValidation:{schema:ct},buildRequest:pt,sendRequest:j,parseResponse:dt},ut={buildPlaceByIdRequest:pt,parsePlaceByIdResponse:dt,placeByIdTemplate:lt},mt=(e,t)=>{const{data:n,message:r,status:i}=e;return new w(n?.error?.description??n?.detailedError?.message??r,t,i)},gt=T.number().positive(),ht=T.number().min(0),yt=T.number().min(0).max(100),bt=gt.optional(),ft=ht.optional(),St=T.number().min(0).max(1).optional(),vt=T.object({speedKMH:T.number().describe("Speed in kilometers per hour"),consumptionUnitsPer100KM:T.number().describe("Consumption rate per 100 kilometers")}),Tt={efficiency:T.object({acceleration:St.describe("Acceleration efficiency factor (0-1)"),deceleration:St.describe("Deceleration efficiency factor (0-1)"),uphill:St.describe("Uphill efficiency factor (0-1)"),downhill:St.describe("Downhill efficiency factor (0-1)")}).optional()},xt=T.array(vt).min(1).max(25),Ct=T.object({...Tt,speedsToConsumptionsLiters:xt.describe("Array of speed-to-fuel-consumption mappings in liters per 100km"),auxiliaryPowerInLitersPerHour:ft.describe("Auxiliary power consumption in liters per hour"),fuelEnergyDensityInMJoulesPerLiter:T.number().min(1).optional().describe("Fuel energy density in megajoules per liter")}),Pt=T.object({...Tt,speedsToConsumptionsKWH:xt.describe("Array of speed-to-energy-consumption mappings in kWh per 100km"),auxiliaryPowerInkW:ft.describe("Auxiliary power consumption in kilowatts"),consumptionInKWHPerKMAltitudeGain:T.number().max(500).optional().describe("Energy consumption per kilometer of altitude gain in kWh"),recuperationInKWHPerKMAltitudeLoss:ft.describe("Energy recuperation per kilometer of altitude loss in kWh")}),Rt=T.object({currentType:T.enum(l).describe("Type of electrical current (AC or DC)"),plugTypes:T.array(T.enum(d)).min(1).describe("Compatible plug/connector types"),efficiency:St.describe("Charging efficiency factor (0-1)"),baseLoadInkW:ft.describe("Base load in kilowatts"),maxPowerInkW:ft.describe("Maximum charging power in kilowatts"),maxVoltageInV:ft.describe("Maximum voltage in volts"),maxCurrentInA:ft.describe("Maximum current in amperes"),voltageRange:T.object({minVoltageInV:ft.describe("Minimum voltage in volts"),maxVoltageInV:T.number().optional().describe("Maximum voltage in volts")}).optional().describe("Acceptable voltage range")}),It=T.object({stateOfChargeInkWh:ht.describe("State of charge in kilowatt-hours"),maxPowerInkW:gt.describe("Maximum charging power at this state of charge in kilowatts")}),wt=T.object({maxChargeKWH:gt.describe("Maximum battery capacity in kilowatt-hours"),batteryCurve:T.array(It).max(20).optional().describe("Battery charging curve with up to 20 data points"),chargingConnectors:T.array(Rt).min(1).optional().describe("Available charging connectors on the vehicle"),chargingTimeOffsetInSec:ft.describe("Time offset for charging start in seconds")}),Lt=T.object({consumption:Ct.describe("Fuel consumption model for combustion engine")}),At=T.object({consumption:Pt.describe("Energy consumption model for electric engine"),charging:wt.optional().describe("Battery and charging specifications")}),Mt=T.object({lengthMeters:bt.describe("Vehicle length in meters"),widthMeters:bt.describe("Vehicle width in meters"),heightMeters:bt.describe("Vehicle height in meters"),weightKG:bt.describe("Vehicle weight in kilograms"),axleWeightKG:bt.describe("Vehicle axle weight in kilograms")}).optional(),kt=T.object({variantId:T.string().describe("Predefined vehicle variant identifier")}),Et=T.object({dimensions:Mt.describe("Physical dimensions and weight of the vehicle"),engine:T.union([Lt,At]).optional().describe("Engine type and consumption characteristics")}),Ft=T.union([kt,Et]).optional(),Wt=T.object({heading:T.number().min(0).max(360).optional().describe("Current vehicle heading in degrees (0-360)")}),Ot=Wt.extend({currentFuelInLiters:ht.describe("Current fuel level in liters")}),jt=Wt.extend({currentChargePCT:yt.describe("Current battery charge as percentage (0-100)")}),Bt=Wt.extend({currentChargeInkWh:ht.describe("Current battery charge in kilowatt-hours")}),qt=T.union([jt,Bt]),Ut=T.object({minChargeAtDestinationPCT:yt.describe("Minimum battery charge percentage required at destination (0-100)"),minChargeAtChargingStopsPCT:T.number().min(0).max(50).describe("Minimum battery charge percentage at charging stops (0-50)")}),Dt=T.object({minChargeAtDestinationInkWh:ht.describe("Minimum battery charge in kWh required at destination"),minChargeAtChargingStopsInkWh:ht.describe("Minimum battery charge in kWh at charging stops")}),Nt=T.union([Ut,Dt]),Ht=T.object({chargingPreferences:Nt.optional().describe("Preferences for charging stops along the route")}),Vt={model:Ft,restrictions:T.object({loadTypes:T.array(T.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional().describe("Types of hazardous or restricted loads being carried"),maxSpeedKMH:T.number().min(0).max(250).optional().describe("Maximum vehicle speed in kilometers per hour (0-250)"),adrCode:T.enum(["B","C","D","E"]).optional().describe("ADR tunnel restriction code for hazardous materials"),commercial:T.boolean().optional().describe("Whether the vehicle is used for commercial purposes")}).optional()},Kt=T.object({...Vt,engineType:T.undefined(),state:Wt.optional().describe("Current state of the vehicle"),preferences:T.object({}).optional().describe("Vehicle preferences")}),Gt=T.object({...Vt,engineType:T.literal("combustion").describe("Combustion engine type"),state:Ot.optional().describe("Current state of the combustion vehicle including fuel level"),preferences:T.object({}).optional().describe("Combustion vehicle preferences")}),zt=T.object({...Vt,engineType:T.literal("electric").describe("Electric engine type"),state:qt.optional().describe("Current state of the electric vehicle including battery charge"),preferences:Ht.optional().describe("Electric vehicle preferences including charging requirements")}),$t=T.union([T.discriminatedUnion("engineType",[Gt,zt]),Kt]),_t=T.object({costModel:T.object({avoid:T.array(T.enum(u)).optional().describe("Road types and features to avoid when calculating route"),traffic:T.enum(["live","historical"]).optional().describe("Traffic consideration mode (live: real-time + historical, historical: typical patterns only)"),routeType:T.enum(me).optional().describe("Route optimization strategy (fast, short, efficient, thrilling)"),avoidAreas:T.array(z).max(10).optional().describe("Up to 10 rectangular areas for the routing engine to bypass, each as a BBox [W,S,E,N], GeoJSON object, or array of GeoJSON objects"),thrillingParams:T.object({hilliness:T.enum(["low","normal","high"]).optional().describe("Level of hilliness for thrilling routes"),windingness:T.enum(["low","normal","high"]).optional().describe("Level of windingness for thrilling routes")}).optional().describe("Optional parameters for thrilling route type")}).optional().describe("Cost model criteria for route optimization"),travelMode:T.string().optional().describe("Travel mode (car, truck, pedestrian, bicycle)"),vehicle:$t.optional().describe("Vehicle-specific parameters including dimensions, engine type, and consumption model"),when:T.object({option:T.enum(["departAt","arriveBy"]).describe("Whether to specify a departure or arrival time"),date:T.date().describe("The date and time to depart or arrive")}).optional().describe("Departure or arrival time specification for route planning")}),Jt=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],Yt=T.object({origin:V.describe("Starting position [longitude, latitude] for reachable range calculation"),budget:T.object({type:T.enum(Jt).describe("Budget type (time, distance, or energy/fuel)"),value:T.number().min(0).describe("Budget value (depends on type: seconds, meters, liters, or kWh)")}).describe("Travel budget constraints for reachable range")}),Zt=T.object({maxFerryLengthMeters:T.number().min(0).optional().describe("Maximum ferry distance in meters to include in range"),smoothing:T.enum(["none","weak","strong"]).optional().describe("Post-processing smoothing level for the polygon boundary")}),Qt=_t.extend(Yt.extend(Zt.shape).shape),Xt=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),en=(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",Xt(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",Xt(n.speedsToConsumptionsLiters)),!x(n.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(n.auxiliaryPowerInLitersPerHour)),!x(n.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(n.fuelEnergyDensityInMJoulesPerLiter))})(e,n)},tn=(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&&en(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},nn=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),tn(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,i=n;if(r.currentChargeInkWh)e.append("currentChargeInkWh",String(r.currentChargeInkWh));else if(i.currentChargePCT&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine,r=n.charging?.maxChargeKWH;r&&e.append("currentChargeInkWh",String(r*i.currentChargePCT/100))}}})(e,t),((e,t)=>{if(t.preferences&&"engineType"in t&&"electric"===t.engineType){const n=t.preferences;if(n.chargingPreferences){const r=n.chargingPreferences,i=r,o=r;if(i.minChargeAtChargingStopsInkWh||i.minChargeAtDestinationInkWh)e.append("minChargeAtDestinationInkWh",String(i.minChargeAtDestinationInkWh)),e.append("minChargeAtChargingStopsInkWh",String(i.minChargeAtChargingStopsInkWh));else if((o.minChargeAtChargingStopsPCT||o.minChargeAtDestinationPCT)&&t.model&&"engine"in t.model&&t.model.engine){const n=t.model.engine,r=n.charging?.maxChargeKWH;r&&(e.append("minChargeAtDestinationInkWh",String(r*o.minChargeAtDestinationPCT/100)),e.append("minChargeAtChargingStopsInkWh",String(r*o.minChargeAtChargingStopsPCT/100)))}}}})(e,t),((e,t)=>{const n=t.restrictions;n&&(Z(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))},rn=(e,t)=>{const n=t.costModel;Z(e,"avoid",n?.avoid),X(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),X(e,"routeType",n?.routeType),X(e,"travelMode",t.travelMode),nn(e,t.vehicle)},on=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},an=(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=on(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=on(e);if(null!=t)return t*n.currentChargePCT/100}})(t),i=on(t);if(null!=i&&null!=r){const t=i*n.value/100;e.append("energyBudgetInkWh",Math.max(0,r-t).toString())}break}default:e.append(n.type,n.value.toString())}},sn=e=>{const t=m(e.origin);return{origin:{type:"Point",coordinates:[t[0],t[1]]}}},cn=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`)(e)),n=t.searchParams;return Y(n,e),n.delete("language"),rn(n,e),an(n,e),X(n,"maxFerryLengthInMeters",e.maxFerryLengthMeters),X(n,"smoothing",e.smoothing),{method:"POST",url:t,data:sn(e)}},pn=(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}},dn={requestValidation:{schema:Qt},buildRequest:cn,sendRequest:q,parseResponse:pn,parseResponseError:mt,getAPIVersion:()=>3},ln={buildReachableRangeRequest:cn,parseReachableRangeResponse:pn,reachableRangeTemplate:dn},un=e=>{const t=m(e.position),n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${te}/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),r=n.searchParams;return Y(r,e),e.allowFreeformNewline&&r.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&r.append("entityType",We(e.geographyType)),!x(e.heading)&&r.append("heading",String(e.heading)),e.mapcodes&&r.append("mapcodes",We(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},mn=(e,t)=>{const n=e.addresses[0],{boundingBox:r,sideOfStreet:o,offsetPosition:a,...s}=n?.address||{};return{type:"Feature",geometry:i(m(t.position)),...r&&{bbox:ae(r)},id:c(),...n&&{properties:{type:n?.entityType?"Geography":s.streetNumber?"Point Address":"Street",address:s,...n.dataSources&&{dataSources:n.dataSources},...n.mapcodes&&{mapcodes:n.mapcodes},...o&&{sideOfStreet:o},...a&&{offsetPosition:ie(a)},originalPosition:ie(n.position)}}}},gn=T.object({position:V.describe("Geographic position [longitude, latitude] to reverse geocode")}),hn=T.object({allowFreeformNewline:T.boolean().optional().describe("Allow newline characters in freeform address"),geographyType:T.array(T.string()).optional().describe("Filter results to specific geography types"),heading:T.number().min(-360).max(360).optional().describe("Vehicle heading in degrees (-360 to 360) for directional results"),mapcodes:T.array(T.string()).optional().describe("Request mapcode representations for location"),number:T.string().optional().describe("Street number for more precise address results"),radiusMeters:T.number().optional().describe("Search radius in meters for reverse geocoding"),returnMatchType:T.boolean().optional().describe("Include match type information in response"),returnRoadUse:T.boolean().optional().describe("Include road use information in response"),returnSpeedLimit:T.boolean().optional().describe("Include speed limit information in response"),roadUses:T.array(T.string()).optional().describe("Filter results to specific road use types"),view:T.enum(o).optional().describe("Geopolitical view for disputed territories")}),yn={requestValidation:{schema:gn.extend(hn.shape)},buildRequest:un,sendRequest:j,parseResponse:mn},bn={buildRevGeoRequest:un,parseRevGeoResponse:mn,reverseGeocodingTemplate:yn},fn=T.union([V,D]).describe("Waypoint as position or geometry"),Sn=T.union([U,N]).describe("Path as line string coordinates or feature"),vn=T.object({locations:T.array(T.union([fn,Sn])).min(1).describe("Array of route locations (waypoints or paths) - minimum 2 waypoints or 1 path required")}),Tn=T.object({computeAdditionalTravelTimeFor:T.enum(["none","all"]).optional().describe("Calculate additional travel time estimates for different traffic scenarios (none or all)"),vehicleHeading:T.number().min(0).max(359.5).optional().describe("Vehicle heading in degrees (0-359.5) at departure"),maxAlternatives:T.number().min(0).max(5).optional().describe("Maximum number of alternative routes to calculate (0-5)"),sectionTypes:T.array(T.enum(h)).optional().describe("Types of route sections to include in response (toll, ferry, traffic, etc.)")}),xn=_t.extend(vn.extend(Tn.shape).shape),Cn=e=>e.vehicle?.preferences?.chargingPreferences,Pn=e=>Array.isArray(e)?e:e.geometry.coordinates,Rn=(e,t,n)=>((e,t)=>e.map(e=>{const n=oe(m(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 i=e[0];r="path"===t[0]?Pn(i)[0]:m(i,{useEntryPoint:n});const o=e[e.length-1];let a;if("path"===t[t.length-1]){const e=Pn(o);a=e[e.length-1]}else a=m(o,{useEntryPoint:n});return[r,a]})(e,t,n):e,n),In=e=>({latitude:e[1],longitude:e[0]}),wn=(e,t,n)=>{const r=[],i=[];return e.forEach((o,a)=>{"path"===t[a]?((e,t,n,r,i)=>{const o=r.length;for(const a of Pn(e))r.push(In(a));Array.isArray(e)||(e.properties.sections.leg.forEach((e,n)=>{(t>0||n>0)&&i.push({supportingPointIndex:o+e.startPointIndex,waypointSourceType:"USER_DEFINED"})}),t<n.length-1&&i.push({supportingPointIndex:o+e.geometry.coordinates.length-1,waypointSourceType:"USER_DEFINED"}))})(o,a,e,r,i):((e,t,n,r,i,o)=>{r.push(In(m(e,{useEntryPoint:o}))),t>0&&t<n.length-1&&i.push({supportingPointIndex:r.length-1,waypointSourceType:"USER_DEFINED"})})(o,a,e,r,i,n)}),{supportingPoints:r,...i.length&&{pointWaypoints:i}}},Ln=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,i,o]=t;return{southWestCorner:{latitude:r,longitude:n},northEastCorner:{latitude:o,longitude:i}}})}),An=e=>{const t=e.locations.map(g),n=e.useEntryPoints??"main-when-available",r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${Cn(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${Rn(e.locations,t,n)}/json`),i=r.searchParams;Y(i,e),"language"in e||i.append("language","en-GB"),rn(i,e),X(i,"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")}})(i,e),!x(e.maxAlternatives)&&i.append("maxAlternatives",String(e.maxAlternatives)),((e,t,n)=>{const r=(t??(n?h:y)).map(e=>"vehicleRestricted"===e?"travelMode":e);Z(e,"sectionType",r)})(i,e.sectionTypes,!!e.guidance?.type);for(const a of e.extendedRouteRepresentations??["distance","travelTime"])i.append("extendedRouteRepresentation",a);const o=((e,t,n)=>{const r=t.includes("path"),i=!!Cn(e),o=e.costModel?.avoidAreas;if(!r&&!i&&!o)return null;const a=e.vehicle?.model,s=a?.engine?.charging;return{...r&&wn(e.locations,t,n),...i&&s&&{chargingParameters:C(s,"maxChargeKWH")},...o?.length&&{avoidAreas:Ln(o)}}})(e,t,n);return o?{method:"POST",url:r,data:o}:{method:"GET",url:r}},Mn=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},kn=(e,t)=>{const n=e.chargingConnectionInfo,r=e.chargingParkLocation,i=[r.coordinate.longitude,r.coordinate.latitude],o=[r.street,r.houseNumber].filter(Boolean),a=o.length>0?o.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:i},properties:{...C(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:a,...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:Mn(n.chargingCurrentType),chargingSpeed:he(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:he(e.chargingParkPowerInkW)}}}},En=(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:kn(e.chargingInformationAtEndOfLeg,n)}}},Fn=(e,t)=>e.reduce((e,n,r)=>{const i=0===r?0:e[r-1]?.endPointIndex;let o;return x(i)||(o=0===i?n.points?.length>0?n.points.length-1:0:i+n.points?.length),e.push({...!x(i)&&{startPointIndex:i},...o&&{endPointIndex:o},summary:En(n.summary,t),id:c()}),e},[]),Wn=e=>({id:c(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),On=e=>({...Wn(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),jn=e=>({...Wn(e),countryCodeISO3:e.countryCode}),Bn=e=>"other"===e.travelMode?Wn(e):null,qn=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"]}},Un=e=>({...Wn(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:qn(e),magnitudeOfDelay:b[e.magnitudeOfDelay],tec:e.tec}),Dn=e=>({...Wn(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),Nn=e=>({...Wn(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),Hn=e=>({...Wn(e),roadShieldReferences:e.roadShieldReferences}),Vn=(e,t)=>(t[e]||(t[e]=[]),t[e]),Kn=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Wn};case"COUNTRY":return{sectionType:"country",mappingFunction:jn};case"FERRY":return{sectionType:"ferry",mappingFunction:Wn};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Wn};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Wn};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:jn};case"TOLL":return{sectionType:"toll",mappingFunction:Wn};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:Un};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:Bn};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Wn};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Wn};case"URBAN":return{sectionType:"urban",mappingFunction:Wn};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Wn};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Wn};case"LANES":return{sectionType:"lanes",mappingFunction:Dn};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:Nn};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:Hn};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:On}}},Gn=(e,t)=>{const n={leg:Fn(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const n of e){const e=Kn(n),r=e?.mappingFunction(n);r&&Vn(e.sectionType,t).push(r)}})(e.sections,n),n},zn=1e-4,$n=(e,t)=>Math.abs(e[0]-t[0])<zn&&Math.abs(e[1]-t[1])<zn,_n=(e,t)=>{const n=[];let r=0;for(const i of e.instructions){const e=[i.maneuverPoint.longitude,i.maneuverPoint.latitude];for(let n=r;n<t.length;n++){if($n(t[n],e)){r=n;break}if(n===t.length-1)break}n.push({...i,maneuverPoint:e,pathPointIndex:r,routePath:i.routePath.map(e=>({...e,point:[e.point.longitude,e.point.latitude]}))})}return{instructions:n}},Jn=(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:c(),bbox:a(r),properties:{index:t,summary:En(e.summary,n),sections:Gn(e,n),...e.guidance&&{guidance:_n(e.guidance,r.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),r=a(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},Yn={requestValidation:{schema:xn,refinements:[{check:e=>!!e.locations.map(g).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:An,sendRequest:q,parseResponse:Jn,parseResponseError:mt,getAPIVersion:()=>2},Zn={buildCalculateRouteRequest:An,parseCalculateRouteResponse:Jn,calculateRouteTemplate:Yn},Qn=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidentDetails`)(e)),n=t.searchParams;if(Y(n,e),((e,t)=>{X(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}}}}}"),X(e,"t",t.trafficModelId),Q(e,"categoryFilter",t.categoryFilter?.map(f)),Q(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})},Xn=e=>({description:e.description,code:e.code,category:S(e.iconCategory)}),er=e=>{const t=e.properties;return{type:"Feature",geometry:e.geometry,properties:{id:t.id,category:S(t.iconCategory),magnitudeOfDelay:b[t.magnitudeOfDelay]??"unknown",events:(t.events??[]).map(Xn),...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},tr=e=>({type:"FeatureCollection",features:(e.incidents??[]).filter(e=>null!==e).map(er)}),nr={requestValidation:{schema:k.extend({bbox:z.optional(),ids:T.array(T.string()).optional().describe("List of incident IDs"),trafficModelId:T.string().optional().describe("Traffic Model ID for temporal consistency"),categoryFilter:T.array(T.enum([...v])).optional().describe("Incident category filter"),timeValidityFilter:T.array(T.enum(["present","future"])).optional().describe("Time validity filter")}).refine(e=>!(e.bbox&&e.ids),{message:"Provide either bbox or ids, not both"})},buildRequest:Qn,sendRequest:q,parseResponse:tr},rr={reverseGeocode:bn,geocode:De,geometryData:_e,geometrySearch:ot,calculateRoute:Zn,reachableRange:ln,evChargingStationsAvailability:Le,trafficIncidentDetails:{buildTrafficIncidentDetailsRequest:Qn,parseTrafficIncidentDetailsResponse:tr,trafficIncidentDetailsTemplate:nr},placeByID:ut,autocompleteSearch:le},ir=async(e,t)=>F(e,{...we,...t},"EVChargingStationsAvailability"),or=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const n=await ir({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 ar(e,t){const n=[];for(const r of e.features){const e=await or(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:a(n)}}const sr=e=>Boolean(e&&"availability"in e&&e.availability),cr=async(e,t)=>F(e,{...Ue,...t},"Geocode"),pr=async e=>(await cr({query:e,limit:1})).features[0];async function dr(e,t){const n=await F(e,{...$e,...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)}const lr=async(e,t)=>F(e,{...lt,...t},"PlaceById"),ur=async(e,t)=>F(e,{...dn,...t},"Reachable Range"),mr=async(e,t,n)=>{const r=[];for(const a of e){t?.signal?.throwIfAborted();try{r.push(await ur(a,n))}catch(o){if(!(o instanceof w)||403===o.status||429===o.status)throw o}}const i=a(r);return{type:"FeatureCollection",...i&&{bbox:i},features:r}},gr=async(e,t)=>F(e,{...yn,...t},"ReverseGeocode"),hr=async(e,t)=>F(e,{...Yn,...t},"Routing"),yr=T.object({minFuzzyLevel:T.number().min(1).max(4).optional().describe("Minimum fuzzy matching level (1-4, higher allows more typos)"),maxFuzzyLevel:T.number().min(1).max(4).optional().describe("Maximum fuzzy matching level (1-4, higher allows more typos)")}),br=Ze.extend(Ae.extend(yr.shape).shape),fr=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},Sr={requestValidation:{schema:br},buildRequest:e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${te}/search/${n.query}.json`}`);var n;ne(t,e);const r=t.searchParams;X(r,"typeahead",e.typeahead),X(r,"ofs",e.offset),Q(r,"countrySet",e.countries),X(r,"radius",e.radiusMeters);const i=e.boundingBox&&a(e.boundingBox);return i&&(r.append("topLeft",We([i[3],i[0]])),r.append("btmRight",We([i[1],i[2]]))),X(r,"minFuzzyLevel",e.minFuzzyLevel),X(r,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:j,parseResponse:e=>{const t=e.results.map(Pe),n=s(a(t));return{type:"FeatureCollection",properties:{...Re(e.summary),queryIntent:e.summary.queryIntent.map(fr)},features:t,...n&&{bbox:n}}}},vr=async(e,t)=>"geometries"in e?it(e,t):(async(e,t)=>F(e,{...Sr,...t},"FuzzySearch"))(e,t),Tr=async e=>(await vr({query:e,limit:1})).features[0],xr=async(e,t)=>F(e,{...nr,...t},"TrafficIncidentDetails");export{I as APIErrorCode,R as SDKError,w as SDKServiceError,de as autocompleteSearch,Jt as budgetTypes,A as buildResponseError,M as buildValidationError,ur as calculateReachableRange,mr as calculateReachableRanges,hr as calculateRoute,rr as customizeService,ir as evChargingStationsAvailability,cr as geocode,pr as geocodeOne,dr as geometryData,or as getPlaceWithEVAvailability,ar as getPlacesWithEVAvailability,sr as hasChargingAvailability,L as parseDefaultResponseError,lr as placeById,gr as reverseGeocode,me as routeTypes,vr as search,Tr as searchOne,xr as trafficIncidentDetails};
|
|
2
2
|
//# sourceMappingURL=services.es.js.map
|