@tomtom-org/maps-sdk 0.45.6 → 0.45.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tomtom-org/maps-sdk",
3
3
  "author": "TomTom International B.V.",
4
4
  "license": "See in LICENSE.txt",
5
- "version": "0.45.6",
5
+ "version": "0.45.8",
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.3",
21
+ "@biomejs/biome": "^2.4.4",
22
22
  "@size-limit/file": "^11.2.0",
23
23
  "@size-limit/preset-app": "^11.2.0",
24
24
  "size-limit": "^11.2.0",
@@ -28,7 +28,7 @@
28
28
  "peerDependencies": {
29
29
  "@turf/turf": "^7.3.4",
30
30
  "lodash-es": "^4.17.23",
31
- "maplibre-gl": "^5.18.0",
31
+ "maplibre-gl": "^5.19.0",
32
32
  "zod": "^4.3.6"
33
33
  },
34
34
  "size-limit": [
@@ -747,9 +747,9 @@ declare type BrandAPI = {
747
747
  *
748
748
  * @group Reachable Range
749
749
  */
750
- declare type BudgetType = (typeof budgetTypes)[number];
750
+ export declare type BudgetType = (typeof budgetTypes)[number];
751
751
 
752
- declare const budgetTypes: readonly ["timeMinutes", "remainingChargeCPT", "spentChargePCT", "spentFuelLiters", "distanceKM"];
752
+ export declare const budgetTypes: readonly ["timeMinutes", "remainingChargeCPT", "spentChargePCT", "spentFuelLiters", "distanceKM"];
753
753
 
754
754
  /**
755
755
  * Default function for building autocomplete request from {@link AutocompleteSearchParams}
@@ -794,11 +794,10 @@ declare const buildGeometrySearchRequest: (params: GeometrySearchParams) => Post
794
794
  declare const buildPlaceByIdRequest: (params: PlaceByIdParams) => URL;
795
795
 
796
796
  /**
797
- *
798
797
  * @param params
799
798
  * @returns
800
799
  */
801
- declare const buildReachableRangeRequest: (params: ReachableRangeParams) => URL;
800
+ declare const buildReachableRangeRequest: (params: ReachableRangeParams) => FetchInput<ReachableRangePostData>;
802
801
 
803
802
  /**
804
803
  * @ignore
@@ -822,6 +821,141 @@ declare const buildRevGeoRequest: (params: ReverseGeocodingParams) => URL;
822
821
  */
823
822
  export declare const buildValidationError: (error: ValidationError, serviceName: ServiceName) => SDKError;
824
823
 
824
+ /**
825
+ * Calculate the area reachable from a starting point within given constraints.
826
+ *
827
+ * The Reachable Range service (also known as isochrone) computes a polygon representing
828
+ * all locations that can be reached from an origin within specified limits of time, distance,
829
+ * or energy consumption. This is essential for range analysis, service area visualization,
830
+ * and logistics planning.
831
+ *
832
+ * @remarks
833
+ * Key features:
834
+ * - **Time-based ranges**: Areas reachable within a time budget (e.g., 30 minutes)
835
+ * - **Distance-based ranges**: Areas within a distance limit (e.g., 50km)
836
+ * - **Energy-based ranges**: EV range considering battery consumption
837
+ * - **Traffic awareness**: Accounts for current and historic traffic patterns
838
+ * - **Vehicle-specific**: Considers vehicle characteristics and constraints
839
+ *
840
+ * Common use cases:
841
+ * - **Service area mapping**: "Show areas we can deliver to within 1 hour"
842
+ * - **EV range visualization**: Display drivable range on current battery
843
+ * - **Real estate**: "Find homes within 45 minutes of workplace"
844
+ * - **Emergency services**: Calculate ambulance/fire truck response areas
845
+ * - **Market analysis**: Identify customer catchment areas
846
+ * - **Location planning**: Optimize facility placement based on coverage
847
+ *
848
+ * @param params Reachable range parameters including origin and budget constraints
849
+ * @param customTemplate Advanced customization for request/response handling
850
+ *
851
+ * @returns Promise resolving to a polygon representing the reachable area
852
+ *
853
+ * @example
854
+ * ```typescript
855
+ * // Calculate 30-minute drive time range
856
+ * const range30min = await calculateReachableRange({
857
+ * key: 'your-api-key',
858
+ * origin: [4.9041, 52.3676], // Amsterdam
859
+ * timeBudgetInSec: 1800 // 30 minutes
860
+ * });
861
+ *
862
+ * // Calculate 50km distance range
863
+ * const range50km = await calculateReachableRange({
864
+ * key: 'your-api-key',
865
+ * origin: [4.9041, 52.3676],
866
+ * distanceBudgetInMeters: 50000
867
+ * });
868
+ *
869
+ * // EV range based on battery
870
+ * const evRange = await calculateReachableRange({
871
+ * key: 'your-api-key',
872
+ * origin: [4.9041, 52.3676],
873
+ * fuelBudgetInkWh: 20, // Remaining battery
874
+ * vehicleEngineType: 'electric',
875
+ * constantSpeedConsumptionInkWhPerHundredkm: [[50, 8], [80, 12]]
876
+ * });
877
+ *
878
+ * // Traffic-aware range at departure time
879
+ * const morningRange = await calculateReachableRange({
880
+ * key: 'your-api-key',
881
+ * origin: [4.9041, 52.3676],
882
+ * timeBudgetInSec: 2700, // 45 minutes
883
+ * departAt: new Date('2025-10-20T08:00:00Z') // Rush hour
884
+ * });
885
+ * ```
886
+ *
887
+ * @see [Reachable Range API Documentation](https://docs.tomtom.com/routing-api/documentation/routing/calculate-reachable-range)
888
+ * @see [Routing Quickstart Guide](https://docs.tomtom.com/maps-sdk-js/guides/services/routing/quickstart)
889
+ *
890
+ * @group Routing
891
+ */
892
+ export declare const calculateReachableRange: (params: ReachableRangeParams, customTemplate?: Partial<ReachableRangeTemplate>) => Promise<PolygonFeature<ReachableRangeParams>>;
893
+
894
+ /**
895
+ * Calculate multiple reachable range areas from different origins or with different constraints.
896
+ *
897
+ * Computes several isochrone polygons in sequence, useful for comparing ranges from multiple
898
+ * locations, visualizing multiple time/distance rings from the same origin, or analyzing
899
+ * different vehicle scenarios.
900
+ *
901
+ * @remarks
902
+ * Use cases:
903
+ * - **Multi-location comparison**: Compare service areas of different store locations
904
+ * - **Concentric ranges**: Create 15/30/45 minute drive time rings from one origin
905
+ * - **Scenario analysis**: Compare ranges for different vehicle types or times of day
906
+ * - **Coverage optimization**: Find optimal facility locations with minimal overlap
907
+ *
908
+ * Note: Ranges are calculated sequentially to avoid rate limiting. For large batches,
909
+ * consider implementing your own parallel processing with appropriate throttling.
910
+ *
911
+ * @param paramsArray Array of reachable range parameters, one for each area to calculate
912
+ * @param options.signal An `AbortSignal` to cancel in-flight requests between iterations.
913
+ * @param customTemplate Advanced customization for request/response handling
914
+ *
915
+ * @returns Promise resolving to a FeatureCollection of reachable area polygons
916
+ *
917
+ * @example
918
+ * ```typescript
919
+ * // Calculate concentric drive time rings (15, 30, 45 minutes)
920
+ * const timeRings = await calculateReachableRanges([
921
+ * { key: 'your-api-key', origin: [4.9, 52.3], timeBudgetInSec: 900 },
922
+ * { key: 'your-api-key', origin: [4.9, 52.3], timeBudgetInSec: 1800 },
923
+ * { key: 'your-api-key', origin: [4.9, 52.3], timeBudgetInSec: 2700 }
924
+ * ]);
925
+ *
926
+ * // Compare service areas of multiple stores
927
+ * const storeRanges = await calculateReachableRanges([
928
+ * { key: 'your-api-key', origin: [4.9, 52.3], timeBudgetInSec: 1800 },
929
+ * { key: 'your-api-key', origin: [4.5, 51.9], timeBudgetInSec: 1800 },
930
+ * { key: 'your-api-key', origin: [5.1, 52.1], timeBudgetInSec: 1800 }
931
+ * ]);
932
+ *
933
+ * // Compare EV ranges at different battery levels
934
+ * const batteryRanges = await calculateReachableRanges([
935
+ * {
936
+ * key: 'your-api-key',
937
+ * origin: [4.9, 52.3],
938
+ * fuelBudgetInkWh: 10,
939
+ * vehicleEngineType: 'electric'
940
+ * },
941
+ * {
942
+ * key: 'your-api-key',
943
+ * origin: [4.9, 52.3],
944
+ * fuelBudgetInkWh: 20,
945
+ * vehicleEngineType: 'electric'
946
+ * }
947
+ * ]);
948
+ * ```
949
+ *
950
+ * @see [Reachable Range API Documentation](https://docs.tomtom.com/routing-api/documentation/routing/calculate-reachable-range)
951
+ * @see [Routing Quickstart Guide](https://docs.tomtom.com/maps-sdk-js/guides/services/routing/quickstart)
952
+ *
953
+ * @group Routing
954
+ */
955
+ export declare const calculateReachableRanges: (paramsArray: ReachableRangeParams[], options?: {
956
+ signal?: AbortSignal;
957
+ }, customTemplate?: Partial<ReachableRangeTemplate>) => Promise<PolygonFeatures<ReachableRangeParams>>;
958
+
825
959
  /**
826
960
  * Calculates a route between an origin and destination, optionally passing through extra waypoints.
827
961
  *
@@ -1008,8 +1142,7 @@ export declare type CalculateRouteParams = CommonServiceParams<CalculateRouteReq
1008
1142
  * guidance: {
1009
1143
  * type: 'coded',
1010
1144
  * version: 2,
1011
- * phonetics: 'IPA',
1012
- * roadShieldReferences: 'all'
1145
+ * phonetics: 'IPA'
1013
1146
  * }
1014
1147
  * ```
1015
1148
  */
@@ -1024,8 +1157,8 @@ export declare type CalculateRouteParams = CommonServiceParams<CalculateRouteReq
1024
1157
  *
1025
1158
  * @example
1026
1159
  * ```typescript
1027
- * // Request specific sections
1028
- * sectionTypes: ['toll', 'ferry', 'traffic', 'country']
1160
+ * // Request specific sections (any combination of available section types)
1161
+ * sectionTypes: ['toll', 'ferry', 'traffic', 'country', 'roadShields']
1029
1162
  *
1030
1163
  * // Request no optional sections
1031
1164
  * sectionTypes: []
@@ -4648,8 +4781,7 @@ declare type GuidanceAPI = Omit<Guidance, 'instructions'> & {
4648
4781
  * const guidance: GuidanceParams = {
4649
4782
  * type: 'coded',
4650
4783
  * version: 2,
4651
- * phonetics: 'IPA',
4652
- * roadShieldReferences: 'all'
4784
+ * phonetics: 'IPA'
4653
4785
  * };
4654
4786
  * ```
4655
4787
  *
@@ -4678,13 +4810,6 @@ export declare type GuidanceParams = {
4678
4810
  * @default 'IPA'
4679
4811
  */
4680
4812
  phonetics?: 'LHP' | 'IPA';
4681
- /**
4682
- * Include road shield references for displaying road signs.
4683
- *
4684
- * When set to 'all', includes references to road shield images
4685
- * that can be fetched from the TomTom Road Shield API.
4686
- */
4687
- roadShieldReferences?: 'all';
4688
4813
  };
4689
4814
 
4690
4815
  /**
@@ -5449,7 +5574,7 @@ export declare type QueryIntentAPI = CoordinateIntentAPI | NearbyIntentAPI | W3W
5449
5574
  *
5450
5575
  * @group Reachable Range
5451
5576
  */
5452
- declare type ReachableRangeBudget = {
5577
+ export declare type ReachableRangeBudget = {
5453
5578
  /**
5454
5579
  * The type of budget, including units.
5455
5580
  *
@@ -5489,7 +5614,7 @@ declare type ReachableRangeBudget = {
5489
5614
  *
5490
5615
  * @group Reachable Range
5491
5616
  */
5492
- declare type ReachableRangeOwnParams = {
5617
+ export declare type ReachableRangeOwnParams = {
5493
5618
  /**
5494
5619
  * Location from which the range calculation should start.
5495
5620
  *
@@ -5532,6 +5657,18 @@ declare type ReachableRangeOwnParams = {
5532
5657
  * ```
5533
5658
  */
5534
5659
  maxFerryLengthMeters?: number;
5660
+ /**
5661
+ * Applies post-processing to smooth the polygon boundary for better visual appearance.
5662
+ *
5663
+ * @remarks
5664
+ * Stronger smoothing generally results in more points.
5665
+ *
5666
+ * @example
5667
+ * ```typescript
5668
+ * smoothing: 'strong'
5669
+ * ```
5670
+ */
5671
+ smoothing?: 'none' | 'weak' | 'strong';
5535
5672
  /**
5536
5673
  * Specifies when to depart.
5537
5674
  *
@@ -5640,7 +5777,26 @@ declare type ReachableRangeOwnParams = {
5640
5777
  *
5641
5778
  * @group Reachable Range
5642
5779
  */
5643
- declare type ReachableRangeParams = CommonServiceParams<URL, ReachableRangeResponseAPI> & CommonRoutingParams & ReachableRangeOwnParams;
5780
+ export declare type ReachableRangeParams = CommonServiceParams<ReachableRangeRequestAPI, ReachableRangeResponseAPI> & CommonRoutingParams & ReachableRangeOwnParams;
5781
+
5782
+ /**
5783
+ * @ignore
5784
+ */
5785
+ declare type ReachableRangePostData = {
5786
+ origin: {
5787
+ type: 'Point';
5788
+ coordinates: [number, number];
5789
+ };
5790
+ departureDateTime?: string;
5791
+ traffic?: string;
5792
+ vehicleMaxSpeedInKilometersPerHour?: number;
5793
+ vehicleWeightInKilograms?: number;
5794
+ };
5795
+
5796
+ /**
5797
+ * @ignore
5798
+ */
5799
+ declare type ReachableRangeRequestAPI = FetchInput<ReachableRangePostData>;
5644
5800
 
5645
5801
  /**
5646
5802
  * @ignore
@@ -5652,7 +5808,7 @@ declare type ReachableRangeResponseAPI = {
5652
5808
  };
5653
5809
  };
5654
5810
 
5655
- declare type ReachableRangeTemplate = ServiceTemplate<ReachableRangeParams, URL, ReachableRangeResponseAPI, PolygonFeature<ReachableRangeParams>>;
5811
+ declare type ReachableRangeTemplate = ServiceTemplate<ReachableRangeParams, ReachableRangeRequestAPI, ReachableRangeResponseAPI, PolygonFeature<ReachableRangeParams>>;
5656
5812
 
5657
5813
  /**
5658
5814
  * Related POI inclusion mode for search requests.
@@ -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 u,currentTypes as d,avoidableTypes as l,getPositionStrict as m,getRoutePlanningLocationType as g,inputSectionTypesWithGuidance as h,inputSectionTypes as y,indexedMagnitudes as b}from"@tomtom-org/maps-sdk/core";import{z as f}from"zod";import{isNil as S,omit as v}from"lodash-es";var x=/* @__PURE__ */(e=>(e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e))(x||{});class P extends Error{constructor(e,t,n){super(e),this.service=t,this.issues=n,Error.captureStackTrace&&Error.captureStackTrace(this,P)}}const T={[x.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[x.FORBIDDEN]:"Request failed with status code 403"};class C extends P{constructor(e,t,n){super(e,t),this.status=n,this.status&&T[this.status]&&(this.message=T[this.status])}}const R=(e,t)=>{const{data:n,message:r,status:i}=e;return new C(n?.error||n?.errorText||r,t,i)},I=(e,t,n)=>{if(e.status){const r=e;return n?n(r,t):R(r,t)}return new P(e.message,t)},w=(e,t)=>new P(e.message,t,e.issues),L=f.object({apiKey:f.string().optional().describe("TomTom API key for authentication"),commonBaseURL:f.string().optional().describe("Common base URL for all services"),customServiceBaseURL:f.string().optional().describe("Custom base URL for specific service"),language:f.string().optional().describe('Language code for response text (e.g., "en-US", "nl-NL")')});class A extends Error{constructor(e){super(e.issues.map(e=>`${e.path.length>0?`${e.path.join(".")}: `:""}${e.message}`).join("; ")),this.issues=e.issues}}const M=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?L.extend(t.schema.shape):L).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 A(n.error)})(a,r.requestValidation)}catch(p){return Promise.reject(w(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(I(p,i,r.parseResponseError))}};class k 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,k)}}const E=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 k(e.status,t,n)},F=async(e,t)=>E(await fetch(e,{headers:t})),W=async(e,t)=>E(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),j=f.array(f.array(f.number())).describe("Array of coordinate arrays representing a line string"),q=f.object({type:f.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]).describe("GeoJSON geometry type"),coordinates:f.union([f.array(f.number()),j,f.array(f.array(f.array(f.number()))),f.array(f.array(f.array(f.array(f.number()))))]).describe("Coordinate array(s) for the geometry"),radius:f.optional(f.number()).describe("Radius for Circle geometries"),radiusMeters:f.optional(f.number()).describe("Radius in meters for Circle geometries"),bbox:f.optional(f.array(f.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}).check(f.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),U=f.object({type:f.literal("Feature").describe("GeoJSON type identifier"),geometry:q.describe("GeoJSON geometry object"),id:f.optional(f.union([f.string(),f.number()])).describe("Optional feature identifier"),properties:f.any().describe("Feature properties"),bbox:f.optional(f.array(f.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),O=f.object({type:f.literal("FeatureCollection").describe("GeoJSON type identifier"),features:f.array(U).describe("Array of GeoJSON features"),id:f.optional(f.union([f.string(),f.number()])).describe("Optional collection identifier"),properties:f.any().describe("Collection properties"),bbox:f.optional(f.array(f.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),B=f.union([f.tuple([f.number().min(-180).max(180),f.number().min(-90).max(90)]),f.tuple([f.number().min(-180).max(180),f.number().min(-90).max(90),f.number()]),f.object({type:f.literal("Point"),coordinates:f.array(f.number())}),U]).describe("Geographic position as [longitude, latitude] tuple, Point geometry, or Feature"),D=f.union([f.array(f.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),f.array(f.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]"),H=f.union([q,U,O]).describe("Any GeoJSON object (Geometry, Feature, or FeatureCollection)"),K=f.union([D,H,f.array(H)]).describe("Bounding box as array, GeoJSON object, or array of GeoJSON objects"),N=f.object({query:f.string().describe("Partial search query for autocomplete suggestions")}),G=f.object({position:B.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:f.number().max(100).optional().describe("Maximum number of autocomplete suggestions to return (1-100)"),radiusMeters:f.number().optional().describe("Search radius in meters around the specified position"),countries:f.array(f.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)"),resultType:f.array(f.string()).optional().describe("Types of results to include in suggestions")}),V=N.extend(G.shape),z=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},$=(e,t,n)=>{for(const r of n||[])e.append(t,r)},_=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},J=(e,t,n)=>{!S(n)&&e.append(t,String(n))},Y=(e,t)=>{const r=n(t);r&&(e.append("lat",String(r[1])),e.append("lon",String(r[0])))},Z="/maps/orbis/places",Q=(e,t)=>{const n=e.searchParams;z(n,t),J(n,"limit",t.limit),Y(n,t.position),_(n,"fuelSet",t.fuelTypes),_(n,"idxSet",t.indexes),_(n,"brandSet",t.poiBrands),t.poiCategories&&_(n,"categorySet",t.poiCategories.map(e=>"number"!=typeof e?r[e]:e)),_(n,"connectorSet",t.connectors),_(n,"mapcodes",t.mapcodes),_(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),J(n,"minPowerKW",t.minPowerKW),J(n,"maxPowerKW",t.maxPowerKW),J(n,"view",t.view),J(n,"openingHours",t.openingHours),J(n,"timeZone",t.timeZone),J(n,"relatedPois",t.relatedPois),_(n,"entityTypeSet",t.geographyTypes)},X=e=>{const t=new URL(`${n=e,n.customServiceBaseURL||`${n.commonBaseURL}${Z}/autocomplete/${n.query}.json`}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",z(r,e),J(r,"limit",e.limit),Y(r,e.position),_(r,"countrySet",e.countries),J(r,"radius",e.radiusMeters),_(r,"resultSet",e.resultType),t},ee=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},te=e=>`${e[1]},${e[0]}`,ne=e=>{let t,n;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=ee(e.southWest),n=ee(e.northEast)),[t[0],t[1],n[0],n[1]]},re=e=>[e.lon,e.lat],ie=e=>{const{position:t,...n}=e.context.geoBias||{};return{...e,context:{...e.context,geoBias:{...t&&{position:re(t)},radiusMeters:n.radius}}}},oe={requestValidation:{schema:V},buildRequest:X,sendRequest:F,parseResponse:ie},ae=async(e,t)=>M(e,{...oe,...t},"Autocomplete"),se={autocompleteSearch:ae,buildAutocompleteSearchRequest:X,parseAutocompleteSearchResponse:ie,autocompleteSearchTemplate:oe},ce=L.extend({id:f.string().describe("Unique identifier of the EV charging station")}),pe=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}${Z}/ev/id`)(e)),n=t.searchParams;return z(n,e),n.append("id",e.id),t},ue=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",de=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},le=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,me=(e,t,n)=>{if(e)for(const r of e){const e=n.find(e=>le(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}:{}})}},ge=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>le(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},he=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)me(e.connectors,e.status,t);return t},ye=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)}},be=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,fe=e=>{const t=e.timeRanges.map(e=>({start:ye(e.startTime),end:ye(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:be(t)}},Se=e=>{const{position:t,entryPoints:n,poi:r,id:o,dist:a,boundingBox:s,chargingPark:c,...p}=e,u=c?.connectors?.map(e=>({...v(e,"connectorType"),type:e.connectorType,chargingSpeed:ue(e.ratedPowerKW)}));return{type:"Feature",geometry:i(re(t)),...s&&{bbox:ne(s)},id:o,properties:{...v(p,"viewport"),...a&&{distance:a},...n?.length&&{entryPoints:n.map(e=>({...e,position:re(e.position)}))},...u?.length&&{chargingPark:{...c,connectors:ge(u)}},...r&&{poi:{...v(r,"categorySet","openingHours"),brands:r?.brands?.map(e=>e.name)??[],categoryIds:r?.categorySet?.map(e=>e.id)??[],...r?.openingHours&&{openingHours:fe(r?.openingHours)}}}}}},ve=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:re(t)},...n}},xe=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:ue(e.ratedPowerKW)}))}))}))),chargingPointAvailability:de(t.chargingStations),connectorAvailabilities:he(t.chargingStations),...t.openingHours&&{openingHours:fe(t.openingHours)}}:void 0;var n},Pe={requestValidation:{schema:ce},buildRequest:pe,sendRequest:F,parseResponse:xe,parseResponseError:(e,t)=>{const n=e.data?.detailedError?.message??e.message;return new C(n,t,e.status)}},Te={buildEVChargingStationsAvailabilityRequest:pe,parseEVChargingStationsAvailabilityResponse:xe,evChargingStationsAvailabilityTemplate:Pe},Ce=f.object({typeahead:f.boolean().optional().describe("Enable predictive/autocomplete mode for partial input queries"),offset:f.number().max(1900).optional().describe("Starting position within result set for pagination (zero-based index)"),radiusMeters:f.number().optional().describe("Search radius in meters around the specified position"),boundingBox:K.optional().describe("Bounding box to constrain search results to a rectangular area"),countries:f.array(f.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)")}),Re=f.object({query:f.string().describe("Search query for places, addresses, or locations")}),Ie=f.object({position:B.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:f.number().max(100).optional().describe("Maximum number of results to return (1-100)"),extendedPostalCodesFor:f.array(f.string()).optional().describe("Indexes for which to include extended postal codes in results"),mapcodes:f.array(f.string()).optional().describe("Request mapcode representations for locations (Local, International, Alternative)"),view:f.enum(o).optional().describe("Geopolitical view for disputed territories"),geographyTypes:f.array(f.string()).optional().describe("Filter results to specific geography types (Country, Municipality, etc.)")}),we=Re.extend(Ie.shape),Le=L.extend(we.shape).extend(Ce.shape),Ae=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",Me=(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},ke=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${Z}/geocode`)(e)}/${e.query}.json`),n=t.searchParams;z(n,e),e.typeahead&&n.append("typeahead",String(e.typeahead)),!S(e.limit)&&n.append("limit",String(e.limit)),!S(e.offset)&&n.append("ofs",String(e.offset)),Y(n,e.position),e.countries&&n.append("countrySet",Ae(e.countries)),!S(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const r=e.boundingBox&&a(e.boundingBox);return r&&(n.append("topLeft",Ae([r[3],r[0]])),n.append("btmRight",Ae([r[1],r[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",Ae(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",Ae(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",Ae(e.geographyTypes)),t},Ee=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:o,addressRanges:a,entityType:s,id:c,...p}=e;return{type:"Feature",geometry:i(re(t)),...n&&{bbox:ne(n)},id:c,properties:{...v(p,"viewport"),...r&&{distance:r},...s&&{geographyType:s.split(",")},...o&&{entryPoints:o.map(e=>({...e,position:re(e.position)}))},...a&&{addressRanges:{...a,from:re(a.from),to:re(a.to)}}}}},Fe=e=>{const t=e.results.map(Ee),n=s(a(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}},We={requestValidation:{schema:Le},buildRequest:ke,sendRequest:F,parseResponse:Fe},je={buildGeocodingRequest:ke,parseGeocodingResponse:Fe,geocodingTemplate:We},qe=f.object({geometries:f.union([O,f.array(f.union([f.string(),U])).min(1).max(20)]).describe("GeoJSON FeatureCollection or array of geometry IDs/Features (max 20)")}),Ue=f.object({zoom:f.number().min(0).max(22).optional().describe("Zoom level for geometry data simplification (0-22)")}),Oe=qe.extend(Ue.shape),Be=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),De=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}${Z}/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:Be(t):Be(t.features),e.append("geometries",Ae(n))})(n,e.geometries),J(n,"geometriesZoom",e.zoom),t},He=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}},Ke={requestValidation:{schema:Oe},buildRequest:De,sendRequest:F,parseResponse:He},Ne={buildGeometryDataRequest:De,parseGeometryDataResponse:He,geometryDataTemplate:Ke},Ge=f.object(r),Ve=f.object({indexes:f.array(f.string()).optional().describe("Search indexes to query (Geo, PAD, Addr, Str, XStr, POI)"),poiCategories:f.array(f.union([f.number(),f.keyof(Ge)])).optional().describe("Filter results to specific POI categories"),poiBrands:f.array(f.string()).optional().describe("Filter results to specific POI brands"),connectors:f.array(f.string()).optional().describe("Filter EV charging stations by connector types"),fuelTypes:f.array(f.string()).optional().describe("Filter fuel stations by available fuel types"),openingHours:f.string().optional().describe("Request opening hours information for POIs"),timeZone:f.string().optional().describe("Request timezone information for POI locations (iana)"),relatedPois:f.string().optional().describe("Related POI inclusion mode (off, child, parent, all)"),minPowerKW:f.number().optional().describe("Minimum charging power in kilowatts for EV charging stations"),maxPowerKW:f.number().optional().describe("Maximum charging power in kilowatts for EV charging stations"),minFuzzyLevel:f.number().optional().describe("Minimum fuzzy matching level (1-4)"),mixFuzzyLevel:f.number().optional().describe("Maximum fuzzy matching level (1-4)")}),ze=we.extend(Ve.shape),$e=f.object({geometries:f.array(f.union([O,q])).describe("Array of GeoJSON geometries or FeatureCollections to search within")}),_e=ze.extend($e.shape),Je=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:te(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:Me(e.coordinates[0],50).map(e=>te(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const 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=>Je({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>Je({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>Je(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},Ye=e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${Z}/geometrySearch/${n.query}.json`}`);var n;return Q(t,e),{url:t,data:{geometryList:e.geometries.flatMap(Je)}}},Ze=e=>{const t=e.results.map(Se),n=s(a(t));return{type:"FeatureCollection",properties:{...ve(e.summary)},features:t,...n&&{bbox:n}}},Qe={requestValidation:{schema:_e},buildRequest:Ye,sendRequest:W,parseResponse:Ze},Xe=async(e,t)=>M(e,{...Qe,...t},"GeometrySearch"),et={geometrySearch:Xe,buildGeometrySearchRequest:Ye,parseGeometrySearchResponse:Ze,geometrySearchTemplate:Qe},tt=f.object({entityId:f.string().describe("Unique identifier of the place/entity to retrieve")}),nt=f.object({mapcodes:f.array(f.string()).optional().describe("Request mapcode representations for location"),view:f.enum(o).optional().describe("Geopolitical view for disputed territories"),openingHours:f.string().optional().describe("Request opening hours information for the place"),timeZone:f.string().optional().describe("Request timezone information for the place location"),relatedPois:f.string().optional().describe("Related POI inclusion mode (off, child, parent, all)")}),rt=tt.extend(nt.shape),it=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${Z}/place.json`)(e)}`),n=t.searchParams;return z(n,e),J(n,"entityId",e.entityId),_(n,"mapcodes",e.mapcodes),J(n,"view",e.view),J(n,"openingHours",e.openingHours),J(n,"timeZone",e.timeZone),J(n,"relatedPois",e.relatedPois),t},ot=e=>e.results?.length?Se(e.results[0]):void 0,at={requestValidation:{schema:rt},buildRequest:it,sendRequest:F,parseResponse:ot},st={buildPlaceByIdRequest:it,parsePlaceByIdResponse:ot,placeByIdTemplate:at},ct=f.number().positive(),pt=f.number().min(0),ut=f.number().min(0).max(100),dt=ct.optional(),lt=pt.optional(),mt=f.number().min(0).max(1).optional(),gt=f.object({speedKMH:f.number().describe("Speed in kilometers per hour"),consumptionUnitsPer100KM:f.number().describe("Consumption rate per 100 kilometers")}),ht={efficiency:f.object({acceleration:mt.describe("Acceleration efficiency factor (0-1)"),deceleration:mt.describe("Deceleration efficiency factor (0-1)"),uphill:mt.describe("Uphill efficiency factor (0-1)"),downhill:mt.describe("Downhill efficiency factor (0-1)")}).optional()},yt=f.array(gt).min(1).max(25),bt=f.object({...ht,speedsToConsumptionsLiters:yt.describe("Array of speed-to-fuel-consumption mappings in liters per 100km"),auxiliaryPowerInLitersPerHour:lt.describe("Auxiliary power consumption in liters per hour"),fuelEnergyDensityInMJoulesPerLiter:f.number().min(1).optional().describe("Fuel energy density in megajoules per liter")}),ft=f.object({...ht,speedsToConsumptionsKWH:yt.describe("Array of speed-to-energy-consumption mappings in kWh per 100km"),auxiliaryPowerInkW:lt.describe("Auxiliary power consumption in kilowatts"),consumptionInKWHPerKMAltitudeGain:f.number().max(500).optional().describe("Energy consumption per kilometer of altitude gain in kWh"),recuperationInKWHPerKMAltitudeLoss:lt.describe("Energy recuperation per kilometer of altitude loss in kWh")}),St=f.object({currentType:f.enum(d).describe("Type of electrical current (AC or DC)"),plugTypes:f.array(f.enum(u)).min(1).describe("Compatible plug/connector types"),efficiency:mt.describe("Charging efficiency factor (0-1)"),baseLoadInkW:lt.describe("Base load in kilowatts"),maxPowerInkW:lt.describe("Maximum charging power in kilowatts"),maxVoltageInV:lt.describe("Maximum voltage in volts"),maxCurrentInA:lt.describe("Maximum current in amperes"),voltageRange:f.object({minVoltageInV:lt.describe("Minimum voltage in volts"),maxVoltageInV:f.number().optional().describe("Maximum voltage in volts")}).optional().describe("Acceptable voltage range")}),vt=f.object({stateOfChargeInkWh:pt.describe("State of charge in kilowatt-hours"),maxPowerInkW:ct.describe("Maximum charging power at this state of charge in kilowatts")}),xt=f.object({maxChargeKWH:ct.describe("Maximum battery capacity in kilowatt-hours"),batteryCurve:f.array(vt).max(20).optional().describe("Battery charging curve with up to 20 data points"),chargingConnectors:f.array(St).min(1).optional().describe("Available charging connectors on the vehicle"),chargingTimeOffsetInSec:lt.describe("Time offset for charging start in seconds")}),Pt=f.object({consumption:bt.describe("Fuel consumption model for combustion engine")}),Tt=f.object({consumption:ft.describe("Energy consumption model for electric engine"),charging:xt.optional().describe("Battery and charging specifications")}),Ct=f.object({lengthMeters:dt.describe("Vehicle length in meters"),widthMeters:dt.describe("Vehicle width in meters"),heightMeters:dt.describe("Vehicle height in meters"),weightKG:dt.describe("Vehicle weight in kilograms"),axleWeightKG:dt.describe("Vehicle axle weight in kilograms")}).optional(),Rt=f.object({variantId:f.string().describe("Predefined vehicle variant identifier")}),It=f.object({dimensions:Ct.describe("Physical dimensions and weight of the vehicle"),engine:f.union([Pt,Tt]).optional().describe("Engine type and consumption characteristics")}),wt=f.union([Rt,It]).optional(),Lt=f.object({heading:f.number().min(0).max(360).optional().describe("Current vehicle heading in degrees (0-360)")}),At=Lt.extend({currentFuelInLiters:pt.describe("Current fuel level in liters")}),Mt=Lt.extend({currentChargePCT:ut.describe("Current battery charge as percentage (0-100)")}),kt=Lt.extend({currentChargeInkWh:pt.describe("Current battery charge in kilowatt-hours")}),Et=f.union([Mt,kt]),Ft=f.object({minChargeAtDestinationPCT:ut.describe("Minimum battery charge percentage required at destination (0-100)"),minChargeAtChargingStopsPCT:f.number().min(0).max(50).describe("Minimum battery charge percentage at charging stops (0-50)")}),Wt=f.object({minChargeAtDestinationInkWh:pt.describe("Minimum battery charge in kWh required at destination"),minChargeAtChargingStopsInkWh:pt.describe("Minimum battery charge in kWh at charging stops")}),jt=f.union([Ft,Wt]),qt=f.object({chargingPreferences:jt.optional().describe("Preferences for charging stops along the route")}),Ut={model:wt,restrictions:f.object({loadTypes:f.array(f.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional().describe("Types of hazardous or restricted loads being carried"),maxSpeedKMH:f.number().min(0).max(250).optional().describe("Maximum vehicle speed in kilometers per hour (0-250)"),adrCode:f.enum(["B","C","D","E"]).optional().describe("ADR tunnel restriction code for hazardous materials"),commercial:f.boolean().optional().describe("Whether the vehicle is used for commercial purposes")}).optional()},Ot=f.object({...Ut,engineType:f.undefined(),state:Lt.optional().describe("Current state of the vehicle"),preferences:f.object({}).optional().describe("Vehicle preferences")}),Bt=f.object({...Ut,engineType:f.literal("combustion").describe("Combustion engine type"),state:At.optional().describe("Current state of the combustion vehicle including fuel level"),preferences:f.object({}).optional().describe("Combustion vehicle preferences")}),Dt=f.object({...Ut,engineType:f.literal("electric").describe("Electric engine type"),state:Et.optional().describe("Current state of the electric vehicle including battery charge"),preferences:qt.optional().describe("Electric vehicle preferences including charging requirements")}),Ht=f.union([f.discriminatedUnion("engineType",[Bt,Dt]),Ot]),Kt=f.object({costModel:f.object({avoid:f.array(f.enum(l)).optional().describe("Road types and features to avoid when calculating route"),traffic:f.enum(["live","historical"]).optional().describe("Traffic consideration mode (live: real-time + historical, historical: typical patterns only)"),routeType:f.enum(["fast","short","efficient","thrilling"]).optional().describe("Route optimization strategy (fast, short, efficient, thrilling)"),thrillingParams:f.object({hilliness:f.enum(["low","normal","high"]).optional().describe("Level of hilliness for thrilling routes"),windingness:f.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:f.string().optional().describe("Travel mode (car, truck, pedestrian, bicycle)"),vehicle:Ht.optional().describe("Vehicle-specific parameters including dimensions, engine type, and consumption model"),when:f.object({option:f.enum(["departAt","arriveBy"]).describe("Whether to specify a departure or arrival time"),date:f.date().describe("The date and time to depart or arrive")}).optional().describe("Departure or arrival time specification for route planning")}),Nt=f.object({origin:B.describe("Starting position [longitude, latitude] for reachable range calculation"),budget:f.object({type:f.enum(["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"]).describe("Budget type (time, distance, or energy/fuel)"),value:f.number().min(0).describe("Budget value (depends on type: seconds, meters, liters, or kWh)")}).describe("Travel budget constraints for reachable range")}),Gt=f.object({maxFerryLengthMeters:f.number().min(0).optional().describe("Maximum ferry distance in meters to include in range")}),Vt=Kt.extend(Nt.extend(Gt.shape).shape),zt=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),$t=(e,t,n)=>{((e,t)=>{t&&(!S(t.acceleration)&&e.append("accelerationEfficiency",String(t.acceleration)),!S(t.deceleration)&&e.append("decelerationEfficiency",String(t.deceleration)),!S(t.uphill)&&e.append("uphillEfficiency",String(t.uphill)),!S(t.downhill)&&e.append("downhillEfficiency",String(t.downhill)))})(e,n.consumption.efficiency),"electric"===t?(((e,t)=>{t.speedsToConsumptionsKWH&&e.append("constantSpeedConsumptionInkWhPerHundredkm",zt(t.speedsToConsumptionsKWH)),!S(t.auxiliaryPowerInkW)&&e.append("auxiliaryPowerInkW",String(t.auxiliaryPowerInkW)),!S(t.consumptionInKWHPerKMAltitudeGain)&&e.append("consumptionInkWhPerkmAltitudeGain",String(t.consumptionInKWHPerKMAltitudeGain)),!S(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",zt(n.speedsToConsumptionsLiters)),!S(n.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(n.auxiliaryPowerInLitersPerHour)),!S(n.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(n.fuelEnergyDensityInMJoulesPerLiter))})(e,n)},_t=(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&&$t(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},Jt=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),_t(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&&($(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))},Yt=(e,t)=>{const n=t.costModel;$(e,"avoid",n?.avoid),J(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),J(e,"routeType",n?.routeType),J(e,"travelMode",t.travelMode),Jt(e,t.vehicle)},Zt=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}/routing/1/calculateReachableRange/${te(m(e.origin))}/json`)(e)),n=t.searchParams;return z(n,e),Yt(n,e),J(n,"maxFerryLengthInMeters",e.maxFerryLengthMeters),t},Qt=(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}},Xt={buildReachableRangeRequest:Zt,parseReachableRangeResponse:Qt,reachableRangeTemplate:{requestValidation:{schema:Vt},buildRequest:Zt,sendRequest:F,parseResponse:Qt}},en=e=>{const t=m(e.position),n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${Z}/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),r=n.searchParams;return z(r,e),e.allowFreeformNewline&&r.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&r.append("entityType",Ae(e.geographyType)),!S(e.heading)&&r.append("heading",String(e.heading)),e.mapcodes&&r.append("mapcodes",Ae(e.mapcodes)),e.number&&r.append("number",e.number),!S(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},tn=(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:ne(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:ee(a)},originalPosition:ee(n.position)}}}},nn=f.object({position:B.describe("Geographic position [longitude, latitude] to reverse geocode")}),rn=f.object({allowFreeformNewline:f.boolean().optional().describe("Allow newline characters in freeform address"),geographyType:f.array(f.string()).optional().describe("Filter results to specific geography types"),heading:f.number().min(-360).max(360).optional().describe("Vehicle heading in degrees (-360 to 360) for directional results"),mapcodes:f.array(f.string()).optional().describe("Request mapcode representations for location"),number:f.string().optional().describe("Street number for more precise address results"),radiusMeters:f.number().optional().describe("Search radius in meters for reverse geocoding"),returnMatchType:f.boolean().optional().describe("Include match type information in response"),returnRoadUse:f.boolean().optional().describe("Include road use information in response"),returnSpeedLimit:f.boolean().optional().describe("Include speed limit information in response"),roadUses:f.array(f.string()).optional().describe("Filter results to specific road use types"),view:f.enum(o).optional().describe("Geopolitical view for disputed territories")}),on={requestValidation:{schema:nn.extend(rn.shape)},buildRequest:en,sendRequest:F,parseResponse:tn},an={buildRevGeoRequest:en,parseRevGeoResponse:tn,reverseGeocodingTemplate:on},sn=f.union([B,q]).describe("Waypoint as position or geometry"),cn=f.union([j,U]).describe("Path as line string coordinates or feature"),pn=f.object({locations:f.array(f.union([sn,cn])).min(1).describe("Array of route locations (waypoints or paths) - minimum 2 waypoints or 1 path required")}),un=f.object({computeAdditionalTravelTimeFor:f.enum(["none","all"]).optional().describe("Calculate additional travel time estimates for different traffic scenarios (none or all)"),vehicleHeading:f.number().min(0).max(359.5).optional().describe("Vehicle heading in degrees (0-359.5) at departure"),maxAlternatives:f.number().min(0).max(5).optional().describe("Maximum number of alternative routes to calculate (0-5)"),sectionTypes:f.array(f.enum(h)).optional().describe("Types of route sections to include in response (toll, ferry, traffic, etc.)")}),dn=Kt.extend(pn.extend(un.shape).shape),ln=e=>e.vehicle?.preferences?.chargingPreferences,mn=e=>Array.isArray(e)?e:e.geometry.coordinates,gn=(e,t,n)=>((e,t)=>e.map(e=>{const n=te(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]?mn(i)[0]:m(i,{useEntryPoint:n});const o=e[e.length-1];let a;if("path"===t[t.length-1]){const e=mn(o);a=e[e.length-1]}else a=m(o,{useEntryPoint:n});return[r,a]})(e,t,n):e,n),hn=e=>({latitude:e[1],longitude:e[0]}),yn=(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 mn(e))r.push(hn(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(hn(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}}},bn=e=>{const t=e.locations.map(g),n=e.useEntryPoints??"main-when-available",r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${ln(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${gn(e.locations,t,n)}/json`),i=r.searchParams;z(i,e),"language"in e||i.append("language","en-GB"),Yt(i,e),J(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("instructionRoadShieldReferences",n.roadShieldReferences??"all"),e.append("language",t.language??"en-US")}})(i,e),!S(e.maxAlternatives)&&i.append("maxAlternatives",String(e.maxAlternatives)),((e,t,n)=>{const r=(t??(n?h:y)).map(e=>"vehicleRestricted"===e?"travelMode":e);$(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=!!ln(e);if(!r&&!i)return null;const o=e.vehicle?.model,a=o?.engine?.charging;return{...r&&yn(e.locations,t,n),...i&&a&&{chargingParameters:v(a,"maxChargeKWH")}}})(e,t,n);return o?{method:"POST",url:r,data:o}:{method:"GET",url:r}},fn=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},Sn=(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:{...v(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:fn(n.chargingCurrentType),chargingSpeed:ue(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:ue(e.chargingParkPowerInkW)}}}},vn=(e,t)=>{const n=t?.vehicle?.model?.engine?.charging?.maxChargeKWH;return{lengthInMeters:e.lengthInMeters,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,trafficDelayInSeconds:e.trafficDelayInSeconds,trafficLengthInMeters:e.trafficLengthInMeters,travelTimeInSeconds:e.travelTimeInSeconds,departureTime:new Date(e.departureTime),arrivalTime:new Date(e.arrivalTime),deviationDistanceInMeters:e.deviationDistance,fuelConsumptionInLiters:e.fuelConsumptionInLiters,...e.deviationPoint&&{deviationPoint:[e.deviationPoint.longitude,e.deviationPoint.latitude]},totalChargingTimeInSeconds:e.totalChargingTimeInSeconds,batteryConsumptionInkWh:e.batteryConsumptionInkWh,...n&&e.batteryConsumptionInkWh&&{batteryConsumptionInPCT:100*e.batteryConsumptionInkWh/n},remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...n&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/n},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:Sn(e.chargingInformationAtEndOfLeg,n)}}},xn=(e,t)=>e.reduce((e,n,r)=>{const i=0===r?0:e[r-1]?.endPointIndex;let o;return S(i)||(o=0===i?n.points?.length>0?n.points.length-1:0:i+n.points?.length),e.push({...!S(i)&&{startPointIndex:i},...o&&{endPointIndex:o},summary:vn(n.summary,t),id:c()}),e},[]),Pn=e=>({id:c(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),Tn=e=>({...Pn(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),Cn=e=>({...Pn(e),countryCodeISO3:e.countryCode}),Rn=e=>"other"===e.travelMode?Pn(e):null,In=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"]}},wn=e=>({...Pn(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:In(e),magnitudeOfDelay:b[e.magnitudeOfDelay],tec:e.tec}),Ln=e=>({...Pn(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),An=e=>({...Pn(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),Mn=e=>({...Pn(e),roadShieldReferences:e.roadShieldReferences}),kn=(e,t)=>(t[e]||(t[e]=[]),t[e]),En=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:Pn};case"COUNTRY":return{sectionType:"country",mappingFunction:Cn};case"FERRY":return{sectionType:"ferry",mappingFunction:Pn};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:Pn};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:Pn};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:Cn};case"TOLL":return{sectionType:"toll",mappingFunction:Pn};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:wn};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:Rn};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:Pn};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:Pn};case"URBAN":return{sectionType:"urban",mappingFunction:Pn};case"CARPOOL":return{sectionType:"carpool",mappingFunction:Pn};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:Pn};case"LANES":return{sectionType:"lanes",mappingFunction:Ln};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:An};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:Mn};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:Tn}}},Fn=(e,t)=>{const n={leg:xn(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const n of e){const e=En(n),r=e?.mappingFunction(n);r&&kn(e.sectionType,t).push(r)}})(e.sections,n),n},Wn=1e-4,jn=(e,t)=>Math.abs(e[0]-t[0])<Wn&&Math.abs(e[1]-t[1])<Wn,qn=(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(jn(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}},Un=(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:vn(e.summary,n),sections:Fn(e,n),...e.guidance&&{guidance:qn(e.guidance,r.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),r=a(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},On={requestValidation:{schema:dn,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:bn,sendRequest:async(e,t)=>{const n=e.method;if("GET"===n)return F(e.url,t);if("POST"===n)return W(e,t);throw new Error(`Unsupported HTTP method received: ${n}`)},parseResponse:Un,parseResponseError:(e,t)=>{const{data:n,message:r,status:i}=e;return new C(n?.error?.description??n?.detailedError?.message??r,t,i)},getAPIVersion:()=>2},Bn={reverseGeocode:an,geocode:je,geometryData:Ne,geometrySearch:et,calculateRoute:{buildCalculateRouteRequest:bn,parseCalculateRouteResponse:Un,calculateRouteTemplate:On},reachableRange:Xt,evChargingStationsAvailability:Te,placeByID:st,autocompleteSearch:se},Dn=async(e,t)=>M(e,{...Pe,...t},"EVChargingStationsAvailability"),Hn=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const n=await Dn({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 Kn(e,t){const n=[];for(const r of e.features){const e=await Hn(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:a(n)}}const Nn=e=>Boolean(e&&"availability"in e&&e.availability),Gn=async(e,t)=>M(e,{...We,...t},"Geocode"),Vn=async e=>(await Gn({query:e,limit:1})).features[0];async function zn(e,t){const n=await M(e,{...Ke,...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 $n=async(e,t)=>M(e,{...at,...t},"PlaceById"),_n=async(e,t)=>M(e,{...on,...t},"ReverseGeocode"),Jn=async(e,t)=>M(e,{...On,...t},"Routing"),Yn=f.object({minFuzzyLevel:f.number().min(1).max(4).optional().describe("Minimum fuzzy matching level (1-4, higher allows more typos)"),maxFuzzyLevel:f.number().min(1).max(4).optional().describe("Maximum fuzzy matching level (1-4, higher allows more typos)")}),Zn=ze.extend(Ce.extend(Yn.shape).shape),Qn=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:re(e.details)}};break;case"NEARBY":t={...e,details:{position:re({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},Xn={requestValidation:{schema:Zn},buildRequest:e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${Z}/search/${n.query}.json`}`);var n;Q(t,e);const r=t.searchParams;J(r,"typeahead",e.typeahead),J(r,"ofs",e.offset),_(r,"countrySet",e.countries),J(r,"radius",e.radiusMeters);const i=e.boundingBox&&a(e.boundingBox);return i&&(r.append("topLeft",Ae([i[3],i[0]])),r.append("btmRight",Ae([i[1],i[2]]))),J(r,"minFuzzyLevel",e.minFuzzyLevel),J(r,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:F,parseResponse:e=>{const t=e.results.map(Se),n=s(a(t));return{type:"FeatureCollection",properties:{...ve(e.summary),queryIntent:e.summary.queryIntent.map(Qn)},features:t,...n&&{bbox:n}}}},er=async(e,t)=>"geometries"in e?Xe(e,t):(async(e,t)=>M(e,{...Xn,...t},"FuzzySearch"))(e,t),tr=async e=>(await er({query:e,limit:1})).features[0];export{T as APIErrorCode,P as SDKError,C as SDKServiceError,ae as autocompleteSearch,I as buildResponseError,w as buildValidationError,Jn as calculateRoute,Bn as customizeService,Dn as evChargingStationsAvailability,Gn as geocode,Vn as geocodeOne,zn as geometryData,Hn as getPlaceWithEVAvailability,Kn as getPlacesWithEVAvailability,Nn as hasChargingAvailability,R as parseDefaultResponseError,$n as placeById,_n as reverseGeocode,er as search,tr as searchOne};
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 u,currentTypes as l,avoidableTypes as d,getPositionStrict as m,getRoutePlanningLocationType as g,inputSectionTypesWithGuidance as h,inputSectionTypes as y,indexedMagnitudes as b}from"@tomtom-org/maps-sdk/core";import{z as f}from"zod";import{isNil as S,omit as v}from"lodash-es";var P=/* @__PURE__ */(e=>(e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e))(P||{});class x extends Error{constructor(e,t,n){super(e),this.service=t,this.issues=n,Error.captureStackTrace&&Error.captureStackTrace(this,x)}}const C={[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 T extends x{constructor(e,t,n){super(e,t),this.status=n,this.status&&C[this.status]&&(this.message=C[this.status])}}const I=(e,t)=>{const{data:n,message:r,status:i}=e;return new T(n?.error||n?.errorText||r,t,i)},R=(e,t,n)=>{if(e.status){const r=e;return n?n(r,t):I(r,t)}return new x(e.message,t)},w=(e,t)=>new x(e.message,t,e.issues),L=f.object({apiKey:f.string().optional().describe("TomTom API key for authentication"),commonBaseURL:f.string().optional().describe("Common base URL for all services"),customServiceBaseURL:f.string().optional().describe("Custom base URL for specific service"),language:f.string().optional().describe('Language code for response text (e.g., "en-US", "nl-NL")')});class A extends Error{constructor(e){super(e.issues.map(e=>`${e.path.length>0?`${e.path.join(".")}: `:""}${e.message}`).join("; ")),this.issues=e.issues}}const M=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?L.extend(t.schema.shape):L).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 A(n.error)})(a,r.requestValidation)}catch(p){return Promise.reject(w(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(R(p,i,r.parseResponseError))}};class k 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,k)}}const E=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 k(e.status,t,n)},W=async(e,t)=>E(await fetch(e,{headers:t})),F=async(e,t)=>E(await fetch(e.url,{method:"POST",body:JSON.stringify(e.data),headers:{...t,"Content-Type":"application/json"}})),j=async(e,t)=>{const n=e.method;if("GET"===n)return W(e.url,t);if("POST"===n)return F(e,t);throw new Error(`Unsupported HTTP method received: ${n}`)},B=f.array(f.array(f.number())).describe("Array of coordinate arrays representing a line string"),q=f.object({type:f.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]).describe("GeoJSON geometry type"),coordinates:f.union([f.array(f.number()),B,f.array(f.array(f.array(f.number()))),f.array(f.array(f.array(f.array(f.number()))))]).describe("Coordinate array(s) for the geometry"),radius:f.optional(f.number()).describe("Radius for Circle geometries"),radiusMeters:f.optional(f.number()).describe("Radius in meters for Circle geometries"),bbox:f.optional(f.array(f.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}).check(f.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),U=f.object({type:f.literal("Feature").describe("GeoJSON type identifier"),geometry:q.describe("GeoJSON geometry object"),id:f.optional(f.union([f.string(),f.number()])).describe("Optional feature identifier"),properties:f.any().describe("Feature properties"),bbox:f.optional(f.array(f.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),O=f.object({type:f.literal("FeatureCollection").describe("GeoJSON type identifier"),features:f.array(U).describe("Array of GeoJSON features"),id:f.optional(f.union([f.string(),f.number()])).describe("Optional collection identifier"),properties:f.any().describe("Collection properties"),bbox:f.optional(f.array(f.number())).describe("Bounding box [minLng, minLat, maxLng, maxLat]")}),D=f.union([f.tuple([f.number().min(-180).max(180),f.number().min(-90).max(90)]),f.tuple([f.number().min(-180).max(180),f.number().min(-90).max(90),f.number()]),f.object({type:f.literal("Point"),coordinates:f.array(f.number())}),U]).describe("Geographic position as [longitude, latitude] tuple, Point geometry, or Feature"),H=f.union([f.array(f.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),f.array(f.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]"),K=f.union([q,U,O]).describe("Any GeoJSON object (Geometry, Feature, or FeatureCollection)"),N=f.union([H,K,f.array(K)]).describe("Bounding box as array, GeoJSON object, or array of GeoJSON objects"),G=f.object({query:f.string().describe("Partial search query for autocomplete suggestions")}),V=f.object({position:D.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:f.number().max(100).optional().describe("Maximum number of autocomplete suggestions to return (1-100)"),radiusMeters:f.number().optional().describe("Search radius in meters around the specified position"),countries:f.array(f.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)"),resultType:f.array(f.string()).optional().describe("Types of results to include in suggestions")}),z=G.extend(V.shape),$=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),e.append("key",t.apiKey),t.language&&e.append("language",t.language)},_=(e,t,n)=>{for(const r of n||[])e.append(t,r)},J=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},Y=(e,t,n)=>{!S(n)&&e.append(t,String(n))},Z=(e,t)=>{const r=n(t);r&&(e.append("lat",String(r[1])),e.append("lon",String(r[0])))},Q="/maps/orbis/places",X=(e,t)=>{const n=e.searchParams;$(n,t),Y(n,"limit",t.limit),Z(n,t.position),J(n,"fuelSet",t.fuelTypes),J(n,"idxSet",t.indexes),J(n,"brandSet",t.poiBrands),t.poiCategories&&J(n,"categorySet",t.poiCategories.map(e=>"number"!=typeof e?r[e]:e)),J(n,"connectorSet",t.connectors),J(n,"mapcodes",t.mapcodes),J(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),Y(n,"minPowerKW",t.minPowerKW),Y(n,"maxPowerKW",t.maxPowerKW),Y(n,"view",t.view),Y(n,"openingHours",t.openingHours),Y(n,"timeZone",t.timeZone),Y(n,"relatedPois",t.relatedPois),J(n,"entityTypeSet",t.geographyTypes)},ee=e=>{const t=new URL(`${n=e,n.customServiceBaseURL||`${n.commonBaseURL}${Q}/autocomplete/${n.query}.json`}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",$(r,e),Y(r,"limit",e.limit),Z(r,e.position),J(r,"countrySet",e.countries),Y(r,"radius",e.radiusMeters),J(r,"resultSet",e.resultType),t},te=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},ne=e=>`${e[1]},${e[0]}`,re=e=>{let t,n;return void 0!==e.topLeftPoint?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=te(e.southWest),n=te(e.northEast)),[t[0],t[1],n[0],n[1]]},ie=e=>[e.lon,e.lat],oe=e=>{const{position:t,...n}=e.context.geoBias||{};return{...e,context:{...e.context,geoBias:{...t&&{position:ie(t)},radiusMeters:n.radius}}}},ae={requestValidation:{schema:z},buildRequest:ee,sendRequest:W,parseResponse:oe},se=async(e,t)=>M(e,{...ae,...t},"Autocomplete"),ce={autocompleteSearch:se,buildAutocompleteSearchRequest:ee,parseAutocompleteSearchResponse:oe,autocompleteSearchTemplate:ae},pe=L.extend({id:f.string().describe("Unique identifier of the EV charging station")}),ue=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}${Q}/ev/id`)(e)),n=t.searchParams;return $(n,e),n.append("id",e.id),t},le=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",de=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},me=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,ge=(e,t,n)=>{if(e)for(const r of e){const e=n.find(e=>me(r,e.connector));if(e){if(e.count++,t){const n=e.statusCounts;e.statusCounts[t]=(n[t]||0)+1}}else n.push({connector:r,count:1,statusCounts:t?{[t]:1}:{}})}},he=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>me(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},ye=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)ge(e.connectors,e.status,t);return t},be=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)}},fe=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,Se=e=>{const t=e.timeRanges.map(e=>({start:be(e.startTime),end:be(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:fe(t)}},ve=e=>{const{position:t,entryPoints:n,poi:r,id:o,dist:a,boundingBox:s,chargingPark:c,...p}=e,u=c?.connectors?.map(e=>({...v(e,"connectorType"),type:e.connectorType,chargingSpeed:le(e.ratedPowerKW)}));return{type:"Feature",geometry:i(ie(t)),...s&&{bbox:re(s)},id:o,properties:{...v(p,"viewport"),...a&&{distance:a},...n?.length&&{entryPoints:n.map(e=>({...e,position:ie(e.position)}))},...u?.length&&{chargingPark:{...c,connectors:he(u)}},...r&&{poi:{...v(r,"categorySet","openingHours"),brands:r?.brands?.map(e=>e.name)??[],categoryIds:r?.categorySet?.map(e=>e.id)??[],...r?.openingHours&&{openingHours:Se(r?.openingHours)}}}}}},Pe=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:ie(t)},...n}},xe=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:le(e.ratedPowerKW)}))}))}))),chargingPointAvailability:de(t.chargingStations),connectorAvailabilities:ye(t.chargingStations),...t.openingHours&&{openingHours:Se(t.openingHours)}}:void 0;var n},Ce={requestValidation:{schema:pe},buildRequest:ue,sendRequest:W,parseResponse:xe,parseResponseError:(e,t)=>{const n=e.data?.detailedError?.message??e.message;return new T(n,t,e.status)}},Te={buildEVChargingStationsAvailabilityRequest:ue,parseEVChargingStationsAvailabilityResponse:xe,evChargingStationsAvailabilityTemplate:Ce},Ie=f.object({typeahead:f.boolean().optional().describe("Enable predictive/autocomplete mode for partial input queries"),offset:f.number().max(1900).optional().describe("Starting position within result set for pagination (zero-based index)"),radiusMeters:f.number().optional().describe("Search radius in meters around the specified position"),boundingBox:N.optional().describe("Bounding box to constrain search results to a rectangular area"),countries:f.array(f.string()).optional().describe("Country codes to restrict search results (ISO 3166-1 alpha-2)")}),Re=f.object({query:f.string().describe("Search query for places, addresses, or locations")}),we=f.object({position:D.optional().describe("Geographic position [longitude, latitude] to bias search results"),limit:f.number().max(100).optional().describe("Maximum number of results to return (1-100)"),extendedPostalCodesFor:f.array(f.string()).optional().describe("Indexes for which to include extended postal codes in results"),mapcodes:f.array(f.string()).optional().describe("Request mapcode representations for locations (Local, International, Alternative)"),view:f.enum(o).optional().describe("Geopolitical view for disputed territories"),geographyTypes:f.array(f.string()).optional().describe("Filter results to specific geography types (Country, Municipality, etc.)")}),Le=Re.extend(we.shape),Ae=L.extend(Le.shape).extend(Ie.shape),Me=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",ke=(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},Ee=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${Q}/geocode`)(e)}/${e.query}.json`),n=t.searchParams;$(n,e),e.typeahead&&n.append("typeahead",String(e.typeahead)),!S(e.limit)&&n.append("limit",String(e.limit)),!S(e.offset)&&n.append("ofs",String(e.offset)),Z(n,e.position),e.countries&&n.append("countrySet",Me(e.countries)),!S(e.radiusMeters)&&n.append("radius",String(e.radiusMeters));const r=e.boundingBox&&a(e.boundingBox);return r&&(n.append("topLeft",Me([r[3],r[0]])),n.append("btmRight",Me([r[1],r[2]]))),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",Me(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",Me(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",Me(e.geographyTypes)),t},We=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:o,addressRanges:a,entityType:s,id:c,...p}=e;return{type:"Feature",geometry:i(ie(t)),...n&&{bbox:re(n)},id:c,properties:{...v(p,"viewport"),...r&&{distance:r},...s&&{geographyType:s.split(",")},...o&&{entryPoints:o.map(e=>({...e,position:ie(e.position)}))},...a&&{addressRanges:{...a,from:ie(a.from),to:ie(a.to)}}}}},Fe=e=>{const t=e.results.map(We),n=s(a(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}},je={requestValidation:{schema:Ae},buildRequest:Ee,sendRequest:W,parseResponse:Fe},Be={buildGeocodingRequest:Ee,parseGeocodingResponse:Fe,geocodingTemplate:je},qe=f.object({geometries:f.union([O,f.array(f.union([f.string(),U])).min(1).max(20)]).describe("GeoJSON FeatureCollection or array of geometry IDs/Features (max 20)")}),Ue=f.object({zoom:f.number().min(0).max(22).optional().describe("Zoom level for geometry data simplification (0-22)")}),Oe=qe.extend(Ue.shape),De=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),He=e=>{const t=new URL((e=>e.customServiceBaseURL||`${e.commonBaseURL}${Q}/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:De(t):De(t.features),e.append("geometries",Me(n))})(n,e.geometries),Y(n,"geometriesZoom",e.zoom),t},Ke=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}},Ne={requestValidation:{schema:Oe},buildRequest:He,sendRequest:W,parseResponse:Ke},Ge={buildGeometryDataRequest:He,parseGeometryDataResponse:Ke,geometryDataTemplate:Ne},Ve=f.object(r),ze=f.object({indexes:f.array(f.string()).optional().describe("Search indexes to query (Geo, PAD, Addr, Str, XStr, POI)"),poiCategories:f.array(f.union([f.number(),f.keyof(Ve)])).optional().describe("Filter results to specific POI categories"),poiBrands:f.array(f.string()).optional().describe("Filter results to specific POI brands"),connectors:f.array(f.string()).optional().describe("Filter EV charging stations by connector types"),fuelTypes:f.array(f.string()).optional().describe("Filter fuel stations by available fuel types"),openingHours:f.string().optional().describe("Request opening hours information for POIs"),timeZone:f.string().optional().describe("Request timezone information for POI locations (iana)"),relatedPois:f.string().optional().describe("Related POI inclusion mode (off, child, parent, all)"),minPowerKW:f.number().optional().describe("Minimum charging power in kilowatts for EV charging stations"),maxPowerKW:f.number().optional().describe("Maximum charging power in kilowatts for EV charging stations"),minFuzzyLevel:f.number().optional().describe("Minimum fuzzy matching level (1-4)"),mixFuzzyLevel:f.number().optional().describe("Maximum fuzzy matching level (1-4)")}),$e=Le.extend(ze.shape),_e=f.object({geometries:f.array(f.union([O,q])).describe("Array of GeoJSON geometries or FeatureCollections to search within")}),Je=$e.extend(_e.shape),Ye=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:ne(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:ke(e.coordinates[0],50).map(e=>ne(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=>Ye({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>Ye({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>Ye(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},Ze=e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${Q}/geometrySearch/${n.query}.json`}`);var n;return X(t,e),{url:t,data:{geometryList:e.geometries.flatMap(Ye)}}},Qe=e=>{const t=e.results.map(ve),n=s(a(t));return{type:"FeatureCollection",properties:{...Pe(e.summary)},features:t,...n&&{bbox:n}}},Xe={requestValidation:{schema:Je},buildRequest:Ze,sendRequest:F,parseResponse:Qe},et=async(e,t)=>M(e,{...Xe,...t},"GeometrySearch"),tt={geometrySearch:et,buildGeometrySearchRequest:Ze,parseGeometrySearchResponse:Qe,geometrySearchTemplate:Xe},nt=f.object({entityId:f.string().describe("Unique identifier of the place/entity to retrieve")}),rt=f.object({mapcodes:f.array(f.string()).optional().describe("Request mapcode representations for location"),view:f.enum(o).optional().describe("Geopolitical view for disputed territories"),openingHours:f.string().optional().describe("Request opening hours information for the place"),timeZone:f.string().optional().describe("Request timezone information for the place location"),relatedPois:f.string().optional().describe("Related POI inclusion mode (off, child, parent, all)")}),it=nt.extend(rt.shape),ot=e=>{const t=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${Q}/place.json`)(e)}`),n=t.searchParams;return $(n,e),Y(n,"entityId",e.entityId),J(n,"mapcodes",e.mapcodes),Y(n,"view",e.view),Y(n,"openingHours",e.openingHours),Y(n,"timeZone",e.timeZone),Y(n,"relatedPois",e.relatedPois),t},at=e=>e.results?.length?ve(e.results[0]):void 0,st={requestValidation:{schema:it},buildRequest:ot,sendRequest:W,parseResponse:at},ct={buildPlaceByIdRequest:ot,parsePlaceByIdResponse:at,placeByIdTemplate:st},pt=(e,t)=>{const{data:n,message:r,status:i}=e;return new T(n?.error?.description??n?.detailedError?.message??r,t,i)},ut=f.number().positive(),lt=f.number().min(0),dt=f.number().min(0).max(100),mt=ut.optional(),gt=lt.optional(),ht=f.number().min(0).max(1).optional(),yt=f.object({speedKMH:f.number().describe("Speed in kilometers per hour"),consumptionUnitsPer100KM:f.number().describe("Consumption rate per 100 kilometers")}),bt={efficiency:f.object({acceleration:ht.describe("Acceleration efficiency factor (0-1)"),deceleration:ht.describe("Deceleration efficiency factor (0-1)"),uphill:ht.describe("Uphill efficiency factor (0-1)"),downhill:ht.describe("Downhill efficiency factor (0-1)")}).optional()},ft=f.array(yt).min(1).max(25),St=f.object({...bt,speedsToConsumptionsLiters:ft.describe("Array of speed-to-fuel-consumption mappings in liters per 100km"),auxiliaryPowerInLitersPerHour:gt.describe("Auxiliary power consumption in liters per hour"),fuelEnergyDensityInMJoulesPerLiter:f.number().min(1).optional().describe("Fuel energy density in megajoules per liter")}),vt=f.object({...bt,speedsToConsumptionsKWH:ft.describe("Array of speed-to-energy-consumption mappings in kWh per 100km"),auxiliaryPowerInkW:gt.describe("Auxiliary power consumption in kilowatts"),consumptionInKWHPerKMAltitudeGain:f.number().max(500).optional().describe("Energy consumption per kilometer of altitude gain in kWh"),recuperationInKWHPerKMAltitudeLoss:gt.describe("Energy recuperation per kilometer of altitude loss in kWh")}),Pt=f.object({currentType:f.enum(l).describe("Type of electrical current (AC or DC)"),plugTypes:f.array(f.enum(u)).min(1).describe("Compatible plug/connector types"),efficiency:ht.describe("Charging efficiency factor (0-1)"),baseLoadInkW:gt.describe("Base load in kilowatts"),maxPowerInkW:gt.describe("Maximum charging power in kilowatts"),maxVoltageInV:gt.describe("Maximum voltage in volts"),maxCurrentInA:gt.describe("Maximum current in amperes"),voltageRange:f.object({minVoltageInV:gt.describe("Minimum voltage in volts"),maxVoltageInV:f.number().optional().describe("Maximum voltage in volts")}).optional().describe("Acceptable voltage range")}),xt=f.object({stateOfChargeInkWh:lt.describe("State of charge in kilowatt-hours"),maxPowerInkW:ut.describe("Maximum charging power at this state of charge in kilowatts")}),Ct=f.object({maxChargeKWH:ut.describe("Maximum battery capacity in kilowatt-hours"),batteryCurve:f.array(xt).max(20).optional().describe("Battery charging curve with up to 20 data points"),chargingConnectors:f.array(Pt).min(1).optional().describe("Available charging connectors on the vehicle"),chargingTimeOffsetInSec:gt.describe("Time offset for charging start in seconds")}),Tt=f.object({consumption:St.describe("Fuel consumption model for combustion engine")}),It=f.object({consumption:vt.describe("Energy consumption model for electric engine"),charging:Ct.optional().describe("Battery and charging specifications")}),Rt=f.object({lengthMeters:mt.describe("Vehicle length in meters"),widthMeters:mt.describe("Vehicle width in meters"),heightMeters:mt.describe("Vehicle height in meters"),weightKG:mt.describe("Vehicle weight in kilograms"),axleWeightKG:mt.describe("Vehicle axle weight in kilograms")}).optional(),wt=f.object({variantId:f.string().describe("Predefined vehicle variant identifier")}),Lt=f.object({dimensions:Rt.describe("Physical dimensions and weight of the vehicle"),engine:f.union([Tt,It]).optional().describe("Engine type and consumption characteristics")}),At=f.union([wt,Lt]).optional(),Mt=f.object({heading:f.number().min(0).max(360).optional().describe("Current vehicle heading in degrees (0-360)")}),kt=Mt.extend({currentFuelInLiters:lt.describe("Current fuel level in liters")}),Et=Mt.extend({currentChargePCT:dt.describe("Current battery charge as percentage (0-100)")}),Wt=Mt.extend({currentChargeInkWh:lt.describe("Current battery charge in kilowatt-hours")}),Ft=f.union([Et,Wt]),jt=f.object({minChargeAtDestinationPCT:dt.describe("Minimum battery charge percentage required at destination (0-100)"),minChargeAtChargingStopsPCT:f.number().min(0).max(50).describe("Minimum battery charge percentage at charging stops (0-50)")}),Bt=f.object({minChargeAtDestinationInkWh:lt.describe("Minimum battery charge in kWh required at destination"),minChargeAtChargingStopsInkWh:lt.describe("Minimum battery charge in kWh at charging stops")}),qt=f.union([jt,Bt]),Ut=f.object({chargingPreferences:qt.optional().describe("Preferences for charging stops along the route")}),Ot={model:At,restrictions:f.object({loadTypes:f.array(f.enum(["USHazmatClass1","USHazmatClass2","USHazmatClass3","USHazmatClass4","USHazmatClass5","USHazmatClass6","USHazmatClass7","USHazmatClass8","USHazmatClass9","otherHazmatExplosive","otherHazmatGeneral","otherHazmatHarmfulToWater"])).optional().describe("Types of hazardous or restricted loads being carried"),maxSpeedKMH:f.number().min(0).max(250).optional().describe("Maximum vehicle speed in kilometers per hour (0-250)"),adrCode:f.enum(["B","C","D","E"]).optional().describe("ADR tunnel restriction code for hazardous materials"),commercial:f.boolean().optional().describe("Whether the vehicle is used for commercial purposes")}).optional()},Dt=f.object({...Ot,engineType:f.undefined(),state:Mt.optional().describe("Current state of the vehicle"),preferences:f.object({}).optional().describe("Vehicle preferences")}),Ht=f.object({...Ot,engineType:f.literal("combustion").describe("Combustion engine type"),state:kt.optional().describe("Current state of the combustion vehicle including fuel level"),preferences:f.object({}).optional().describe("Combustion vehicle preferences")}),Kt=f.object({...Ot,engineType:f.literal("electric").describe("Electric engine type"),state:Ft.optional().describe("Current state of the electric vehicle including battery charge"),preferences:Ut.optional().describe("Electric vehicle preferences including charging requirements")}),Nt=f.union([f.discriminatedUnion("engineType",[Ht,Kt]),Dt]),Gt=f.object({costModel:f.object({avoid:f.array(f.enum(d)).optional().describe("Road types and features to avoid when calculating route"),traffic:f.enum(["live","historical"]).optional().describe("Traffic consideration mode (live: real-time + historical, historical: typical patterns only)"),routeType:f.enum(["fast","short","efficient","thrilling"]).optional().describe("Route optimization strategy (fast, short, efficient, thrilling)"),thrillingParams:f.object({hilliness:f.enum(["low","normal","high"]).optional().describe("Level of hilliness for thrilling routes"),windingness:f.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:f.string().optional().describe("Travel mode (car, truck, pedestrian, bicycle)"),vehicle:Nt.optional().describe("Vehicle-specific parameters including dimensions, engine type, and consumption model"),when:f.object({option:f.enum(["departAt","arriveBy"]).describe("Whether to specify a departure or arrival time"),date:f.date().describe("The date and time to depart or arrive")}).optional().describe("Departure or arrival time specification for route planning")}),Vt=["timeMinutes","remainingChargeCPT","spentChargePCT","spentFuelLiters","distanceKM"],zt=f.object({origin:D.describe("Starting position [longitude, latitude] for reachable range calculation"),budget:f.object({type:f.enum(Vt).describe("Budget type (time, distance, or energy/fuel)"),value:f.number().min(0).describe("Budget value (depends on type: seconds, meters, liters, or kWh)")}).describe("Travel budget constraints for reachable range")}),$t=f.object({maxFerryLengthMeters:f.number().min(0).optional().describe("Maximum ferry distance in meters to include in range"),smoothing:f.enum(["none","weak","strong"]).optional().describe("Post-processing smoothing level for the polygon boundary")}),_t=Gt.extend(zt.extend($t.shape).shape),Jt=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),Yt=(e,t,n)=>{((e,t)=>{t&&(!S(t.acceleration)&&e.append("accelerationEfficiency",String(t.acceleration)),!S(t.deceleration)&&e.append("decelerationEfficiency",String(t.deceleration)),!S(t.uphill)&&e.append("uphillEfficiency",String(t.uphill)),!S(t.downhill)&&e.append("downhillEfficiency",String(t.downhill)))})(e,n.consumption.efficiency),"electric"===t?(((e,t)=>{t.speedsToConsumptionsKWH&&e.append("constantSpeedConsumptionInkWhPerHundredkm",Jt(t.speedsToConsumptionsKWH)),!S(t.auxiliaryPowerInkW)&&e.append("auxiliaryPowerInkW",String(t.auxiliaryPowerInkW)),!S(t.consumptionInKWHPerKMAltitudeGain)&&e.append("consumptionInkWhPerkmAltitudeGain",String(t.consumptionInKWHPerKMAltitudeGain)),!S(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",Jt(n.speedsToConsumptionsLiters)),!S(n.auxiliaryPowerInLitersPerHour)&&e.append("auxiliaryPowerInLitersPerHour",String(n.auxiliaryPowerInLitersPerHour)),!S(n.fuelEnergyDensityInMJoulesPerLiter)&&e.append("fuelEnergyDensityInMJoulesPerLiter",String(n.fuelEnergyDensityInMJoulesPerLiter))})(e,n)},Zt=(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&&Yt(e,"engineType"in t?t.engineType:void 0,t.model.engine)))},Qt=(e,t)=>{t&&("electric"===t.engineType&&e.append("vehicleEngineType","electric"),Zt(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&&(_(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))},Xt=(e,t)=>{const n=t.costModel;_(e,"avoid",n?.avoid),Y(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),Y(e,"routeType",n?.routeType),Y(e,"travelMode",t.travelMode),Qt(e,t.vehicle)},en=e=>{const t=e.vehicle;if(t?.model&&"engine"in t.model)return t.model.engine?.charging?.maxChargeKWH},tn=(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=en(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=en(e);if(null!=t)return t*n.currentChargePCT/100}})(t),i=en(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())}},nn=e=>{const t=m(e.origin);return{origin:{type:"Point",coordinates:[t[0],t[1]]}}},rn=e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`)(e)),n=t.searchParams;return $(n,e),n.delete("language"),Xt(n,e),tn(n,e),Y(n,"maxFerryLengthInMeters",e.maxFerryLengthMeters),Y(n,"smoothing",e.smoothing),{method:"POST",url:t,data:nn(e)}},on=(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}},an={requestValidation:{schema:_t},buildRequest:rn,sendRequest:j,parseResponse:on,parseResponseError:pt,getAPIVersion:()=>3},sn={buildReachableRangeRequest:rn,parseReachableRangeResponse:on,reachableRangeTemplate:an},cn=e=>{const t=m(e.position),n=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}${Q}/reverseGeocode`)(e)}/${t[1]},${t[0]}.json`),r=n.searchParams;return $(r,e),e.allowFreeformNewline&&r.append("allowFreeformNewline",String(e.allowFreeformNewline)),e.geographyType&&r.append("entityType",Me(e.geographyType)),!S(e.heading)&&r.append("heading",String(e.heading)),e.mapcodes&&r.append("mapcodes",Me(e.mapcodes)),e.number&&r.append("number",e.number),!S(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},pn=(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:re(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:te(a)},originalPosition:te(n.position)}}}},un=f.object({position:D.describe("Geographic position [longitude, latitude] to reverse geocode")}),ln=f.object({allowFreeformNewline:f.boolean().optional().describe("Allow newline characters in freeform address"),geographyType:f.array(f.string()).optional().describe("Filter results to specific geography types"),heading:f.number().min(-360).max(360).optional().describe("Vehicle heading in degrees (-360 to 360) for directional results"),mapcodes:f.array(f.string()).optional().describe("Request mapcode representations for location"),number:f.string().optional().describe("Street number for more precise address results"),radiusMeters:f.number().optional().describe("Search radius in meters for reverse geocoding"),returnMatchType:f.boolean().optional().describe("Include match type information in response"),returnRoadUse:f.boolean().optional().describe("Include road use information in response"),returnSpeedLimit:f.boolean().optional().describe("Include speed limit information in response"),roadUses:f.array(f.string()).optional().describe("Filter results to specific road use types"),view:f.enum(o).optional().describe("Geopolitical view for disputed territories")}),dn={requestValidation:{schema:un.extend(ln.shape)},buildRequest:cn,sendRequest:W,parseResponse:pn},mn={buildRevGeoRequest:cn,parseRevGeoResponse:pn,reverseGeocodingTemplate:dn},gn=f.union([D,q]).describe("Waypoint as position or geometry"),hn=f.union([B,U]).describe("Path as line string coordinates or feature"),yn=f.object({locations:f.array(f.union([gn,hn])).min(1).describe("Array of route locations (waypoints or paths) - minimum 2 waypoints or 1 path required")}),bn=f.object({computeAdditionalTravelTimeFor:f.enum(["none","all"]).optional().describe("Calculate additional travel time estimates for different traffic scenarios (none or all)"),vehicleHeading:f.number().min(0).max(359.5).optional().describe("Vehicle heading in degrees (0-359.5) at departure"),maxAlternatives:f.number().min(0).max(5).optional().describe("Maximum number of alternative routes to calculate (0-5)"),sectionTypes:f.array(f.enum(h)).optional().describe("Types of route sections to include in response (toll, ferry, traffic, etc.)")}),fn=Gt.extend(yn.extend(bn.shape).shape),Sn=e=>e.vehicle?.preferences?.chargingPreferences,vn=e=>Array.isArray(e)?e:e.geometry.coordinates,Pn=(e,t,n)=>((e,t)=>e.map(e=>{const n=ne(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]?vn(i)[0]:m(i,{useEntryPoint:n});const o=e[e.length-1];let a;if("path"===t[t.length-1]){const e=vn(o);a=e[e.length-1]}else a=m(o,{useEntryPoint:n});return[r,a]})(e,t,n):e,n),xn=e=>({latitude:e[1],longitude:e[0]}),Cn=(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 vn(e))r.push(xn(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(xn(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}}},Tn=e=>{const t=e.locations.map(g),n=e.useEntryPoints??"main-when-available",r=new URL(`${(e=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/routing/${Sn(e)?"calculateLongDistanceEVRoute":"calculateRoute"}`)(e)}/${Pn(e.locations,t,n)}/json`),i=r.searchParams;$(i,e),"language"in e||i.append("language","en-GB"),Xt(i,e),Y(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),!S(e.maxAlternatives)&&i.append("maxAlternatives",String(e.maxAlternatives)),((e,t,n)=>{const r=(t??(n?h:y)).map(e=>"vehicleRestricted"===e?"travelMode":e);_(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=!!Sn(e);if(!r&&!i)return null;const o=e.vehicle?.model,a=o?.engine?.charging;return{...r&&Cn(e.locations,t,n),...i&&a&&{chargingParameters:v(a,"maxChargeKWH")}}})(e,t,n);return o?{method:"POST",url:r,data:o}:{method:"GET",url:r}},In=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},Rn=(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:{...v(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:In(n.chargingCurrentType),chargingSpeed:le(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:le(e.chargingParkPowerInkW)}}}},wn=(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:Rn(e.chargingInformationAtEndOfLeg,n)}}},Ln=(e,t)=>e.reduce((e,n,r)=>{const i=0===r?0:e[r-1]?.endPointIndex;let o;return S(i)||(o=0===i?n.points?.length>0?n.points.length-1:0:i+n.points?.length),e.push({...!S(i)&&{startPointIndex:i},...o&&{endPointIndex:o},summary:wn(n.summary,t),id:c()}),e},[]),An=e=>({id:c(),startPointIndex:e.startPointIndex,endPointIndex:e.endPointIndex}),Mn=e=>({...An(e),index:e.importantRoadStretchIndex,streetName:e.streetName?.text,roadNumbers:e.roadNumbers?.map(e=>e.text)}),kn=e=>({...An(e),countryCodeISO3:e.countryCode}),En=e=>"other"===e.travelMode?An(e):null,Wn=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"]}},Fn=e=>({...An(e),delayInSeconds:e.delayInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKmh,categories:Wn(e),magnitudeOfDelay:b[e.magnitudeOfDelay],tec:e.tec}),jn=e=>({...An(e),lanes:e.lanes,laneSeparators:e.laneSeparators,properties:e.properties}),Bn=e=>({...An(e),maxSpeedLimitInKmh:e.maxSpeedLimitInKmh}),qn=e=>({...An(e),roadShieldReferences:e.roadShieldReferences}),Un=(e,t)=>(t[e]||(t[e]=[]),t[e]),On=e=>{switch(e.sectionType){case"CAR_TRAIN":return{sectionType:"carTrain",mappingFunction:An};case"COUNTRY":return{sectionType:"country",mappingFunction:kn};case"FERRY":return{sectionType:"ferry",mappingFunction:An};case"MOTORWAY":return{sectionType:"motorway",mappingFunction:An};case"PEDESTRIAN":return{sectionType:"pedestrian",mappingFunction:An};case"TOLL_VIGNETTE":return{sectionType:"tollVignette",mappingFunction:kn};case"TOLL":return{sectionType:"toll",mappingFunction:An};case"TRAFFIC":return{sectionType:"traffic",mappingFunction:Fn};case"TRAVEL_MODE":return{sectionType:"vehicleRestricted",mappingFunction:En};case"TUNNEL":return{sectionType:"tunnel",mappingFunction:An};case"UNPAVED":return{sectionType:"unpaved",mappingFunction:An};case"URBAN":return{sectionType:"urban",mappingFunction:An};case"CARPOOL":return{sectionType:"carpool",mappingFunction:An};case"LOW_EMISSION_ZONE":return{sectionType:"lowEmissionZone",mappingFunction:An};case"LANES":return{sectionType:"lanes",mappingFunction:jn};case"SPEED_LIMIT":return{sectionType:"speedLimit",mappingFunction:Bn};case"ROAD_SHIELDS":return{sectionType:"roadShields",mappingFunction:qn};case"IMPORTANT_ROAD_STRETCH":return{sectionType:"importantRoadStretch",mappingFunction:Mn}}},Dn=(e,t)=>{const n={leg:Ln(e.legs,t)};return((e,t)=>{if(Array.isArray(e))for(const n of e){const e=On(n),r=e?.mappingFunction(n);r&&Un(e.sectionType,t).push(r)}})(e.sections,n),n},Hn=1e-4,Kn=(e,t)=>Math.abs(e[0]-t[0])<Hn&&Math.abs(e[1]-t[1])<Hn,Nn=(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(Kn(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}},Gn=(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:wn(e.summary,n),sections:Dn(e,n),...e.guidance&&{guidance:Nn(e.guidance,r.coordinates)},...e.progress&&{progress:e.progress}}}})(e,n,t)),r=a(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},Vn={requestValidation:{schema:fn,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:Tn,sendRequest:j,parseResponse:Gn,parseResponseError:pt,getAPIVersion:()=>2},zn={reverseGeocode:mn,geocode:Be,geometryData:Ge,geometrySearch:tt,calculateRoute:{buildCalculateRouteRequest:Tn,parseCalculateRouteResponse:Gn,calculateRouteTemplate:Vn},reachableRange:sn,evChargingStationsAvailability:Te,placeByID:ct,autocompleteSearch:ce},$n=async(e,t)=>M(e,{...Ce,...t},"EVChargingStationsAvailability"),_n=async e=>{const t=e.properties.dataSources?.chargingAvailability?.id;if(t)try{const n=await $n({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 Jn(e,t){const n=[];for(const r of e.features){const e=await _n(r);e?n.push(e):t?.excludeIfAvailabilityUnknown||n.push(r)}return{...e,features:n,bbox:a(n)}}const Yn=e=>Boolean(e&&"availability"in e&&e.availability),Zn=async(e,t)=>M(e,{...je,...t},"Geocode"),Qn=async e=>(await Zn({query:e,limit:1})).features[0];async function Xn(e,t){const n=await M(e,{...Ne,...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 er=async(e,t)=>M(e,{...st,...t},"PlaceById"),tr=async(e,t)=>M(e,{...an,...t},"Reachable Range"),nr=async(e,t,n)=>{const r=[];for(const a of e){t?.signal?.throwIfAborted();try{r.push(await tr(a,n))}catch(o){if(!(o instanceof T)||403===o.status||429===o.status)throw o}}const i=a(r);return{type:"FeatureCollection",...i&&{bbox:i},features:r}},rr=async(e,t)=>M(e,{...dn,...t},"ReverseGeocode"),ir=async(e,t)=>M(e,{...Vn,...t},"Routing"),or=f.object({minFuzzyLevel:f.number().min(1).max(4).optional().describe("Minimum fuzzy matching level (1-4, higher allows more typos)"),maxFuzzyLevel:f.number().min(1).max(4).optional().describe("Maximum fuzzy matching level (1-4, higher allows more typos)")}),ar=$e.extend(Ie.extend(or.shape).shape),sr=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:ie(e.details)}};break;case"NEARBY":t={...e,details:{position:ie({lon:e.details.lon,lat:e.details.lat}),text:e.details.text,query:e.details.query}};break;case"BOOKMARK":case"W3W":t=e}return t},cr={requestValidation:{schema:ar},buildRequest:e=>{const t=new URL(`${n=e,n.customServiceBaseURL??`${n.commonBaseURL}${Q}/search/${n.query}.json`}`);var n;X(t,e);const r=t.searchParams;Y(r,"typeahead",e.typeahead),Y(r,"ofs",e.offset),J(r,"countrySet",e.countries),Y(r,"radius",e.radiusMeters);const i=e.boundingBox&&a(e.boundingBox);return i&&(r.append("topLeft",Me([i[3],i[0]])),r.append("btmRight",Me([i[1],i[2]]))),Y(r,"minFuzzyLevel",e.minFuzzyLevel),Y(r,"maxFuzzyLevel",e.maxFuzzyLevel),t},sendRequest:W,parseResponse:e=>{const t=e.results.map(ve),n=s(a(t));return{type:"FeatureCollection",properties:{...Pe(e.summary),queryIntent:e.summary.queryIntent.map(sr)},features:t,...n&&{bbox:n}}}},pr=async(e,t)=>"geometries"in e?et(e,t):(async(e,t)=>M(e,{...cr,...t},"FuzzySearch"))(e,t),ur=async e=>(await pr({query:e,limit:1})).features[0];export{C as APIErrorCode,x as SDKError,T as SDKServiceError,se as autocompleteSearch,Vt as budgetTypes,R as buildResponseError,w as buildValidationError,tr as calculateReachableRange,nr as calculateReachableRanges,ir as calculateRoute,zn as customizeService,$n as evChargingStationsAvailability,Zn as geocode,Qn as geocodeOne,Xn as geometryData,_n as getPlaceWithEVAvailability,Jn as getPlacesWithEVAvailability,Yn as hasChargingAvailability,I as parseDefaultResponseError,er as placeById,rr as reverseGeocode,pr as search,ur as searchOne};
2
2
  //# sourceMappingURL=services.es.js.map