@tomtom-org/maps-sdk 1.0.0-rc.2 → 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +391 -0
- package/README.md +7 -3
- package/THIRD_PARTY.txt +2 -2
- package/core/dist/core.es.js +1 -1
- package/core/dist/index.d.ts +3134 -2280
- package/core/package.json +1 -1
- package/map/dist/THIRD_PARTY.txt +1 -1
- package/map/dist/chunks/maplibre-gl-DudBHU-O.js +1 -0
- package/map/dist/index.d.ts +3927 -2659
- package/map/dist/map.es.js +3 -1
- package/map/dist/third-party.json +1 -1
- package/package.json +8 -22
- package/services/dist/THIRD_PARTY.txt +1 -1
- package/services/dist/index.d.ts +2415 -2354
- package/services/dist/services.es.js +1 -1
- package/services/dist/third-party.json +1 -1
- package/map/dist/chunks/maplibre-gl-Dp2tuNKx.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TomTomConfig,areaAnalyticsMetricKeys,avoidableTypes,bboxFromCoordsArray,bboxFromGeoJSON,bboxOnlyIfWithArea,budgetTypes,canRetrySDKErrorCode,connectorTypes,generateId,generateTomTomHeaders,geographyTypes,geopoliticalViews,getPosition,getPositionStrict,getRoutePlanningLocationType,inputSectionTypesWithGuidance,insecureBaseURLMessage,isProxyCredentialsMode,isSecureBaseURL,mergeFromGlobal,poiCategories,poiCategoriesToID,poiIDsToCategories,sdkErrorCodeForStatus,toPointGeometry,trafficIncidentRequestCategories,trafficIncidentTimeValidities}from"@tomtom-org/maps-sdk/core";import{z}from"zod";import{castArray,compact,countBy,isEmpty,isNil,maxBy,minBy,omit,partition,pick,uniq,uniqBy,zip}from"lodash-es";import{bbox,booleanIntersects,distance}from"@turf/turf";var fetchFirstPlace=async(e,t,a)=>{const o="string"==typeof t?{query:t}:t,[r]=(await a({...o,limit:1})).features;if(!r)throw new Error(`${e}: no results found for "${o.query}"`);return r},FetchError=class e extends Error{constructor(t,a,o){super(a??`HTTP Error ${t}`),this.name="FetchError",this.status=t,this.data=o,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},NetworkError=class extends Error{constructor(e){super(e instanceof Error?e.message:"Network request failed",{cause:e}),this.name="NetworkError"}},fetchOrNetworkError=(e,t)=>fetch(e,t).catch(e=>{throw t.signal?.aborted?e:new NetworkError(e)}),returnOrThrow=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,a;const o=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:o?.includes("application/json")?(a=await e.json(),t=a?.errorText??a?.message??a?.detailedError?.message):o?.includes("text/xml")&&(a=await e.text(),t=e.statusText),new FetchError(e.status,t,a)},sleep=(e,t)=>new Promise((a,o)=>{if(t?.aborted)return void o(t.reason);const r=()=>{clearTimeout(n),o(t?.reason)},n=setTimeout(()=>{t?.removeEventListener("abort",r),a()},e);t?.addEventListener("abort",r,{once:!0})}),fetchWithRetry=async(e,t)=>{const a=TomTomConfig.instance.get().retry;if(!a)return e();const{initialWaitMs:o,backoffFactor:r,timeoutMs:n}=a,i=Date.now();let s=o,c=await e();for(;429===c.status;){const a=Number.parseInt(c.headers.get("retry-after")??"",10),o=Number.isFinite(a)?1e3*a:s;if(Date.now()-i+o>n)break;await c.text().catch(()=>{}),await sleep(o,t),s*=r,c=await e()}return c},proxyModeCredentials=()=>isProxyCredentialsMode()?"include":void 0,get=async(e,t,a)=>returnOrThrow(await fetchWithRetry(()=>{const o=proxyModeCredentials(),{url:r,headers:n}=e instanceof URL?{url:e,headers:void 0}:e,i={headers:{...t,...n}};return o&&(i.credentials=o),a?.signal&&(i.signal=a.signal),fetchOrNetworkError(r,i)},a?.signal)),post=async(e,t,a)=>returnOrThrow(await fetchWithRetry(()=>{const o=proxyModeCredentials(),r={method:"POST",body:JSON.stringify(e.data),headers:{...t,...e.headers,"Content-Type":"application/json"}};return o&&(r.credentials=o),a?.signal&&(r.signal=a.signal),fetchOrNetworkError(e.url,r)},a?.signal)),fetchWith=async(e,t,a)=>{if("GET"===e.method)return get(e,t,a);if("POST"===e.method)return post(e,t,a);throw new Error(`Unsupported HTTP method received: ${e.method}`)},APICode=/* @__PURE__ */function(e){return e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e}({}),SDKError=class e extends Error{constructor(t,a,o){super(t,"cause"in o?{cause:o.cause}:void 0),this.service=a,this.sdkVersion="1.0.0-rc.2",this.code=o.code,this.canRetry=canRetrySDKErrorCode(o.code),this.issues=o.issues,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},APIErrorCode={[APICode.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)"},SDKServiceError=class extends SDKError{constructor(e,t,a,o){super(e,t,{code:a?sdkErrorCodeForStatus(a):"INTERNAL"}),this.status=a,this.apiErrorCode=o?.apiErrorCode,this.privatePreviewAccess=o?.privatePreviewAccess,this.status&&APIErrorCode[this.status]&&(this.message=APIErrorCode[this.status])}},SDKAbortError=class extends SDKError{constructor(e,t){super("The operation was aborted.",e,{code:"ABORTED",cause:t}),this.name="AbortError"}},buildResponseError=(e,t,a,o)=>{if(o?.aborted&&e===o.reason)return new SDKAbortError(t,o.reason);if(o?.aborted&&"AbortError"===e?.name)return new SDKAbortError(t,o.reason);if(e.status){const o=e;return a?a(o,t):((e,t)=>{const{data:a,message:o,status:r}=e;return new SDKServiceError(a?.error||a?.errorText||o,t,r,{apiErrorCode:a?.detailedError?.code})})(o,t)}return new SDKError(e.message,t,e instanceof NetworkError?{code:"NETWORK_NOT_AVAILABLE",cause:e.cause}:{code:"INTERNAL",cause:e})},commonServiceRequestSchema=z.object({apiKey:z.string().optional(),commonBaseURL:z.string().optional(),language:z.string().optional()}),formatZodIssue=(e,t=0)=>{const a=e.path.length>0?`${e.path.join(".")}: `:"";if("invalid_union"===e.code){const o=e.unionErrors;if(o?.length)return`${a}no matching union member (${o.map((e,a)=>`option[${a}]: { ${e.issues.map(e=>formatZodIssue(e,t+1)).join(", ")} }`).join(" | ")})`}return`${a}${e.message}`},ValidationError=class extends Error{constructor(e){super(`${e.issues.map(e=>formatZodIssue(e)).join("; ")}\nIssues: ${JSON.stringify(e.issues,null,2)}`),this.issues=e.issues}},callService=async(e,t,a)=>{if(e.signal?.aborted)throw new SDKAbortError(a,e.signal.reason);const o={...mergeFromGlobal(e),apiVersion:t.apiVersion??1};if(!isSecureBaseURL(o.commonBaseURL))throw new SDKError(insecureBaseURLMessage(o.commonBaseURL),a,{code:"INSECURE_BASE_URL"});if(void 0===e.validateRequest||e.validateRequest)try{((e,t)=>{const a=(t?.schema?commonServiceRequestSchema.extend(t.schema.shape):commonServiceRequestSchema).superRefine((e,a)=>{if("commonBaseURL"in e||a.addIssue({code:"custom",message:"commonBaseURL is required"}),t?.refinements?.length)for(const o of t.refinements)o.check(e)||a.addIssue({code:"custom",message:o.message})}).safeParse(e);if(!a.success)throw new ValidationError(a.error)})(o,t.requestValidation)}catch(i){throw((e,t)=>new SDKError(e.message,t,{code:"INVALID_REQUEST",issues:e.issues}))(i,a)}const r=t.buildRequest(o),n=generateTomTomHeaders(o);e.onAPIRequest?.(r);try{const a=await t.sendRequest(r,n,{signal:e.signal});return e.onAPIResponse?.(r,a),t.parseResponse(await a.data,o)}catch(i){e.onAPIResponse?.(r,i);const o=buildResponseError(i,a,t.parseResponseError,e.signal),{releaseStage:n}=t;throw"private-preview"===n?.stage?((e,t)=>{if(!(e instanceof SDKServiceError&&"INSUFFICIENT_PERMISSIONS"===e.code)||void 0!==e.apiErrorCode&&"Forbidden"!==e.apiErrorCode)return e;const{product:a,requestAccessURL:o}=t;return new SDKServiceError(`${e.message}. ${a} is in Private Preview (https://docs.tomtom.com/legal/private-preview), and the API key needs access to it: request it from TomTom Sales at ${o}`,e.service,e.status,{apiErrorCode:e.apiErrorCode,privatePreviewAccess:t})})(o,n.access):o}},searchCursorStateSchema=z.object({ofs:z.number().int().nonnegative()}),CURSOR_ERROR_MESSAGE="The `cursor` is not one this SDK can read. Pass back the `nextCursor` from a previous response rather than constructing one.",readCursorState=e=>searchCursorStateSchema.safeParse((e=>{try{return JSON.parse(atob(e))}catch{return}})(e)).data,searchCursorSchema=z.string().refine(e=>!!readCursorState(e),CURSOR_ERROR_MESSAGE),appendSearchCursorParam=(e,t,a)=>{void 0!==t&&e.append("ofs",String(((e,t)=>{const a=readCursorState(e);if(!a)throw new SDKError(CURSOR_ERROR_MESSAGE,t,{code:"INVALID_REQUEST"});return a.ofs})(t,a)))},lineStringCoordsSchema=z.array(z.array(z.number())),geometrySchema$1=z.object({type:z.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]),coordinates:z.union([z.array(z.number()),lineStringCoordsSchema,z.array(z.array(z.array(z.number()))),z.array(z.array(z.array(z.array(z.number()))))]),radius:z.optional(z.number()),radiusMeters:z.optional(z.number()),bbox:z.optional(z.array(z.number()))}).check(z.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),featureSchema=z.object({type:z.literal("Feature"),geometry:geometrySchema$1,id:z.optional(z.union([z.string(),z.number()])),properties:z.unknown().optional(),bbox:z.optional(z.array(z.number()))}),featureCollectionSchema=z.object({type:z.literal("FeatureCollection"),features:z.array(featureSchema),id:z.optional(z.union([z.string(),z.number()])),properties:z.unknown().optional(),bbox:z.optional(z.array(z.number()))}),hasLngLatSchema=z.union([z.tuple([z.number().min(-180).max(180),z.number().min(-90).max(90)]),z.tuple([z.number().min(-180).max(180),z.number().min(-90).max(90),z.number()]),z.object({type:z.literal("Point"),coordinates:z.array(z.number())}),featureSchema]),geoJsonbBoxSchema=z.union([z.array(z.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),z.array(z.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]),GeoJSONSchema=z.union([geometrySchema$1,featureSchema,featureCollectionSchema]),hasBBoxSchema=z.union([geoJsonbBoxSchema,GeoJSONSchema,z.array(GeoJSONSchema)]),pointGeoBiasSchema=z.object({position:hasLngLatSchema,radiusMeters:z.number().optional()}),geoBiasSchema=z.union([pointGeoBiasSchema,z.object({boundingBox:hasBBoxSchema})]),geographicFiltersSchema=z.object({countries:z.array(z.string()).optional()}),placeFiltersSchema=z.object({poiCategories:z.array(z.enum(poiCategories)).optional(),poiBrands:z.array(z.string()).optional(),indexes:z.array(z.string()).optional(),geographyTypes:z.array(z.enum(geographyTypes)).optional(),connectors:z.array(z.enum(connectorTypes)).optional(),fuelTypes:z.array(z.string()).optional(),minPowerKW:z.number().optional(),maxPowerKW:z.number().optional()}),searchFiltersSchema=geographicFiltersSchema.extend(placeFiltersSchema.shape),commonGeocodeAndFuzzySearchParamsSchema=z.object({typeahead:z.boolean().optional(),cursor:searchCursorSchema.optional(),geoBias:geoBiasSchema.optional(),filters:geographicFiltersSchema.optional()}),commonPlacesParamsSchema=z.object({query:z.string().optional(),position:hasLngLatSchema.optional(),limit:z.number().max(100).optional(),extendedPostalCodesFor:z.array(z.string()).optional(),mapcodes:z.array(z.string()).optional(),geopoliticalView:z.enum(geopoliticalViews).optional()}),geocodingFiltersSchema=geographicFiltersSchema.extend(placeFiltersSchema.pick({geographyTypes:!0}).shape),geocodingRequestSchema=commonServiceRequestSchema.extend(commonPlacesParamsSchema.shape).extend(commonGeocodeAndFuzzySearchParamsSchema.shape).extend({query:z.string(),filters:geocodingFiltersSchema.optional()}),arrayToCSV=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",sampleWithinMaxLength=(e,t)=>{const a=e.length;if(a<=t)return e;const o=[];let r;const n=Math.ceil(a/t);for(r=0;r<a;r+=n)o.push(e[r]);return t>1&&r>=a-n&&(o.length<t?o.push(e[a-1]):o[o.length-1]=e[a-1]),o},resolvePlacesEndpointUrl=(e,t)=>`${e.commonBaseURL}/maps/orbis/places/${t}`,buildCredentialHeaders=e=>({...e.apiKey&&{"TomTom-Api-Key":e.apiKey},...!isNil(e.apiVersion)&&{"TomTom-Api-Version":String(e.apiVersion)}}),buildCommonServiceRequestHeaders=e=>({...buildCredentialHeaders(e),...e.language&&{"Accept-Language":e.language}}),buildPlacesRequestHeaders=e=>buildCredentialHeaders(e),appendPlacesLanguageParam=(e,t)=>{t.language&&e.append("language",t.language)},VIEWS_REJECTED_BY_PLACES=["KR","US"],VIEWS_REJECTED_BY_GEOCODING=[...VIEWS_REJECTED_BY_PLACES,"AE","BN","CL","DZ","MY","PH","VN"],toPlacesView=(e,t)=>e&&!("geocode"===t?VIEWS_REJECTED_BY_GEOCODING:VIEWS_REJECTED_BY_PLACES).includes(e)?e:void 0,appendEVModelVersionParam=e=>{e.append("evModelVersion","3")},appendByJoiningParamValue=(e,t,a)=>{Array.isArray(a)&&a.length>0&&e.append(t,a.join(","))},appendOptionalParam=(e,t,a)=>{!isNil(a)&&e.append(t,String(a))},appendPlaceEnrichmentParams=(e,t)=>{appendOptionalParam(e,"view",toPlacesView(t.geopoliticalView)),appendOptionalParam(e,"openingHours",t.openingHours),appendOptionalParam(e,"timeZone",t.timeZone),appendOptionalParam(e,"relatedPois",t.relatedPois)},appendGeoBiasParams=(e,t)=>{if(!t)return;if(void 0!==t.position)return((e,t)=>{const a=getPosition(t);a&&(e.append("lat",String(a[1])),e.append("lon",String(a[0])))})(e,t.position),void appendOptionalParam(e,"radius",t.radiusMeters);const a=bboxFromGeoJSON(t.boundingBox);a&&(e.append("topLeft",arrayToCSV([a[3],a[0]])),e.append("btmRight",arrayToCSV([a[1],a[2]])))},csvLatLngToPosition=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},positionToCSVLatLon=e=>`${e[1]},${e[0]}`,apiToGeoJSONBBox=e=>{let t,a;return(e=>void 0!==e.topLeftPoint)(e)?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],a=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=csvLatLngToPosition(e.southWest),a=csvLatLngToPosition(e.northEast)),[t[0],t[1],a[0],a[1]]},latLonAPIToPosition=e=>[e.lon,e.lat],toConnectorCounts=e=>{const t=[];for(const a of e)for(const e of a.chargingPoints)for(const a of e.connectors??[]){const e=t.find(e=>{return t=a,o=e.connector,t.type===o.type&&t.ratedPowerKW===o.ratedPowerKW;var t,o});e?e.count++:t.push({connector:a,count:1})}return t},parseMoment=e=>{const{year:t,month:a,day:o}=(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:a,day:o,hour:e.hour,minute:e.minute,date:new Date(t,a-1,o,e.hour,e.minute)}},alwaysOpenInThisPeriod=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,parseOpeningHours=e=>{const t=e.timeRanges.map(e=>({start:parseMoment(e.startTime),end:parseMoment(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:alwaysOpenInThisPeriod(t)}},parseSearchAPIResult=e=>{const{position:t,entryPoints:a,poi:o,id:r,dist:n,boundingBox:i,chargingStations:s,dataSources:c,...l}=e,d=c&&omit(c,"chargingAvailability"),u=s&&s.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,capabilities:e.capabilities??[],restrictions:e.restrictions??[],connectors:e.connectors?.map(e=>{return{...e,chargingSpeed:(t=e.ratedPowerKW,t<12?"slow":t<50?"regular":t<150?"fast":"ultra-fast")};var t})}))}));return{type:"Feature",geometry:toPointGeometry(latLonAPIToPosition(t)),...i&&{bbox:apiToGeoJSONBBox(i)},id:r,properties:{...omit(l,"viewport"),...n&&{distance:n},...d&&!isEmpty(d)&&{dataSources:d},...a?.length&&{entryPoints:a.map(e=>({...e,position:latLonAPIToPosition(e.position)}))},...u?.length&&{chargingPark:{connectors:toConnectorCounts(u),chargingStations:u}},...o&&{poi:{name:o.name,categories:(o.categorySet?.map(e=>poiIDsToCategories[e.id])??[]).filter(e=>!!e),localizedCategories:o.categories??[],...o.phone&&{phone:o.phone},...o.brands&&{brands:o.brands.map(e=>e.name)},...o.url&&{url:o.url},...o.openingHours&&{openingHours:parseOpeningHours(o.openingHours)},...o.timeZone&&{timeZone:o.timeZone}}}}}},toPlacesCollection=(e,t)=>{const a=bboxOnlyIfWithArea(bboxFromGeoJSON(e));return{type:"FeatureCollection",properties:t,features:e,...a&&{bbox:a}}},parseSummaryAPI=(e,t)=>{const a=t?.paginated?(({offset:e,numResults:t,totalResults:a})=>{if(0===t)return;const o=e+t;return o>=a||o>1900?void 0:btoa(JSON.stringify({ofs:o}))})(e):void 0;return{...e.geoBias&&{geoBias:latLonAPIToPosition(e.geoBias)},...a&&{nextCursor:a},...omit(e,["geoBias","offset"])}},parseApiResult=e=>{const{position:t,boundingBox:a,dist:o,entryPoints:r,addressRanges:n,entityType:i,id:s,...c}=e;return{type:"Feature",geometry:toPointGeometry(latLonAPIToPosition(t)),...a&&{bbox:apiToGeoJSONBBox(a)},id:s,properties:{...omit(c,"viewport"),...o&&{distance:o},...i&&{geographyType:i.split(",")},...r&&{entryPoints:r.map(e=>({...e,position:latLonAPIToPosition(e.position)}))},...n&&{addressRanges:{...n,from:latLonAPIToPosition(n.from),to:latLonAPIToPosition(n.to)}}}}},geocodingTemplate={requestValidation:{schema:geocodingRequestSchema},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,"geocode"))(e)}/${encodeURIComponent(e.query)}.json`),a=t.searchParams;return appendPlacesLanguageParam(a,e),e.typeahead&&a.append("typeahead",String(e.typeahead)),appendOptionalParam(a,"limit",e.limit),appendSearchCursorParam(a,e.cursor,"Geocode"),appendGeoBiasParams(a,e.geoBias),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),e.extendedPostalCodesFor&&a.append("extendedPostalCodesFor",arrayToCSV(e.extendedPostalCodesFor)),e.mapcodes&&a.append("mapcodes",arrayToCSV(e.mapcodes)),appendOptionalParam(a,"view",toPlacesView(e.geopoliticalView,"geocode")),appendByJoiningParamValue(a,"entityTypeSet",e.filters?.geographyTypes),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>toPlacesCollection(e.results.map(parseApiResult),parseSummaryAPI(e.summary,{paginated:!0}))},geocode=async e=>callService(e,geocodingTemplate,"Geocode"),geocodeOne=async e=>fetchFirstPlace("geocodeOne",e,geocode),geometryDataRequestMandatory=z.object({geometries:z.union([featureCollectionSchema,z.array(z.union([z.string(),featureSchema])).min(1).max(20)])}),geometryDataRequestOptional=z.object({zoom:z.number().min(0).max(22).optional()}),geometryDataRequestSchema=geometryDataRequestMandatory.extend(geometryDataRequestOptional.shape),getGeometryIDs=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),geometryDataTemplate={requestValidation:{schema:geometryDataRequestSchema},buildRequest:e=>{const t=new URL((e=>resolvePlacesEndpointUrl(e,"additionalData.json"))(e)),a=t.searchParams;return((e,t)=>{let a;a=Array.isArray(t)?"string"==typeof t[0]?t:getGeometryIDs(t):getGeometryIDs(t.features),e.append("geometries",arrayToCSV(a))})(a,e.geometries),appendOptionalParam(a,"geometriesZoom",e.zoom),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??generateId(),bbox:bboxFromGeoJSON(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:bboxFromGeoJSON(t),features:t}}};async function geometryData(e){const t=await callService(e,geometryDataTemplate,"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?t:((e,t)=>{const a=e.features.reduce((e,t)=>{const a=t.properties.dataSources?.geometry?.id;return a&&(e[a]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),o=t.features.map(e=>e.id&&a[e.id]?{...e,properties:a[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:o}})(e.geometries,t)}var placeDetailsRequestMandatory=z.object({entityId:z.string()}),placeDetailsRequestOptional=z.object({mapcodes:z.array(z.string()).optional(),geopoliticalView:z.enum(geopoliticalViews).optional(),openingHours:z.string().optional(),timeZone:z.string().optional(),relatedPois:z.string().optional()}),placeDetailsRequestSchema=placeDetailsRequestMandatory.extend(placeDetailsRequestOptional.shape),placeDetailsTemplate={requestValidation:{schema:placeDetailsRequestSchema},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,"place.json"))(e)}`),a=t.searchParams;return appendPlacesLanguageParam(a,e),appendOptionalParam(a,"entityId",e.entityId),appendByJoiningParamValue(a,"mapcodes",e.mapcodes),appendPlaceEnrichmentParams(a,e),appendEVModelVersionParam(a),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>e.results?.length?parseSearchAPIResult(e.results[0]):void 0},getPlaceDetails=async e=>callService(e,placeDetailsTemplate,"PlaceDetails"),foldedWords=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"").toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean),cache=/* @__PURE__ */new Map,textCache=/* @__PURE__ */new Map,getWithDefault=e=>e??"en-GB",normalizeText=e=>{const t=foldedWords(e);return{words:t.join(" "),compact:t.join("")}},buildTextCache=e=>e.map(e=>({category:e,name:normalizeText(e.name),synonyms:e.synonyms.map(normalizeText)})),getCachedTextEntries=e=>textCache.get(getWithDefault(e))??[],MATCH_TIERS=[[950,850,(e,t)=>t.words===e.words],[720,620,(e,t)=>t.words.startsWith(`${e.words} `)],[440,380,(e,t)=>` ${t.words} `.includes(` ${e.words} `)],[280,180,(e,t)=>t.compact.includes(e.compact)]],scoreCategory=(e,t)=>{const a=((e,{name:t,synonyms:a})=>{for(const[o,r,n]of MATCH_TIERS){if(n(e,t))return o;if(a.some(t=>n(e,t)))return r}return 0})(e,t);return a?a+40*Math.min(1,e.words.length/Math.max(t.name.words.length,1)):0},withoutCovered=e=>{const t=/* @__PURE__ */new Set;return e.filter(({code:e,childCategoryCodes:a})=>{const o=t.has(e);t.add(e);for(const r of a)t.add(r);return!o})},matchCategories=(e,t,a)=>{const o=t.map(t=>((e,t)=>{const a=t.find(({category:t})=>t.code===e.trim());if(a)return[a.category];const o=normalizeText(e);if(!o.words)return[];const r=t.map(e=>({category:e.category,score:scoreCategory(o,e)})).filter(({score:e})=>e>0).sort((e,t)=>t.score-e.score),n=.7*(r[0]?.score??0),i=r.filter(({score:e})=>e>=n).map(({category:e})=>e);return uniqBy(i,"code")})(t,e).slice(0,a));return{categories:withoutCovered(compact(zip(...o).flat())),unmatched:t.filter((e,t)=>!o[t].length)}},poiCategoriesRequestSchema=commonServiceRequestSchema.extend({filters:z.array(z.string()).optional()}),parsePoiCategory=e=>{if(0===e.id)return null;const t=poiIDsToCategories[e.id];return t?{code:t,name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>poiIDsToCategories[e]).filter(e=>!!e),synonyms:e.synonyms}:(console.error(`Received unknown POI category ID ${e.id} (${e.name}). This category will be skipped and unavailable for filtering.`),null)},poiCategoriesTemplate={requestValidation:{schema:poiCategoriesRequestSchema},buildRequest:e=>{const t=resolvePlacesEndpointUrl(e,"poiCategories.json"),a=new URL(t);return appendPlacesLanguageParam(a.searchParams,e),{url:a,headers:buildPlacesRequestHeaders(e)}},apiVersion:1,sendRequest:get,parseResponse:e=>({poiCategories:e.poiCategories.map(parsePoiCategory).filter(e=>null!==e)})},knownCodes=new Set(poiCategories),isKnownCode=e=>knownCodes.has(e),loadCategories=async(e,t)=>{const a=(e=>cache.get(getWithDefault(e)))(t);if(a)return a;const{poiCategories:o}=await callService(e,poiCategoriesTemplate,"POICategories");return((e,t)=>{const a=getWithDefault(e);cache.set(a,t),textCache.set(a,buildTextCache(t))})(t,o),o},getPOICategories=async(e={})=>{const{language:t}=mergeFromGlobal(e),a=await loadCategories(e,t);return e.filters?.length?{poiCategories:matchCategories(getCachedTextEntries(t),e.filters).categories}:{poiCategories:a}},getPOICategoryCodes=async(e={})=>{const{poiCategories:t}=await getPOICategories(e);return t.map(e=>e.code)},resolvePOICategories=async e=>{const t=e.filters.map(e=>e.trim());if(t.every(isKnownCode))return{poiCategories:uniq(t).slice(0,10),unmatched:[]};const{language:a}=mergeFromGlobal(e);await loadCategories(e,a);const{categories:o,unmatched:r}=matchCategories(getCachedTextEntries(a),e.filters,3);return{poiCategories:o.slice(0,10).map(({code:e})=>e),unmatched:r}},notCurrent={current:!1},createLatestRequest=()=>{let e;const t=()=>{e?.abort(),e=void 0};return{run:async a=>{t();const o=new AbortController;e=o;const{signal:r}=o;try{const e=await a(r);return r.aborted?notCurrent:{current:!0,value:e}}catch(n){if(r.aborted)return notCurrent;throw n}finally{e===o&&(e=void 0)}},cancel:t,isRunning:()=>void 0!==e}},routeTypes=["fast","short","efficient","thrilling"],tollTransponderOptions=["all","unknown","none"],parseRoutingResponseError=(e,t)=>{const{data:a,message:o,status:r}=e;return new SDKServiceError(a?.error?.description??a?.detailedError?.message??o,t,r,{apiErrorCode:a?.detailedError?.code})},vehicleParametersSchema=z.object({model:z.object({dimensions:z.object({weightKG:z.number().positive().optional()}).optional()}).optional(),state:z.object({heading:z.number().min(0).max(360).optional()}).optional(),restrictions:z.object({maxSpeedKMH:z.number().min(0).max(250).optional(),tollTransponder:z.enum(tollTransponderOptions).optional()}).optional()}),costModelSchema=z.object({avoid:z.array(z.enum(avoidableTypes)).optional(),traffic:z.enum(["live","historical"]).optional(),routeType:z.enum(routeTypes).optional(),avoidAreas:z.array(hasBBoxSchema).max(10).optional()}),departArriveSchema=z.object({option:z.enum(["departAt","arriveBy"]),date:z.date()}),commonRoutingRequestSchema=z.object({costModel:costModelSchema.optional(),travelMode:z.string().optional(),vehicle:vehicleParametersSchema.optional(),when:departArriveSchema.optional()}),reachableRangeRequestSchemaMandatory=z.object({origin:hasLngLatSchema,budget:z.object({type:z.enum(budgetTypes),value:z.number().min(0)})}),reachableRangeAvoidableSchema=z.enum(avoidableTypes).exclude(["alreadyUsedRoads"]),reachableRangeVehicleSchema=vehicleParametersSchema.check(z.refine(e=>!(e.state&&"heading"in e.state),"vehicle.state.heading: calculateReachableRange has no vehicle heading parameter. Remove it, or use calculateRoute, which accepts it.")),reachableRangeWhenSchema=departArriveSchema.check(z.refine(e=>"arriveBy"!==e.option,"when.arriveBy: calculateReachableRange has no arrival-time parameter. Use when.departAt instead, or omit when entirely.")),reachableRangeCostModelSchema=costModelSchema.extend({avoid:z.array(reachableRangeAvoidableSchema).optional(),avoidAreas:z.unknown().optional()}).check(z.refine(e=>void 0===e.avoidAreas,"costModel.avoidAreas: calculateReachableRange has no avoid-areas parameter. Remove it — the other cost-model options are accepted.")),reachableRangeRequestSchemaOptional=z.object({when:reachableRangeWhenSchema.optional(),vehicle:reachableRangeVehicleSchema.optional(),costModel:reachableRangeCostModelSchema.optional(),maxFerryLengthMeters:z.number().min(0).optional(),smoothing:z.enum(["none","weak","strong"]).optional()}),reachableRangeRequestSchema=commonRoutingRequestSchema.extend(reachableRangeRequestSchemaMandatory.extend(reachableRangeRequestSchemaOptional.shape).shape),reachableRangeRequestValidationConfig={schema:reachableRangeRequestSchema},buildCommonRoutingBody=e=>({...e.costModel?.routeType&&{routeType:e.costModel.routeType},...e.costModel?.traffic&&{traffic:e.costModel.traffic},...e.costModel?.avoid?.length&&{avoids:e.costModel.avoid},...e.travelMode&&{travelMode:e.travelMode},..."departAt"===e.when?.option&&e.when.date&&{departureDateTime:e.when.date.toISOString()}}),buildCommonVehicleBody=e=>{const t={};return e.model?.dimensions?.weightKG&&(t.vehicleWeightInKilograms=e.model.dimensions.weightKG),e.restrictions?.maxSpeedKMH&&(t.vehicleMaxSpeedInKilometersPerHour=e.restrictions.maxSpeedKMH),e.restrictions?.tollTransponder&&(t.vehicleHasElectronicTollCollectionTransponder=e.restrictions.tollTransponder),t},buildPostData=e=>({origin:{type:"Point",coordinates:getPositionStrict(e.origin)},...buildCommonRoutingBody(e),...e.vehicle&&buildCommonVehicleBody(e.vehicle)}),buildRequestHeaders$1=e=>({...buildCommonServiceRequestHeaders(e),Attributes:"reachableRange(boundary)"}),propertyKeys=Object.keys({origin:!0,budget:!0,costModel:!0,vehicle:!0,travelMode:!0,when:!0,maxFerryLengthMeters:!0,smoothing:!0}),closeRing=e=>{const t=e[0],a=e.at(-1);return!t||!a||t[0]===a[0]&&t[1]===a[1]?e:[...e,t]},reachableRangeTemplate={requestValidation:reachableRangeRequestValidationConfig,buildRequest:e=>{const t=(e=>new URL(`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`))(e);return((e,t)=>{const a=t.budget;"timeMinutes"===a.type?e.append("timeBudgetInSec",(60*a.value).toString()):e.append("distanceBudgetInMeters",(1e3*a.value).toString())})(t.searchParams,e),appendOptionalParam(t.searchParams,"maxFerryLengthInMeters",e.maxFerryLengthMeters),appendOptionalParam(t.searchParams,"smoothing",e.smoothing??"strong"),{method:"POST",url:t,data:buildPostData(e),headers:buildRequestHeaders$1(e)}},sendRequest:fetchWith,parseResponse:(e,t)=>{const a={type:"Polygon",coordinates:[closeRing(e.reachableRange.boundary.map(e=>[e.longitude,e.latitude]))]};return{type:"Feature",geometry:a,bbox:bboxFromGeoJSON(a),properties:pick(t,propertyKeys)}},parseResponseError:parseRoutingResponseError,apiVersion:3,releaseStage:{stage:"private-preview",access:{product:"Calculate Reachable Range",requestAccessURL:"https://www.tomtom.com/contact-sales/?source_app=docs-portal&source_product=calculate-reachable-range"}}},calculateReachableRange=async e=>callService(e,reachableRangeTemplate,"Reachable Range"),combineSignals=(...e)=>{const t=e.filter(e=>!!e);return t.length<2?t[0]:AbortSignal.any(t)},calculateReachableRanges=async(e,t)=>{const a=[];for(const n of e){const e=combineSignals(n.signal,t?.signal);try{a.push(await calculateReachableRange({...n,...e&&{signal:e}}))}catch(r){if(!(r instanceof SDKServiceError)||[401,403,429].includes(r.status??0))throw r}}const o=bboxFromGeoJSON(a);return{type:"FeatureCollection",...o&&{bbox:o},features:a}},AREA_TYPE_BY_GEOGRAPHY_TYPE={Country:"country",CountrySubdivision:"countrySubdivision",CountrySecondarySubdivision:"countrySecondarySubdivision",CountryTertiarySubdivision:"countryTertiarySubdivision",Municipality:"municipality",MunicipalitySubdivision:"municipalitySubdivision",MunicipalitySecondarySubdivision:"municipalitySecondarySubdivision",Neighbourhood:"neighborhood",PostalCodeArea:"postalCode"},ISO2_TO_ISO3={AF:"AFG",AX:"ALA",AL:"ALB",DZ:"DZA",AS:"ASM",AD:"AND",AO:"AGO",AI:"AIA",AQ:"ATA",AG:"ATG",AR:"ARG",AM:"ARM",AW:"ABW",AU:"AUS",AT:"AUT",AZ:"AZE",BS:"BHS",BH:"BHR",BD:"BGD",BB:"BRB",BY:"BLR",BE:"BEL",BZ:"BLZ",BJ:"BEN",BM:"BMU",BT:"BTN",BO:"BOL",BQ:"BES",BA:"BIH",BW:"BWA",BV:"BVT",BR:"BRA",IO:"IOT",BN:"BRN",BG:"BGR",BF:"BFA",BI:"BDI",CV:"CPV",KH:"KHM",CM:"CMR",CA:"CAN",KY:"CYM",CF:"CAF",TD:"TCD",CL:"CHL",CN:"CHN",CX:"CXR",CC:"CCK",CO:"COL",KM:"COM",CG:"COG",CD:"COD",CK:"COK",CR:"CRI",CI:"CIV",HR:"HRV",CU:"CUB",CW:"CUW",CY:"CYP",CZ:"CZE",DK:"DNK",DJ:"DJI",DM:"DMA",DO:"DOM",EC:"ECU",EG:"EGY",SV:"SLV",GQ:"GNQ",ER:"ERI",EE:"EST",SZ:"SWZ",ET:"ETH",FK:"FLK",FO:"FRO",FJ:"FJI",FI:"FIN",FR:"FRA",GF:"GUF",PF:"PYF",TF:"ATF",GA:"GAB",GM:"GMB",GE:"GEO",DE:"DEU",GH:"GHA",GI:"GIB",GR:"GRC",GL:"GRL",GD:"GRD",GP:"GLP",GU:"GUM",GT:"GTM",GG:"GGY",GN:"GIN",GW:"GNB",GY:"GUY",HT:"HTI",HM:"HMD",VA:"VAT",HN:"HND",HK:"HKG",HU:"HUN",IS:"ISL",IN:"IND",ID:"IDN",IR:"IRN",IQ:"IRQ",IE:"IRL",IM:"IMN",IL:"ISR",IT:"ITA",JM:"JAM",JP:"JPN",JE:"JEY",JO:"JOR",KZ:"KAZ",KE:"KEN",KI:"KIR",KP:"PRK",KR:"KOR",KW:"KWT",KG:"KGZ",LA:"LAO",LV:"LVA",LB:"LBN",LS:"LSO",LR:"LBR",LY:"LBY",LI:"LIE",LT:"LTU",LU:"LUX",MO:"MAC",MG:"MDG",MW:"MWI",MY:"MYS",MV:"MDV",ML:"MLI",MT:"MLT",MH:"MHL",MQ:"MTQ",MR:"MRT",MU:"MUS",YT:"MYT",MX:"MEX",FM:"FSM",MD:"MDA",MC:"MCO",MN:"MNG",ME:"MNE",MS:"MSR",MA:"MAR",MZ:"MOZ",MM:"MMR",NA:"NAM",NR:"NRU",NP:"NPL",NL:"NLD",NC:"NCL",NZ:"NZL",NI:"NIC",NE:"NER",NG:"NGA",NU:"NIU",NF:"NFK",MK:"MKD",MP:"MNP",NO:"NOR",OM:"OMN",PK:"PAK",PW:"PLW",PS:"PSE",PA:"PAN",PG:"PNG",PY:"PRY",PE:"PER",PH:"PHL",PN:"PCN",PL:"POL",PT:"PRT",PR:"PRI",QA:"QAT",RE:"REU",RO:"ROU",RU:"RUS",RW:"RWA",BL:"BLM",SH:"SHN",KN:"KNA",LC:"LCA",MF:"MAF",PM:"SPM",VC:"VCT",WS:"WSM",SM:"SMR",ST:"STP",SA:"SAU",SN:"SEN",RS:"SRB",SC:"SYC",SL:"SLE",SG:"SGP",SX:"SXM",SK:"SVK",SI:"SVN",SB:"SLB",SO:"SOM",ZA:"ZAF",GS:"SGS",SS:"SSD",ES:"ESP",LK:"LKA",SD:"SDN",SR:"SUR",SJ:"SJM",SE:"SWE",CH:"CHE",SY:"SYR",TW:"TWN",TJ:"TJK",TZ:"TZA",TH:"THA",TL:"TLS",TG:"TGO",TK:"TKL",TO:"TON",TT:"TTO",TN:"TUN",TR:"TUR",TM:"TKM",TC:"TCA",TV:"TUV",UG:"UGA",UA:"UKR",AE:"ARE",GB:"GBR",US:"USA",UM:"UMI",UY:"URY",UZ:"UZB",VU:"VUT",VE:"VEN",VN:"VNM",VG:"VGB",VI:"VIR",WF:"WLF",EH:"ESH",YE:"YEM",ZM:"ZMB",ZW:"ZWE"},toIso3=e=>ISO2_TO_ISO3[e]??e,PLACE_TYPE_BY_RESULT_TYPE={street:"Street",area:"Geography",address:"Point Address"},GEOGRAPHY_TYPE_BY_AREA_TYPE=Object.fromEntries(Object.entries(AREA_TYPE_BY_GEOGRAPHY_TYPE).map(([e,t])=>[t,e])),mapAddress=e=>{const{street:t,houseNumber:a,countryCodeIso2:o,...r}=e;return{...r,...t&&{streetName:t},...a&&{streetNumber:a},...o&&{countryCode:o,countryCodeISO3:toIso3(o)}}},revGeocodeRequestMandatory=z.object({position:hasLngLatSchema}),revGeocodeRequestOptional=z.object({geographyTypes:z.array(z.enum(geographyTypes)).optional(),heading:z.number().min(-360).max(360).optional(),radiusMeters:z.number().positive().max(5e6).optional(),geopoliticalView:z.enum(geopoliticalViews).optional()}),revGeocodeRequestSchema=revGeocodeRequestMandatory.extend(revGeocodeRequestOptional.shape),reverseGeocodingTemplate={requestValidation:{schema:revGeocodeRequestSchema},buildRequest:e=>{const[t,a]=getPositionStrict(e.position),o=new URL((e=>resolvePlacesEndpointUrl(e,"reverseGeocode"))(e)),r=o.searchParams;return r.append("position",`${t},${a}`),appendOptionalParam(r,"radiusInMeters",e.radiusMeters),e.geographyTypes&&r.append("areaTypes",e.geographyTypes.map(e=>AREA_TYPE_BY_GEOGRAPHY_TYPE[e]).join(",")),appendOptionalParam(r,"vehicleHeadingInDegrees",e.heading),appendOptionalParam(r,"geopoliticalView",toPlacesView(e.geopoliticalView)),{url:o,headers:{...buildCommonServiceRequestHeaders(e),Attributes:"results(*)"}}},apiVersion:2,sendRequest:get,parseResponse:(e,t)=>{const a=e.results[0];return{type:"Feature",geometry:toPointGeometry(getPositionStrict(t.position)),id:a?.id??generateId(),...a&&{properties:{type:PLACE_TYPE_BY_RESULT_TYPE[a.type],address:{freeformAddress:a.title,...mapAddress(a.address)},...a.areaType&&{geographyType:[GEOGRAPHY_TYPE_BY_AREA_TYPE[a.areaType]]},...a.accessPoints?.length&&{entryPoints:a.accessPoints.map(e=>({position:e.position.coordinates}))},originalPosition:a.position.coordinates}}}}},reverseGeocode=async e=>callService(e,reverseGeocodingTemplate,"ReverseGeocode"),arrivalSides=["any","curb"],waypointLikeSchema=z.union([hasLngLatSchema,geometrySchema$1]),pathLikeSchema=z.union([lineStringCoordsSchema,featureSchema]),mandatorySchema=z.object({locations:z.array(z.union([waypointLikeSchema,pathLikeSchema])).min(1)}),optionalSchema=z.object({arrivalSide:z.enum(arrivalSides).optional(),computeTravelTimeFor:z.enum(["none","all"]).optional(),maxAlternatives:z.number().min(0).max(5).optional(),sectionTypes:z.array(z.enum(inputSectionTypesWithGuidance)).optional()}),schema=commonRoutingRequestSchema.extend(mandatorySchema.extend(optionalSchema.shape).shape),locationsRefinement={check:e=>{const t=e.locations.map(getRoutePlanningLocationType),a=t.filter(e=>"waypoint"===e).length,o=t.filter(e=>"path"===e).length;return a>=2||o>=1},message:"At least 2 waypoints or 1 path (route reconstruction) is required."},destinationPauseRefinement={check:e=>{const t=e.locations.at(-1);return!t||"waypoint"!==getRoutePlanningLocationType(t)||!t.properties?.pauseDurationSeconds},message:"pauseDurationSeconds is not supported on the destination: the routing API requires the wait on the last leg to be 0."},routeRequestValidationConfig={schema:schema,refinements:[locationsRefinement,destinationPauseRefinement]},EXPLICIT_SECTION_TYPES=["tollVignette","tollRoad","roadShields","importantRoadStretch"],buildAttributesHeader=e=>{const t=["summary","legs(summary,path)"],a=e.sectionTypes;if(!a||a.length>0){t.push("sections");const o=!a;for(const e of EXPLICIT_SECTION_TYPES)(o||a.includes(e))&&t.push(`sections.${e}`);e.guidance&&(o||a.includes("lanes"))&&t.push("sections.lanes")}0!==e.extendedRouteRepresentations?.length&&t.push("progressPoints"),e.guidance&&t.push("instructions(*,nextRoadInformation.roadShields.iconReference,previousRoadInformation.roadShields.iconReference,signpost.exitIconReference,distanceToPreviousTrafficLightInMeters)");const o=`routes(${t.join(",")})`;return e.guidance?`roadShieldAtlasReference,${o}`:o},buildVehicleBody=e=>{const t=e.state?.heading;return{...buildCommonVehicleBody(e),...!isNil(t)&&{vehicleHeadingInDegrees:t}}},expandPathToStops=e=>{const t=(e=>Array.isArray(e)?e:e.geometry.coordinates)(e),a=(e=>{if(!Array.isArray(e))return e.properties?.sections?.leg})(e);if(a&&a.length>1&&a.every(e=>null!=e.startPointIndex&&null!=e.endPointIndex)){const e=a.map(e=>{const a=e.startPointIndex??0,o=e.endPointIndex??0;return{coordinate:t[a],legToNext:{path:{type:"LineString",coordinates:t.slice(a,o+1)}}}});return e.push({coordinate:t[a.at(-1)?.endPointIndex??t.length-1]}),e}return[{coordinate:t[0],legToNext:{path:{type:"LineString",coordinates:t}}},{coordinate:t.at(-1)??t[0]}]},getRouteStopOptions=e=>{if(!Array.isArray(e)&&"properties"in e)return e.properties??void 0},toLegRequest=e=>{const t=e.options;if(!t)return{};const a={...t.pauseDurationSeconds&&{pauseDurationInSeconds:t.pauseDurationSeconds},...t.candidateEntryPoints?.length&&{entryPoints:(o=t.candidateEntryPoints,{type:"MultiPoint",coordinates:o.map(e=>getPositionStrict(e))}),...!isNil(t.preferredEntryPointIndex)&&{preferredEntryPointIndex:t.preferredEntryPointIndex}}};var o;return{...t.legCostModel?.routeType&&{routeType:t.legCostModel.routeType},...t.legCostModel?.avoid?.length&&{avoids:t.legCostModel.avoid.map(e=>({name:e}))},...Object.keys(a).length>0&&{routeStop:a}}},iconCategoryByCategory={other:"unknown",accident:"accident",fog:"fog",danger:"dangerousConditions",rain:"rain",frost:"ice",jam:"jam","lane-closed":"laneClosed","road-closed":"roadClosed",roadworks:"roadWorks",wind:"wind",flooding:"flooding","broken-down-vehicle":"brokenDownVehicle"},iconCategoryLookup=new Map(Object.entries(iconCategoryByCategory)),categoryByIconCategory=new Map(trafficIncidentRequestCategories.map(e=>[iconCategoryByCategory[e],e])),delayMagnitudeLookup=new Map(Object.entries({unknown:"unknown",minor:"minor",moderate:"moderate",major:"major",undefined:"indefinite"})),toIconCategory=e=>iconCategoryLookup.get(e)??e,toTrafficIncidentCategory=e=>categoryByIconCategory.get(e)??"other",toDelayMagnitude=e=>delayMagnitudeLookup.get(e)??"unknown",parseSummary=e=>({lengthInMeters:e.lengthInMeters,travelTimeInSeconds:e.travelDurationInSeconds,trafficDelayInSeconds:e.trafficDelayDurationInSeconds??0,trafficLengthInMeters:e.trafficLengthInMeters??0,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,departureTime:new Date(e.departureDateTime),arrivalTime:new Date(e.arrivalDateTime),deviationDistanceInMeters:e.deviationDistanceInMeters,deviationTimeInSeconds:e.deviationDurationInSeconds,...e.deviationPoint&&{deviationPoint:e.deviationPoint.coordinates}}),parseLegSectionProps=e=>e.reduce((t,a,o)=>{const r=a.path.coordinates.length,n=0===o?0:t[o-1]?.endPointIndex;let i;isNil(n)||(i=0===n?Math.max(r-1,0):n+r);const s=((e,t)=>{if(!t)return;const a=new Date(e.summary.arrivalDateTime).getTime(),o=new Date(t.summary.departureDateTime).getTime();if(Number.isNaN(a)||Number.isNaN(o))return;const r=Math.round((o-a)/1e3);return r>0?r:void 0})(a,e[o+1]),{originalWaypointIndexAtEndOfLeg:c}=a.summary;return t.push({...!isNil(n)&&{startPointIndex:n},...void 0!==i&&{endPointIndex:i},...!isNil(c)&&{originalWaypointIndex:c},summary:{...parseSummary(a.summary),...void 0!==s&&{stopTimeInSeconds:s}},id:generateId()}),t},[]),toSectionProps=e=>({id:generateId(),startPointIndex:e.startPathIndex,endPointIndex:e.endPathIndex}),parseSections=(e,t)=>{const a={leg:parseLegSectionProps(e.legs)},o=e.sections;if(!o)return a;const r=(e,t)=>{t?.length&&(a[e]=t.map(toSectionProps))};return r("carTrain",o.carTrain),r("ferry",o.ferry),r("tunnel",o.tunnel),r("motorway",o.motorway),r("pedestrian",o.pedestrian),r("toll",o.toll),r("tollRoad",o.tollRoad),r("carpool",o.carpool),r("urban",o.urban),r("unpaved",o.unpaved),r("lowEmissionZone",o.lowEmissionZone),o.country?.length&&(a.country=o.country.map(e=>({...toSectionProps(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:toIso3(e.countryCodeIso2??"")}))),o.travelMode?.length&&(a.vehicleRestricted=o.travelMode.filter(e=>"other"===e.travelMode).map(toSectionProps)),o.traffic?.length&&(a.traffic=o.traffic.map(e=>{return{...toSectionProps(e),delayInSeconds:e.delayDurationInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKilometersPerHour,categories:(t=e,t.tec?.causes?.length?t.tec.causes.map(e=>{switch(e.mainCauseCode){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"}}):[toTrafficIncidentCategory(t.iconCategory)]),magnitudeOfDelay:toDelayMagnitude(e.delayMagnitude),tec:e.tec,...e.eventId&&{eventId:e.eventId}};var t})),o.speedLimit?.length&&(a.speedLimit=o.speedLimit.map(e=>{const t=e.speedRestrictions?.find(e=>"maximum"===e.type)?.inKilometersPerHour;return isNil(t)?void 0:{...toSectionProps(e),maxSpeedLimitInKmh:t}}).filter(e=>!!e)),o.lanes?.length&&(a.lanes=o.lanes.map(e=>({...toSectionProps(e),lanes:(e.lanes??[]).map(e=>({directions:e.directions.map(e=>LANE_DIRECTION_MAP[e]??e),...e.follow&&{follow:LANE_DIRECTION_MAP[e.follow]??e.follow}})),laneSeparators:(e.laneSeparators??[]).map(e=>LANE_SEPARATOR_MAP[e]??e),properties:e.properties}))),o.roadShields?.length&&(a.roadShields=o.roadShields.map(e=>({...toSectionProps(e),roadShieldReferences:e.roadShieldReferences}))),o.tollVignette?.length&&(a.tollVignette=o.tollVignette.map(e=>({...toSectionProps(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:toIso3(e.countryCodeIso2??"")}))),o.importantRoadStretch?.length&&(a.importantRoadStretch=o.importantRoadStretch.map(e=>({...toSectionProps(e),index:e.importantRoadStretchIndex,...e.streetName&&{streetName:e.streetName.text},...e.roadNumbers?.length&&{roadNumbers:e.roadNumbers.map(e=>e.text)}}))),((e,t)=>{if(!t)return;const a=new Set(t);for(const o of Object.keys(e))"leg"===o||a.has(o)||delete e[o]})(a,t.sectionTypes),a},similar=(e,t)=>Math.abs(e[0]-t[0])<1e-4&&Math.abs(e[1]-t[1])<1e-4,MANEUVER_MAP={depart:"DEPART",waypointLeft:"WAYPOINT_LEFT",waypointRight:"WAYPOINT_RIGHT",waypointReached:"WAYPOINT_REACHED",waypointAhead:"WAYPOINT_AHEAD",arrive:"ARRIVE",arriveLeft:"ARRIVE_LEFT",arriveRight:"ARRIVE_RIGHT",arriveAhead:"ARRIVE_AHEAD",continueStraight:"STRAIGHT",keepLeft:"KEEP_LEFT",keepRight:"KEEP_RIGHT",turnSlightRight:"SLIGHT_RIGHT",turnRight:"TURN_RIGHT",turnSharpRight:"SHARP_RIGHT",turnSlightLeft:"SLIGHT_LEFT",turnLeft:"TURN_LEFT",turnSharpLeft:"SHARP_LEFT",makeUTurn:"MAKE_UTURN",roundaboutStraight:"ROUNDABOUT_STRAIGHT",roundaboutSharpRight:"ROUNDABOUT_SHARP_RIGHT",roundaboutRight:"ROUNDABOUT_RIGHT",roundaboutSlightRight:"ROUNDABOUT_SLIGHT_RIGHT",roundaboutSlightLeft:"ROUNDABOUT_SLIGHT_LEFT",roundaboutLeft:"ROUNDABOUT_LEFT",roundaboutSharpLeft:"ROUNDABOUT_SHARP_LEFT",roundaboutBack:"ROUNDABOUT_BACK",exitRoundabout:"EXIT_ROUNDABOUT",exitMotorwayLeft:"EXIT_MOTORWAY_LEFT",exitMotorwayRight:"EXIT_MOTORWAY_RIGHT",switchMotorwayLeft:"SWITCH_MOTORWAY_LEFT",switchMotorwayRight:"SWITCH_MOTORWAY_RIGHT",enterCarpoolLaneLeft:"ENTER_CARPOOL_LANE_LEFT",enterCarpoolLaneRight:"ENTER_CARPOOL_LANE_RIGHT",exitCarpoolLaneLeft:"EXIT_CARPOOL_LANE_LEFT",exitCarpoolLaneRight:"EXIT_CARPOOL_LANE_RIGHT",mergeLeftLane:"MERGE_LEFT_LANE",mergeRightLane:"MERGE_RIGHT_LANE",takeShipFerry:"TAKE_SHIP_FERRY",takeCarTrain:"TAKE_CAR_TRAIN",leaveShipFerry:"LEAVE_SHIP_FERRY",leaveCarTrain:"LEAVE_CAR_TRAIN",crossBorder:"CROSS_BORDER",passTollgate:"TOLLGATE"},ROAD_PROPERTY_MAP={urban:"URBAN",motorway:"MOTORWAY",controlledAccess:"CONTROLLED_ACCESS"},LANDMARK_MAP={endOfRoad:"END_OF_ROAD",atTrafficLight:"AT_TRAFFIC_LIGHT",onToBridge:"ON_TO_BRIDGE",onBridge:"ON_BRIDGE",afterBridge:"AFTER_BRIDGE",intoTunnel:"INTO_TUNNEL",insideTunnel:"INSIDE_TUNNEL",afterTunnel:"AFTER_TUNNEL"},TOLL_PAYMENT_MAP={cashCoinsAndBills:"CASH_COINS_AND_BILLS",cashBillsOnly:"CASH_BILLS_ONLY",cashCoinsOnly:"CASH_COINS_ONLY",cashExactChange:"CASH_EXACT_CHANGE",creditCard:"CREDIT_CARD",debitCard:"DEBIT_CARD",travelCard:"TRAVEL_CARD",etc:"ETC",etcTransponder:"ETC_TRANSPONDER",etcVideoCamera:"ETC_VIDEO_CAMERA",subscription:"SUBSCRIPTION"},LANE_DIRECTION_MAP={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",rightUTurn:"RIGHT_U_TURN",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",leftUTurn:"LEFT_U_TURN"},LANE_SEPARATOR_MAP={unknown:"UNKNOWN",noMarking:"NO_MARKING",longDashed:"LONG_DASHED",doubleSolid:"DOUBLE_SOLID",singleSolid:"SINGLE_SOLID",solidDashed:"SOLID_DASHED",dashedSolid:"DASHED_SOLID",shortDashed:"SHORT_DASHED",shadedAreaMarking:"SHADED_AREA_MARKING",dashedBlocks:"DASHED_BLOCKS",doubleDashed:"DOUBLE_DASHED",crossingAlert:"CROSSING_ALERT",physicalDivider:"PHYSICAL_DIVIDER",physicalDividerLessThan3m:"PHYSICAL_DIVIDER_LESS_THAN_3M",physicalDividerGuardrail:"PHYSICAL_DIVIDER_GUARDRAIL",curb:"CURB"},MANEUVER_ANGLE_MAP={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",back:"BACK"},ROUNDABOUT_TYPE_MAP={regular:"REGULAR",small:"SMALL"},SIDE_ROAD_SIDE_MAP={left:"LEFT",right:"RIGHT",leftAndRight:"LEFT_AND_RIGHT"},EMPTY_ROAD_INFO={properties:[]},toInstructionText=e=>({text:e.text}),parseInstructionRoadInformation=e=>({properties:(e.properties??[]).map(e=>ROAD_PROPERTY_MAP[e]??e.toUpperCase()),...e.roadNames?.length&&{streetName:toInstructionText(e.roadNames[0].identifier)},...e.countryCodeIso2&&{countryCode:toIso3(e.countryCodeIso2)},...e.roadShields?.length&&{roadShields:e.roadShields.map(e=>({roadNumber:e.roadNumber?toInstructionText(e.roadNumber):{text:""},countryCode:toIso3(e.countryCodeIso2??""),...e.countrySubdivisionCodeIso&&{stateCode:e.countrySubdivisionCodeIso},...e.iconReference&&{roadShieldReference:e.iconReference}}))}}),parseTollAndCrossing=e=>({...e.tollgateName&&{tollgateName:toInstructionText(e.tollgateName)},...e.tollPaymentTypes?.length&&{tollPaymentTypes:e.tollPaymentTypes.map(e=>TOLL_PAYMENT_MAP[e]??e)},...e.countryCrossingFromName&&{countryCrossingFromName:toInstructionText(e.countryCrossingFromName)},...e.countryCrossingFromCodeIso2&&{countryCrossingFromCode:toIso3(e.countryCrossingFromCodeIso2)},...e.countryCrossingToName&&{countryCrossingToName:toInstructionText(e.countryCrossingToName)},...e.countryCrossingToCodeIso2&&{countryCrossingToCode:toIso3(e.countryCrossingToCodeIso2)}}),toManeuverAngle=e=>MANEUVER_ANGLE_MAP[e]??e,parseManeuverExtras=e=>{return{...e.message&&{message:e.message},...e.intersectionName&&{intersectionName:toInstructionText(e.intersectionName)},...e.drivingSide&&{drivingSide:e.drivingSide.toUpperCase()},...e.landmark&&{landmark:LANDMARK_MAP[e.landmark]??e.landmark},...!isNil(e.distanceToPreviousTrafficLightInMeters)&&{trafficLightOffsetInMeters:e.distanceToPreviousTrafficLightInMeters},...e.sideRoads&&{sideRoads:(a=e.sideRoads,a.map(e=>({side:SIDE_ROAD_SIDE_MAP[e.side]??e.side,offsetFromManeuverInMeters:e.offsetFromManeuverInMeters,...!isNil(e.isDrivable)&&{isDrivable:e.isDrivable}})))},...e.maneuverView&&{maneuverView:(t=e.maneuverView,{...t.onRouteAngle&&{onRouteAngle:toManeuverAngle(t.onRouteAngle)},offRouteAngles:(t.offRouteAngles??[]).map(toManeuverAngle)})},...e.roundaboutType&&{roundaboutType:ROUNDABOUT_TYPE_MAP[e.roundaboutType]??e.roundaboutType},...!isNil(e.isManeuverObligatory)&&{isManeuverObligatory:e.isManeuverObligatory},...!isNil(e.changeOfAngleInDegrees)&&{changeOfAngleInDegrees:e.changeOfAngleInDegrees},...!isNil(e.ambiguousExitOffsetFromManeuverInMeters)&&{offsetOfAmbiguousExitFromManeuverInMeters:e.ambiguousExitOffsetFromManeuverInMeters},...!isNil(e.roundaboutExitNumber)&&{roundaboutExitNumber:e.roundaboutExitNumber}};var t,a},parseRoadShieldFields=(e,t)=>{const a=e.signpost?(e=>{if(e.exitName||e.exitNumber||e.towardName)return{...e.exitName&&{exitName:toInstructionText(e.exitName)},...e.exitNumber&&{exitNumber:toInstructionText(e.exitNumber)},towardName:e.towardName?toInstructionText(e.towardName):{text:""}}})(e.signpost):void 0,o=(e.nextRoadInformation?.roadShields??[]).map(e=>e.iconReference).filter(e=>!!e);return{...a&&{signpost:a},...t&&{roadShieldAtlasReference:t},...o.length&&{roadShieldReferences:o},...e.signpost?.exitIconReference&&{signpostRoadShieldReferences:[e.signpost.exitIconReference]}}},parseInstruction=(e,t,a,o)=>({maneuverPoint:t,pathPointIndex:a,routeOffsetInMeters:e.routeOffsetInMeters,maneuver:e.maneuver?MANEUVER_MAP[e.maneuver]??e.maneuver:e.maneuver,routePath:(e.routePath??[]).map(e=>({point:e.point.coordinates,distanceInMeters:e.distanceFromRouteStartInMeters,travelTimeInSeconds:e.travelTimeFromRouteStartInSeconds})),nextRoadInfo:e.nextRoadInformation?parseInstructionRoadInformation(e.nextRoadInformation):EMPTY_ROAD_INFO,previousRoadInfo:e.previousRoadInformation?parseInstructionRoadInformation(e.previousRoadInformation):EMPTY_ROAD_INFO,...parseManeuverExtras(e),...parseRoadShieldFields(e,o),...parseTollAndCrossing(e)}),parseGuidance=(e,t,a)=>{const o=[];let r=0;for(const n of e){const e=n.maneuverPoint.coordinates;for(let a=r;a<t.length;a++)if(similar(t[a],e)){r=a;break}o.push(parseInstruction(n,e,r,a))}return{instructions:o}},calculateRouteTemplate={requestValidation:routeRequestValidationConfig,buildRequest:e=>{const t=e.locations.map(getRoutePlanningLocationType).includes("path"),a=((e,t)=>{const a=[];for(const o of e)if("waypoint"===getRoutePlanningLocationType(o)){const e=getRouteStopOptions(o),r=e?.candidateEntryPoints?.length?"ignore":t,[n,i]=getPositionStrict(o,{useEntryPoint:r});a.push({coordinate:[n,i],...e&&{options:e}})}else a.push(...expandPathToStops(o));return a})(e.locations,e.useEntryPoints),o=(e=>{const t={type:"Point",coordinates:e[0].coordinate},a={type:"Point",coordinates:(e.at(-1)??e[0]).coordinate},o=e.slice(1,-1);return{origin:t,destination:a,...o.length&&{waypoints:{type:"MultiPoint",coordinates:o.map(e=>e.coordinate)}}}})(a),r=(e=>{return{...buildCommonRoutingBody(e),...e.maxAlternatives&&{maxPathAlternativeRoutes:e.maxAlternatives},..."arriveBy"===e.when?.option&&e.when.date&&{arrivalDateTime:e.when.date.toISOString()},...e.guidance&&{guidance:"instructions",instructionPhonetics:"ipa"},...e.costModel?.avoidAreas?.length&&{avoidAreas:(t=e.costModel.avoidAreas,{rectangles:t.map(e=>{const t=bboxFromGeoJSON(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");const[a,o,r,n]=t;return{type:"Feature",bbox:[a,o,r,n],geometry:null}})})},...e.arrivalSide&&{arrivalSidePreference:"curb"===e.arrivalSide?"curbSide":"anySide"}};var t})(e),n=(e=>({...buildCommonServiceRequestHeaders(e),Attributes:buildAttributesHeader(e)}))(e),i=((e,t)=>{const a=e.slice(1).map((t,a)=>({...e[a].legToNext,...toLegRequest(t)}));if(t||!a.every(e=>0===Object.keys(e).length))return a})(a,t),s={routePlanningLocations:o,...r,...i&&{legs:i},...e.vehicle&&buildVehicleBody(e.vehicle)},c=new URL(`${e.commonBaseURL}/maps/orbis/routing/routes/calculate`);return((e,t)=>{t.computeTravelTimeFor&&e.searchParams.set("computeTravelTimeFor",t.computeTravelTimeFor)})(c,e),{method:"POST",url:c,data:s,headers:n}},sendRequest:fetchWith,parseResponse:(e,t)=>{const a=e.routes.map((a,o)=>((e,t,a,o)=>{const r={type:"LineString",coordinates:e.legs.flatMap(e=>e.path.coordinates)};return{type:"Feature",geometry:r,id:generateId(),bbox:bboxFromGeoJSON(r),properties:{index:t,summary:parseSummary(e.summary),sections:parseSections(e,a),...e.instructions?.length&&{guidance:parseGuidance(e.instructions,r.coordinates,o)},...e.progressPoints&&{progress:e.progressPoints.map(e=>({pointIndex:e.pathIndex,distanceInMeters:e.distanceInMeters,travelTimeInSeconds:e.travelDurationInSeconds}))}}}})(a,o,t,e.roadShieldAtlasReference)),o=bboxFromGeoJSON(a);return{type:"FeatureCollection",...o&&{bbox:o},features:a}},parseResponseError:parseRoutingResponseError,apiVersion:3},calculateRoute=async e=>callService(e,calculateRouteTemplate,"Routing"),searchExtraParamsOptional=z.object({filters:placeFiltersSchema.optional(),openingHours:z.string().optional(),timeZone:z.string().optional(),relatedPois:z.string().optional(),minFuzzyLevel:z.number().optional(),maxFuzzyLevel:z.number().optional()}),commonSearchParamsSchema=commonPlacesParamsSchema.extend(searchExtraParamsOptional.shape),lineStringSchema=z.object({type:z.literal("LineString"),coordinates:lineStringCoordsSchema}),routeFeatureSchema=z.object({type:z.literal("Feature"),geometry:lineStringSchema}),positionsArraySchema=lineStringCoordsSchema,routeSchema=z.union([lineStringSchema,routeFeatureSchema,positionsArraySchema]),alongRouteSearchRequestMandatory=z.object({route:routeSchema,maxDetourTimeSeconds:z.number().int().positive()}),alongRouteSearchRequestOptional=z.object({sortBy:z.enum(["detourTime","detourOffset"]).optional()}),alongRouteSearchRequestSchema=commonSearchParamsSchema.extend({...alongRouteSearchRequestMandatory.shape,...alongRouteSearchRequestOptional.shape}),appendCommonSearchParams=(e,t)=>{const a=e.searchParams,{filters:o}=t;appendPlacesLanguageParam(a,t),appendOptionalParam(a,"limit",t.limit),appendByJoiningParamValue(a,"fuelSet",o?.fuelTypes),appendByJoiningParamValue(a,"idxSet",o?.indexes),appendByJoiningParamValue(a,"brandSet",o?.poiBrands),o?.poiCategories&&appendByJoiningParamValue(a,"categorySet",o.poiCategories.map(e=>poiCategoriesToID[e])),appendByJoiningParamValue(a,"connectorSet",o?.connectors),appendByJoiningParamValue(a,"mapcodes",t.mapcodes),appendByJoiningParamValue(a,"extendedPostalCodesFor",t.extendedPostalCodesFor),appendOptionalParam(a,"minPowerKW",o?.minPowerKW),appendOptionalParam(a,"maxPowerKW",o?.maxPowerKW),appendPlaceEnrichmentParams(a,t),appendByJoiningParamValue(a,"entityTypeSet",o?.geographyTypes),appendEVModelVersionParam(a)},alongRouteSearchTemplate={requestValidation:{schema:alongRouteSearchRequestSchema},buildRequest:e=>{const t=new URL((e=>resolvePlacesEndpointUrl(e,`searchAlongRoute/${encodeURIComponent(e.query??"")}.json`))(e));appendCommonSearchParams(t,e);const a=t.searchParams;return a.append("maxDetourTime",String(e.maxDetourTimeSeconds)),appendOptionalParam(a,"sortBy",e.sortBy),appendOptionalParam(a,"spreadingMode","plan"),{url:t,headers:buildPlacesRequestHeaders(e),data:{route:{points:(o=e.route,Array.isArray(o)?{type:"LineString",coordinates:o}:"Feature"===o.type?o.geometry:o).coordinates.map(e=>({lat:e[1],lon:e[0]}))}}};var o},sendRequest:post,parseResponse:e=>toPlacesCollection(e.results.map(parseSearchAPIResult),parseSummaryAPI(e.summary))},fuzzySearchRequestOptional=z.object({minFuzzyLevel:z.number().min(1).max(4).optional(),maxFuzzyLevel:z.number().min(1).max(4).optional(),filters:searchFiltersSchema.optional()}),fuzzySearchRequestSchema=commonSearchParamsSchema.extend(commonGeocodeAndFuzzySearchParamsSchema.extend(fuzzySearchRequestOptional.shape).shape),queryIntentApiToSdk=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:latLonAPIToPosition(e.details)}};break;case"NEARBY":t={...e,details:{position:latLonAPIToPosition({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},fuzzySearchTemplate={requestValidation:{schema:fuzzySearchRequestSchema},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,`search/${encodeURIComponent(e.query??"")}.json`))(e)}`);appendCommonSearchParams(t,e);const a=t.searchParams;return appendOptionalParam(a,"typeahead",e.typeahead),appendSearchCursorParam(a,e.cursor,"FuzzySearch"),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),appendGeoBiasParams(a,e.geoBias),appendOptionalParam(a,"minFuzzyLevel",e.minFuzzyLevel),appendOptionalParam(a,"maxFuzzyLevel",e.maxFuzzyLevel),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.summary.queryIntent?.map(queryIntentApiToSdk);return toPlacesCollection(e.results.map(parseSearchAPIResult),{...parseSummaryAPI(e.summary,{paginated:!0}),...t&&{queryIntent:t}})}},geometrySearchRequestMandatory=z.object({geometries:z.array(z.union([featureCollectionSchema,geometrySchema$1]))}),geometrySearchRequestSchema=commonSearchParamsSchema.extend(geometrySearchRequestMandatory.shape),sdkGeometryToApiGeometries=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:positionToCSVLatLon(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:sampleWithinMaxLength(e.coordinates[0],50).map(e=>positionToCSVLatLon(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const a=bboxFromCoordsArray(e[0]);if(a){const o=Math.abs((a[2]-a[0])*(a[3]-a[1]));t.set(e,o)}}),t=new Map([...t.entries()].sort((e,t)=>t[1]-e[1]).splice(0,50)),[...t.keys()]})(e).flatMap(e=>sdkGeometryToApiGeometries({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>sdkGeometryToApiGeometries({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>sdkGeometryToApiGeometries(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},geometrySearchTemplate={requestValidation:{schema:geometrySearchRequestSchema},buildRequest:e=>{const t=new URL(`${a=e,resolvePlacesEndpointUrl(a,`geometrySearch/${encodeURIComponent(a.query??"")}.json`)}`);var a;return appendCommonSearchParams(t,e),{url:t,headers:buildPlacesRequestHeaders(e),data:{geometryList:e.geometries.flatMap(sdkGeometryToApiGeometries)}}},sendRequest:post,parseResponse:e=>toPlacesCollection(e.results.map(parseSearchAPIResult),parseSummaryAPI(e.summary))},LOOKUP_CONFIG_KEYS=["apiKey","commonBaseURL","language","retry","validateRequest","signal"],withPOICategoryQueryCodes=async e=>{if(!e.filters?.poiCategoryQuery)return e;const{poiCategoryQuery:t,...a}=e.filters,{poiCategories:o}=await resolvePOICategories({...pick(e,LOOKUP_CONFIG_KEYS),filters:castArray(t)});if(!o.length)throw new SDKError(`discoverPlaces: no POI category matches filters.poiCategoryQuery ${JSON.stringify(t)}. Pass it as query to search it as free text, or pick a code with getPOICategories.`,"DiscoverPlaces",{code:"INVALID_REQUEST"});return{...e,filters:{...a,poiCategories:o}}},discoverPlaces=async e=>e.route?(async e=>callService(e,alongRouteSearchTemplate,"AlongRouteSearch"))(await withPOICategoryQueryCodes(e)):e.geometries?(async e=>callService(e,geometrySearchTemplate,"GeometrySearch"))(await withPOICategoryQueryCodes(e)):(async e=>callService(e,fuzzySearchTemplate,"FuzzySearch"))(await withPOICategoryQueryCodes(e)),discoverOnePlace=async e=>fetchFirstPlace("discoverOnePlace",e,discoverPlaces),autocompleteSearchRequestMandatory=z.object({query:z.string()}),autocompleteSearchRequestOptional=z.object({geoBias:pointGeoBiasSchema.optional(),limit:z.number().max(100).optional(),filters:geographicFiltersSchema.optional(),resultTypes:z.array(z.string()).optional()}),autocompleteSearchRequestSchema=autocompleteSearchRequestMandatory.extend(autocompleteSearchRequestOptional.shape),autocompleteSearchTemplate={requestValidation:{schema:autocompleteSearchRequestSchema},buildRequest:e=>{const t=new URL(`${a=e,resolvePlacesEndpointUrl(a,`autocomplete/${encodeURIComponent(a.query)}.json`)}`);var a;const o=t.searchParams;return e.language=e.language??"en-GB",appendPlacesLanguageParam(o,e),appendOptionalParam(o,"limit",e.limit),appendGeoBiasParams(o,e.geoBias),appendByJoiningParamValue(o,"countrySet",e.filters?.countries),appendByJoiningParamValue(o,"resultSet",e.resultTypes),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const{position:t,...a}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:latLonAPIToPosition(t)},radiusMeters:a.radius}},results:(o=e.results,o.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...a}=e;return{...a,category:poiIDsToCategories[Number(t)]}}return e})})))};var o}},autocompleteSearch=async e=>callService(e,autocompleteSearchTemplate,"Autocomplete"),namesOf=e=>"category"===e.type&&e.matchedAlternativeName?[e.value,e.matchedAlternativeName]:[e.value],findConceptSegment=(e,t)=>{const a=t.flatMap(({segments:t})=>{const[a]=t;return 1===t.length&&"plaintext"!==a.type&&namesOf(a).some(t=>((e,t)=>{const a=foldedWords(t).join(""),o=foldedWords(e);return""!==a&&o.some((e,t)=>o.slice(t).join("").startsWith(a))})(t,e))?[a]:[]});return a.find(t=>namesOf(t).some(t=>((e,t)=>{const[a,...o]=foldedWords(t);return 0===o.length&&foldedWords(e).some(e=>e.startsWith(a)&&2*a.length>=e.length)})(t,e)))??a[0]},blendSuggestions=({query:e,concept:t,places:a,limit:o})=>{const r=uniqBy(a,e=>e.id),n="none"===t.status?r:partition(r,t=>((e,t)=>{const a=foldedWords(e);return foldedWords(t).every(e=>a.some(t=>t.startsWith(e)))})(t.title,e)).flat();return[..."shown"===t.status?[t.suggestion]:[],...n].slice(0,o)},REFINEMENT_KINDS={brand:!0,category:!0},isRefinementKind=e=>e in REFINEMENT_KINDS,INDEXES_BY_PLACE_KIND={place:["POI"],address:["PAD","Addr","XStr"],street:["Str"],area:["Geo"]},KIND_BY_PLACE_TYPE={POI:"place",Street:"street",Geography:"area","Point Address":"address","Address Range":"address","Cross Street":"address"},distanceFrom=(e,t)=>e.properties.distance??(t&&distance(t,e.geometry.coordinates,{units:"meters"})),toPlaceSuggestions=(e,t)=>{const a=getPosition(t)??void 0,o=((e,t)=>{if(t)return minBy(e,e=>distanceFrom(e,t))?.properties.address.countryCode;const a=countBy(e,e=>e.properties.address.countryCode);return maxBy(Object.keys(a),e=>a[e])})(e,a);return e.map(e=>((e,t,a)=>{const{type:o,address:r,poi:n}=e.properties,i=r.freeformAddress.split(", ").filter(Boolean),[s="",...c]=n?.name?[n.name,...i]:i,l=r.countryCode!==t?r.country:void 0;return{kind:KIND_BY_PLACE_TYPE[o],id:String(e.id),title:s,subtitles:l?[...c,l]:c,distanceInMeters:distanceFrom(e,a),resolve:async()=>({...e,properties:omit(e.properties,["distance","score"])})}})(e,o,a))},throwAsSearchSuggestionsError=e=>{if(e instanceof SDKAbortError)throw new SDKAbortError("SearchSuggestions",e.cause);if(e instanceof SDKServiceError)throw new SDKServiceError(e.message,"SearchSuggestions",e.status,{apiErrorCode:e.apiErrorCode});if(e instanceof SDKError)throw new SDKError(e.message,"SearchSuggestions",{code:e.code,issues:e.issues,cause:e.cause});throw e},toRefinement=(e,t)=>{const a="brand"===e.type?{poiBrands:[e.value]}:{poiCategories:[e.category]},o={...t,filters:{...t.filters,...a}},r={title:e.value,refineParams:o,refine:e=>discoverPlaces({...o,...e&&{signal:e}})};return"brand"===e.type?{...r,kind:"brand"}:{...r,kind:"category",category:e.category}},toRefinementSuggestions=(e,t)=>uniqBy(e.flatMap(e=>e.segments.flatMap(e=>"plaintext"===e.type?[]:[toRefinement(e,t)])),e=>`${e.kind}:${e.title}`),pickConcept=(e,t,a,o)=>{const r=findConceptSegment(e,t);return r?"brand"!==r.type||((e,t)=>{const a=foldedWords(e).join("");return t.slice(0,5).some(e=>e.properties.poi?.brands?.some(e=>foldedWords(e).join("")===a))})(r.value,a)?{status:"shown",suggestion:toRefinement(r,o)}:{status:"withheld"}:{status:"none"}},getSearchSuggestions=async e=>{const{query:t,limit:a,filters:o,geoBias:r,signal:n,...i}=e,s=o?.countries,c=Math.max(1,Math.min(a??5,10)),{placeKinds:l,refinementKinds:d,wantsPlaces:u,wantsRefinements:p}=(e=>{const t=e?.filter(e=>!isRefinementKind(e)),a=e?.filter(isRefinementKind);return{placeKinds:t,refinementKinds:a,wantsPlaces:!e||Boolean(t?.length),wantsRefinements:!e||Boolean(a?.length)}})(o?.kinds),m=r&&{position:r.position},g=(o?.boundingBox&&{boundingBox:o.boundingBox})??m,y={...omit(i,["onAPIRequest","onAPIResponse"]),query:"",...s&&{filters:{countries:s}},geoBias:g},h={...i,signal:n,query:t,limit:10,typeahead:!0,geoBias:g,filters:{countries:s,indexes:l?.flatMap(e=>INDEXES_BY_PLACE_KIND[e]),poiCategories:o?.poiTypes,geographyTypes:o?.areaTypes}},[S,R]=await Promise.all([u?discoverPlaces(h):void 0,p?autocompleteSearch({...i,signal:n,query:t,limit:c,...s&&{filters:{countries:s}},geoBias:m,resultTypes:d??["brand","category"]}):void 0]).catch(throwAsSearchSuggestionsError),T=R?.results??[];if(!u)return{suggestions:toRefinementSuggestions(T,y).slice(0,c)};const f=(S?.features??[]).filter(e=>!l||l.includes(KIND_BY_PLACE_TYPE[e.properties.type]));return{suggestions:blendSuggestions({query:t,concept:pickConcept(t,T,f,y),places:toPlaceSuggestions(f,r?.position),limit:c})}},addDays=(e,t)=>{const a=new Date(e);return a.setUTCDate(a.getUTCDate()+t),a},daysAgo=e=>addDays(/* @__PURE__ */new Date,-e),toDateString=e=>e instanceof Date?e.toISOString().slice(0,10):e,startOfDayUTC=e=>Date.parse(toDateString(e)),OFFSET=/(?:Z|[+-]\d{2}:\d{2})$/,parseDateTime=e=>new Date(OFFSET.test(e)?e:`${e}Z`),functionalRoadClasses=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],API_NAMES_BY_METRIC_KEY={speed:{dataType:"SPEED",field:"v"},freeFlowSpeed:{dataType:"FREE_FLOW_SPEED",field:"fv"},congestionLevel:{dataType:"CONGESTION_LEVEL",field:"c"},travelTime:{dataType:"TRAVEL_TIME",field:"t"},networkLength:{dataType:"NETWORK_LENGTH",field:"l"}},ALL_HOURS=Array.from({length:24},(e,t)=>t),frcToNumber=e=>functionalRoadClasses.indexOf(e),parseMetricFields=(e,t)=>{const a={};return areaAnalyticsMetricKeys.forEach(o=>{const r=e[API_NAMES_BY_METRIC_KEY[o].field];void 0!==r&&(a[o]=t(r))}),a},parseMetrics=e=>parseMetricFields(e,e=>e),parseMetricKey=e=>areaAnalyticsMetricKeys.find(t=>API_NAMES_BY_METRIC_KEY[t].dataType===e),parsePeriodStart=e=>{const t=parseDateTime(e);return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,date:new Date(startOfDayUTC(t)),hour:t.getUTCHours()}},IDENTIFIERS_BY_GRANULARITY={yearly:({year:e})=>({year:e}),monthly:({year:e,month:t})=>({year:e,month:t}),weekly:({date:e})=>(e=>{const t=addDays(e,4-(e.getUTCDay()||7)),a=t.getUTCFullYear(),o=(t.getTime()-Date.UTC(a,0,1))/864e5;return{year:a,week:Math.floor(o/7)+1}})(e),daily:({date:e})=>({date:e}),hourly:({date:e,hour:t})=>({date:e,hour:t})},parseCalendarEntries=(e,t)=>e.map(e=>({...IDENTIFIERS_BY_GRANULARITY[t](parsePeriodStart(e.time)),...parseMetrics(e)})),DAY_BY_API_DAY_OF_WEEK={MONDAY:1,TUESDAY:2,WEDNESDAY:3,THURSDAY:4,FRIDAY:5,SATURDAY:6,SUNDAY:7},parseAverageEntry=e=>{const[t,a]=e.time.split("-"),o=Object.hasOwn(DAY_BY_API_DAY_OF_WEEK,t)?DAY_BY_API_DAY_OF_WEEK[t]:void 0;return void 0===o?void 0:{day:o,hour:Number(a),...parseMetrics(e)}},hourOfWeek=({day:e,hour:t})=>24*(e-1)+t,parseTileEntry=e=>({tileCentre:[e.lon,e.lat],...parseMetrics(e)}),parseAnomaly=e=>({startDate:parseDateTime(e.startDate),endDate:parseDateTime(e.endDate),labels:e.labels.map(({name:e})=>e)}),parseTimedData=e=>{return{...e.yearly&&{yearly:parseCalendarEntries(e.yearly,"yearly")},...e.monthly&&{monthly:parseCalendarEntries(e.monthly,"monthly")},...e.weekly&&{weekly:parseCalendarEntries(e.weekly,"weekly")},...e.daily&&{daily:parseCalendarEntries(e.daily,"daily")},...e.hourly&&{hourly:parseCalendarEntries(e.hourly,"hourly")},...e.average&&{average:(t=e.average,t.map(parseAverageEntry).filter(e=>void 0!==e).sort((e,t)=>hourOfWeek(e)-hourOfWeek(t)))}};var t},parseAnomalies=e=>parseMetricFields(e,e=>e.map(parseAnomaly)),parseFeature=e=>{return{type:e.type,id:e.id,geometry:e.geometry,properties:(t=e.properties,{...void 0!==t.name&&{name:t.name},...void 0!==t.timezone&&{timezone:t.timezone},level:t.level,baseData:parseMetrics(t.baseData),timedData:parseTimedData(t.timedData),...t.tiledData&&{tiledData:{tiles:t.tiledData.tiles.map(parseTileEntry)}},...t.anomalies&&{anomalies:parseAnomalies(t.anomalies)}}),bbox:bboxFromGeoJSON(e.geometry)};var t},computeTileRanges=e=>{const t=e.flatMap(e=>e.properties.tiledData?.tiles??[]),a={};for(const o of areaAnalyticsMetricKeys){const e=t.map(e=>e[o]).filter(e=>null!=e);e.length>0&&(a[o]={min:Math.min(...e),max:Math.max(...e)})}return a},parseAnalysisPeriod=e=>{const t=e.map(startOfDayUTC);return{startDate:new Date(Math.min(...t)),endDate:new Date(Math.max(...t))}},dateInputSchema=z.union([z.date(),z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]),geometrySchema=z.union([z.object({type:z.literal("Polygon"),coordinates:z.array(z.array(z.array(z.number()))).min(1)}),z.object({type:z.literal("MultiPolygon"),coordinates:z.array(z.array(z.array(z.array(z.number())))).min(1)})]),isAccepted=e=>startOfDayUTC(e)<=startOfDayUTC(daysAgo(2)),trafficAreaAnalyticsTemplate={requestValidation:{schema:commonServiceRequestSchema.extend({name:z.string().optional(),startDate:dateInputSchema.optional(),endDate:dateInputSchema.optional(),days:z.array(dateInputSchema).min(1).optional(),metrics:z.union([z.array(z.enum(areaAnalyticsMetricKeys)).min(1),z.literal("all")]),functionalRoadClasses:z.union([z.array(z.enum(functionalRoadClasses)).min(1),z.literal("all")]),hours:z.union([z.array(z.number().int().min(0).max(23)).min(1),z.literal("all")]),geometry:geometrySchema}).refine(e=>{const t=void 0!==e.days,a=void 0!==e.startDate;if(t&&a)return!1;if(!t&&!a)return!1;if(void 0!==e.startDate){const t=e.endDate??daysAgo(3),a=(startOfDayUTC(t)-startOfDayUTC(e.startDate))/864e5;return a>=1&&a<=31}return!0},{message:"Provide either startDate (with optional endDate, at least 1 day apart and within 31 days) or days — but not both"}).refine(e=>void 0!==e.days?e.days.every(isAccepted):void 0===e.endDate||isAccepted(e.endDate),{message:"Dates must be at least 2 days before today"})},buildRequest:e=>{const t=new URL((e=>`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));((e,t)=>{e.append("apiVersion",String(t.apiVersion)),t.apiKey&&e.append("key",t.apiKey),t.language&&e.append("language",t.language)})(t.searchParams,e);const a=Array.isArray(e.days)?{days:e.days.map(toDateString)}:{startDate:toDateString(e.startDate??daysAgo(4)),endDate:toDateString(e.endDate??daysAgo(3))};return{method:"POST",url:t,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...a,dataTypes:("all"===e.metrics?areaAnalyticsMetricKeys:e.metrics).map(e=>API_NAMES_BY_METRIC_KEY[e].dataType),frcs:"all"===e.functionalRoadClasses?functionalRoadClasses.map((e,t)=>t):e.functionalRoadClasses.map(frcToNumber),hours:"all"===e.hours?ALL_HOURS:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},sendRequest:fetchWith,parseResponse:e=>{const t=e.features.map(parseFeature);return{type:"FeatureCollection",properties:{...parseAnalysisPeriod(e.properties.days),metrics:e.properties.dataTypes.map(parseMetricKey).filter(e=>void 0!==e),heatmap:e.properties.heatmap,frcs:e.properties.frcs,ranges:computeTileRanges(t)},features:t}}},trafficAreaAnalytics=async e=>callService(e,trafficAreaAnalyticsTemplate,"TrafficAreaAnalytics"),DEFAULT_ATTRIBUTES=["incidents.type","incidents.geometry.type","incidents.geometry.coordinates",...Object.keys({id:!0,iconCategory:!0,magnitudeOfDelay:!0,"events.description":!0,"events.code":!0,"events.iconCategory":!0,startTime:!0,endTime:!0,from:!0,to:!0,lengthInMeters:!0,delayInSeconds:!0,roadNumbers:!0,timeValidity:!0,probabilityOfOccurrence:!0,numberOfReports:!0,lastReportTime:!0}).map(e=>`incidents.properties.${e}`)].join(","),parseEvent=e=>({description:e.description,code:e.code,category:toTrafficIncidentCategory(e.iconCategory)}),parseIncident=e=>{const t=e.properties;return{type:"Feature",id:t.id,geometry:e.geometry,properties:{id:t.id,category:toTrafficIncidentCategory(t.iconCategory),magnitudeOfDelay:toDelayMagnitude(t.magnitudeOfDelay),events:(t.events??[]).map(parseEvent),...t.startTime&&{startTime:new Date(t.startTime)},...t.endTime&&{endTime:new Date(t.endTime)},...t.from&&{from:t.from},...t.to&&{to:t.to},...null!=t.lengthInMeters&&{lengthInMeters:t.lengthInMeters},...null!=t.delayInSeconds&&{delayInSeconds:t.delayInSeconds},...t.roadNumbers&&{roadNumbers:t.roadNumbers},timeValidity:t.timeValidity,...t.probabilityOfOccurrence&&{probabilityOfOccurrence:t.probabilityOfOccurrence},...null!=t.numberOfReports&&{numberOfReports:t.numberOfReports},...t.lastReportTime&&{lastReportTime:new Date(t.lastReportTime)}}}},withoutBBox=e=>"Polygon"===e.type?{type:"Polygon",coordinates:e.coordinates}:{type:"MultiPolygon",coordinates:e.coordinates},incidentsIntersecting=(e,t)=>{const a=(e=>"FeatureCollection"===e.type?e.features.map(e=>e.geometry):["Feature"===e.type?e.geometry:e])(t).map(withoutBBox).map(e=>({geometry:e,bbox:bbox(e)}));return e.filter(e=>{const t=bbox(e.geometry);return a.some(a=>{return o=t,r=a.bbox,o[0]<=r[2]&&r[0]<=o[2]&&o[1]<=r[3]&&r[1]<=o[3]&&booleanIntersects(e.geometry,a.geometry);var o,r})})},positionSchema=z.array(z.number()).min(2,"a position needs at least two coordinates"),linearRingSchema=z.array(positionSchema).min(4,"a linear ring needs at least four positions"),polygonCoordinatesSchema=z.array(linearRingSchema).min(1,"a Polygon needs at least one ring"),polygonGeometrySchema=z.discriminatedUnion("type",[z.object({type:z.literal("Polygon"),coordinates:polygonCoordinatesSchema}),z.object({type:z.literal("MultiPolygon"),coordinates:z.array(polygonCoordinatesSchema).min(1,"a MultiPolygon needs at least one polygon")})]),polygonFeatureSchema=z.object({type:z.literal("Feature"),geometry:polygonGeometrySchema,id:z.union([z.string(),z.number()]).optional(),properties:z.unknown().optional()}),polygonSchema=z.union([polygonGeometrySchema,polygonFeatureSchema,z.object({type:z.literal("FeatureCollection"),features:z.array(polygonFeatureSchema).min(1,"a FeatureCollection polygon needs at least one feature")})]),trafficIncidentDetailsTemplate={requestValidation:{schema:commonServiceRequestSchema.extend({bbox:hasBBoxSchema.optional(),polygon:polygonSchema.optional(),ids:z.array(z.string()).min(1,"ids must contain at least one id").optional(),categoryFilter:z.array(z.enum(trafficIncidentRequestCategories)).optional(),timeValidityFilter:z.array(z.enum(trafficIncidentTimeValidities)).optional()}),refinements:[{check:e=>1===[e.bbox,e.polygon,e.ids].filter(Boolean).length,message:"Provide exactly one of bbox, polygon or ids"}]},apiVersion:2,buildRequest:e=>{const t=new URL((e=>`${e.commonBaseURL}/maps/orbis/traffic/incidents/details`)(e)),a=t.searchParams;((e,t)=>{appendByJoiningParamValue(e,"iconCategories",t.categoryFilter?.map(toIconCategory)),appendByJoiningParamValue(e,"timeValidity",t.timeValidityFilter)})(a,e);const o=(e=>({...buildCommonServiceRequestHeaders(e),Attributes:DEFAULT_ATTRIBUTES}))(e);if(e.ids){const{ids:r}=e;return r.length>5?{method:"POST",url:t,headers:o,data:{ids:r}}:(a.append("ids",r.join(",")),{method:"GET",url:t,headers:o})}const r=e.polygon?bbox(e.polygon,{recompute:!0}):bboxFromGeoJSON(e.bbox);return r&&a.append("bbox",r.join(",")),{method:"GET",url:t,headers:o}},sendRequest:fetchWith,parseResponse:(e,t)=>{const a=(e.incidents??[]).filter(e=>null!==e).map(parseIncident);return{type:"FeatureCollection",features:t?.polygon?incidentsIntersecting(a,t.polygon):a}}},trafficIncidentDetails=async e=>callService(e,trafficIncidentDetailsTemplate,"TrafficIncidentDetails");export{APIErrorCode,SDKAbortError,SDKError,SDKServiceError,arrivalSides,calculateReachableRange,calculateReachableRanges,calculateRoute,createLatestRequest,discoverOnePlace,discoverPlaces,functionalRoadClasses,geocode,geocodeOne,geometryData,getPOICategories,getPOICategoryCodes,getPlaceDetails,getSearchSuggestions,resolvePOICategories,reverseGeocode,routeTypes,tollTransponderOptions,trafficAreaAnalytics,trafficIncidentDetails};
|
|
1
|
+
import{areaAnalyticsMetricKeys,avoidableTypes,bboxFromGeoJSON,bboxLongitudeSpan,bboxOnlyIfWithArea,budgetTypes,canRetrySDKErrorCode,clamp,connectorTypes,generateId,generateTomTomHeaders,geographyTypes,geometrySectionTypes,geopoliticalViews,getDistinctSections,getPosition,getPositionStrict,getRoutePlanningLocationType,inputSectionTypesWithGuidance,insecureBaseURLMessage,isProxyCredentialsMode,isSecureBaseURL,mergeFromGlobal,pickKeys,placesLanguage,poiCategories,poiCategoriesLanguage,poiCategoriesToID,poiIDsToCategories,sdkErrorCodeForStatus,servesGeopoliticalView,serviceLanguage,toPointGeometry,trafficIncidentLanguage,trafficIncidentRequestCategories,trafficIncidentTimeValidities,withCurveSections}from"@tomtom-org/maps-sdk/core";import{isNil,isObject}from"lodash-es";import{z}from"zod";import{bbox,booleanIntersects,distance}from"@turf/turf";var FetchError=class FetchError extends Error{constructor(e,t,a){super(t??`HTTP Error ${e}`),this.name="FetchError",this.status=e,this.data=a,Error.captureStackTrace&&Error.captureStackTrace(this,FetchError)}},NetworkError=class extends Error{constructor(e){super(e instanceof Error?e.message:"Network request failed",{cause:e}),this.name="NetworkError"}},fetchOrNetworkError=(e,t)=>fetch(e,t).catch(e=>{throw t.signal?.aborted?e:new NetworkError(e)}),returnOrThrow=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,a;const o=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:o?.includes("application/json")?(a=await e.json().catch(()=>{}),t=a?.errorText??a?.message??a?.detailedError?.message):o?.includes("text/xml")&&(a=await e.text(),t=e.statusText),new FetchError(e.status,t,a)},sleep=(e,t)=>new Promise((a,o)=>{if(t?.aborted)return void o(t.reason);const r=()=>{clearTimeout(n),o(t?.reason)},n=setTimeout(()=>{t?.removeEventListener("abort",r),a()},e);t?.addEventListener("abort",r,{once:!0})}),fetchWithRetry=async(e,t)=>{if(!t?.retry)return e();const{signal:a,retry:o}=t,{initialWaitMs:r,backoffFactor:n,timeoutMs:i}=o,s=Date.now();let c=r,l=await e();for(;429===l.status;){const t=Number.parseInt(l.headers.get("retry-after")??"",10),o=Number.isFinite(t)?1e3*t:c*(.5+.5*Math.random());if(Date.now()-s+o>i)break;await l.text().catch(()=>{}),await sleep(o,a),c*=n,l=await e()}return l},withRequestOptions=(e,t)=>(t?.credentials&&(e.credentials=t.credentials),t?.signal&&(e.signal=t.signal),e),get=async(e,t,a)=>returnOrThrow(await fetchWithRetry(()=>{const{url:o,headers:r}=e instanceof URL?{url:e,headers:void 0}:e;return fetchOrNetworkError(o,withRequestOptions({headers:{...t,...r}},a))},a)),post=async(e,t,a)=>returnOrThrow(await fetchWithRetry(()=>fetchOrNetworkError(e.url,withRequestOptions({method:"POST",body:JSON.stringify(e.data),headers:{...t,...e.headers,"Content-Type":"application/json"}},a)),a)),SDKError=class SDKError extends Error{constructor(e,t,a){super(e,"cause"in a?{cause:a.cause}:void 0),this.service=t,this.sdkVersion="1.0.0-rc.4",this.code=a.code,this.canRetry=canRetrySDKErrorCode(a.code),this.issues=a.issues,Error.captureStackTrace&&Error.captureStackTrace(this,SDKError)}},APIErrorCode=/* @__PURE__ */(()=>({429:"Too Many Requests: The API Key is over QPS (Queries per second)"}))(),SDKServiceError=class extends SDKError{constructor(e,t,a,o){super(e,t,{code:a?sdkErrorCodeForStatus(a):"INTERNAL"}),this.status=a,this.apiErrorCode=o?.apiErrorCode,this.privatePreviewAccess=o?.privatePreviewAccess,this.status&&APIErrorCode[this.status]&&(this.message=APIErrorCode[this.status])}},SDKAbortError=class extends SDKError{constructor(e,t){super("The operation was aborted.",e,{code:"ABORTED",cause:t}),this.name="AbortError"}},parseRoutingResponseError=(e,t)=>{const{data:a,message:o,status:r}=e;return new SDKServiceError(a?.error?.description??a?.detailedError?.message??o,t,r,{apiErrorCode:a?.detailedError?.code})},wrapError=(e,t,a)=>new SDKError(e instanceof Error?e.message:String(e),t,{code:a,cause:e}),fetchFirstPlace=async(e,t,a,o)=>{const r="string"==typeof a?{query:a}:a,[n]=(await o({...r,limit:1})).features;if(!n){const a=r.query?` for "${r.query}"`:"";throw new SDKError(`${e}: no results found${a}`,t,{code:"NOT_FOUND"})}return n},commonServiceRequestSchema=/* @__PURE__ */(()=>z.object({apiKey:z.string().optional(),commonBaseURL:z.string().optional(),language:z.string().optional()}))(),commonServiceParameters={apiKey:!0,commonBaseURL:!0,language:!0,geopoliticalView:!0,sendUserAgentHeader:!0,retry:!0,validateRequest:!0,onAPIRequest:!0,onAPIResponse:!0,signal:!0,"tomtom-user-agent":!0},unknownParameterMessage=(e,t,a)=>{const o=t&&((e,t)=>Object.entries(t.shape).find(([,t])=>{const a=(e=>e instanceof z.ZodOptional?e.unwrap():e)(t);return a instanceof z.ZodObject&&Object.hasOwn(a.shape,e)})?.[0])(e,t),r=`${e} is not a parameter of ${a}.`;return o?`${r} Did you mean ${o}.${e}?`:r},formatZodIssue=e=>{const t=e.path.length>0?`${e.path.join(".")}: `:"";return"invalid_union"===e.code&&e.errors.length?`${t}no matching union member (${e.errors.map((e,t)=>`option[${t}]: { ${e.map(formatZodIssue).join(", ")} }`).join(" | ")})`:`${t}${e.message}`},ValidationError=class extends Error{constructor(e){super(`${e.map(formatZodIssue).join("; ")}\nIssues: ${JSON.stringify(e,null,2)}`),this.issues=e}},throwIfAborted=(e,t)=>{if(e?.aborted)throw new SDKAbortError(t,e.reason)},throwIfInsecureBaseURL=(e,t)=>{if(!isSecureBaseURL(e))throw new SDKError(insecureBaseURLMessage(e),t,{code:"INSECURE_BASE_URL"})},validateServiceRequest=(e,t,a,o)=>{if(!1!==t.validateRequest)try{((e,t,a=[])=>{const o=(t?.schema?commonServiceRequestSchema.extend(t.schema.shape):commonServiceRequestSchema).superRefine((a,o)=>{if(a.commonBaseURL||o.addIssue({code:"custom",message:"commonBaseURL is required"}),t?.refinements?.length)for(const r of t.refinements)r.check(e)||o.addIssue({code:"custom",message:r.message})}).safeParse(e),r=o.success?a:[...a,...o.error.issues];if(r.length)throw new ValidationError(r)})(t,a,((e,t,a)=>Object.entries(e).filter(([e,a])=>!(void 0===a||Object.hasOwn(commonServiceParameters,e)||t&&Object.hasOwn(t.shape,e))).map(([e])=>({code:"unrecognized_keys",keys:[e],path:[],message:unknownParameterMessage(e,t,a)})))(e,a?.schema,o))}catch(r){throw((e,t)=>new SDKError(e.message,t,{code:"INVALID_REQUEST",issues:e.issues}))(r,o)}},callService=async(e,t,a)=>{throwIfAborted(e.signal,a);const o={...mergeFromGlobal(e),apiVersion:t.apiVersion??1};let r;throwIfInsecureBaseURL(o.commonBaseURL,a),validateServiceRequest(e,o,t.requestValidation,a);try{r=t.buildRequest(o)}catch(l){throw((e,t,a)=>e instanceof SDKError?e:wrapError(e,t,a?"INTERNAL":"INVALID_REQUEST"))(l,a,!1!==o.validateRequest)}const n=generateTomTomHeaders(o);e.onAPIRequest?.(r);const i=o=>{const r=((e,t,a,o)=>o?.aborted&&e===o.reason||o?.aborted&&isObject(e)&&"name"in e&&"AbortError"===e.name?new SDKAbortError(t,o.reason):(e=>isObject(e)&&"status"in e&&!!e.status)(e)?a?a(e,t):((e,t)=>{const{data:a,message:o,status:r}=e;return new SDKServiceError(a?.error||a?.errorText||o,t,r,{apiErrorCode:a?.detailedError?.code})})(e,t):e instanceof NetworkError?new SDKError(e.message,t,{code:"NETWORK_NOT_AVAILABLE",cause:e.cause}):wrapError(e,t,"INTERNAL"))(o,a,t.parseResponseError,e.signal),{releaseStage:n}=t;return"private-preview"===n?.stage?n.withAccess(r,n.access):r},s={signal:e.signal,retry:o.retry,...isProxyCredentialsMode(o)&&{credentials:"include"}};let c;try{c=await(await t.sendRequest(r,n,s)).data}catch(l){throw e.onAPIResponse?.(r,l),i(l)}e.onAPIResponse?.(r,c);try{return t.parseResponse(c,o)}catch(l){throw i(l)}},searchCursorStateSchema=/* @__PURE__ */(()=>z.object({ofs:z.number().int().nonnegative()}))(),CURSOR_ERROR_MESSAGE="The `cursor` is not one this SDK can read. Pass back the `nextCursor` from a previous response rather than constructing one.",BASE64_ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",readCursorState=e=>searchCursorStateSchema.safeParse((e=>{const t=(e=>{if(e.length%4!=0||!/^[A-Za-z0-9+/]*={0,2}$/.test(e))return;let t="";for(let a=0;a<e.length;a+=4){const[o,r,n,i]=Array.from(e.slice(a,a+4),e=>BASE64_ALPHABET.indexOf(e)),s=o<<18|r<<12|Math.max(n,0)<<6|Math.max(i,0);t+=String.fromCodePoint(s>>16&255),n>=0&&(t+=String.fromCodePoint(s>>8&255)),i>=0&&(t+=String.fromCodePoint(255&s))}return t})(e);if(void 0!==t)try{return JSON.parse(t)}catch{return}})(e)).data,searchCursorSchema=/* @__PURE__ */(()=>z.string().refine(e=>!!readCursorState(e),CURSOR_ERROR_MESSAGE))(),appendSearchCursorParam=(e,t,a)=>{void 0!==t&&e.append("ofs",String(((e,t)=>{const a=readCursorState(e);if(!a)throw new SDKError(CURSOR_ERROR_MESSAGE,t,{code:"INVALID_REQUEST"});return a.ofs})(t,a)))},positionSchema=/* @__PURE__ */(()=>z.array(z.number()).min(2,"a position needs at least two coordinates"))(),lineStringCoordsSchema=/* @__PURE__ */(()=>z.array(positionSchema))(),longitudeSchema=/* @__PURE__ */(()=>z.number().min(-180).max(180))(),latitudeSchema=/* @__PURE__ */(()=>z.number().min(-90).max(90))(),lngLatSchema=/* @__PURE__ */(()=>z.union([z.tuple([longitudeSchema,latitudeSchema]),z.tuple([longitudeSchema,latitudeSchema,z.number()])]))(),isLngLatInRange=([e,t])=>Math.abs(e)<=180&&Math.abs(t)<=90,lngLatRangeMessage=e=>`${e} needs a longitude from -180 to 180 and a latitude from -90 to 90`,positionsInRangeSchema=(e,t,a)=>lineStringCoordsSchema.min(e,t).refine(e=>e.every(isLngLatInRange),lngLatRangeMessage(`every ${a} position`)),optionalGeoJSONBBoxSchema=/* @__PURE__ */(()=>z.array(z.number()).refine(e=>4===e.length||6===e.length,"a GeoJSON bbox needs 4 or 6 elements").optional())(),geometryWithBBoxSchema=(e,t)=>z.object({type:z.literal(e),coordinates:t,bbox:optionalGeoJSONBBoxSchema}),pointSchema=/* @__PURE__ */(()=>z.object({type:z.literal("Point"),coordinates:lngLatSchema}))(),lineStringSchema$1=/* @__PURE__ */(()=>geometryWithBBoxSchema("LineString",lineStringCoordsSchema))(),linesCoordsSchema=/* @__PURE__ */(()=>z.array(lineStringCoordsSchema))(),geometrySchema=/* @__PURE__ */(()=>z.discriminatedUnion("type",[geometryWithBBoxSchema("Point",lngLatSchema),geometryWithBBoxSchema("MultiPoint",lineStringCoordsSchema),lineStringSchema$1,geometryWithBBoxSchema("MultiLineString",linesCoordsSchema),geometryWithBBoxSchema("Polygon",linesCoordsSchema),geometryWithBBoxSchema("MultiPolygon",z.array(linesCoordsSchema))]))(),geometryCollectionSchema=/* @__PURE__ */(()=>z.object({type:z.literal("GeometryCollection"),geometries:z.array(geometrySchema),bbox:optionalGeoJSONBBoxSchema}))(),linearRingSchema=/* @__PURE__ */(()=>positionsInRangeSchema(4,"a linear ring needs at least four positions","polygon"))(),polygonCoordinatesSchema=/* @__PURE__ */(()=>z.array(linearRingSchema).min(1,"a Polygon needs at least one ring"))(),polygonGeometrySchema=/* @__PURE__ */(()=>z.discriminatedUnion("type",[z.object({type:z.literal("Polygon"),coordinates:polygonCoordinatesSchema}),z.object({type:z.literal("MultiPolygon"),coordinates:z.array(polygonCoordinatesSchema).min(1,"a MultiPolygon needs at least one polygon")})]))(),optionalIdSchema=/* @__PURE__ */(()=>z.optional(z.union([z.string(),z.number()])))(),optionalPropertiesSchema=/* @__PURE__ */(()=>z.unknown().optional())(),featureSchemaOf=(e,t)=>z.object({type:z.literal("Feature"),geometry:e,id:optionalIdSchema,properties:t,bbox:optionalGeoJSONBBoxSchema}),featureSchema=/* @__PURE__ */(()=>featureSchemaOf(z.union([geometrySchema,geometryCollectionSchema]),optionalPropertiesSchema))(),featureCollectionSchema=/* @__PURE__ */(()=>z.object({type:z.literal("FeatureCollection"),features:z.array(featureSchema),id:optionalIdSchema,properties:optionalPropertiesSchema,bbox:optionalGeoJSONBBoxSchema}))(),hasLngLatSchemaWithProperties=e=>z.union([lngLatSchema,pointSchema,featureSchemaOf(pointSchema,e)]),hasLngLatSchema=/* @__PURE__ */(()=>hasLngLatSchemaWithProperties(optionalPropertiesSchema))(),bboxSchema=/* @__PURE__ */(()=>z.array(z.number()).length(4,"a BBox needs 4 elements"))(),geoJSONSchema=/* @__PURE__ */(()=>z.union([geometrySchema,geometryCollectionSchema,featureSchema,featureCollectionSchema]))(),hasBBoxSchema=/* @__PURE__ */(()=>z.union([bboxSchema,geoJSONSchema,z.array(geoJSONSchema)]).refine(e=>!!bboxFromGeoJSON(e),"a bounding box cannot be derived from an empty array or collection"))(),pointGeoBiasSchema=/* @__PURE__ */(()=>z.object({position:hasLngLatSchema,radiusMeters:z.number().optional()}))(),geoBiasSchema=/* @__PURE__ */(()=>z.union([pointGeoBiasSchema,z.object({boundingBox:hasBBoxSchema})]))(),searchIndexTypes={Geo:"Geo",PAD:"PAD",Addr:"Addr",Str:"Str",XStr:"XStr",POI:"POI"},mapcodeTypes={Local:"Local",International:"International",Alternative:"Alternative"},searchIndexTypeSchema=/* @__PURE__ */(()=>z.enum(searchIndexTypes))(),commonPlacesParamsSchema=/* @__PURE__ */(()=>z.object({query:z.string().optional(),limit:z.number().int().min(1).max(100).optional(),extendedPostalCodesFor:z.array(searchIndexTypeSchema).optional(),mapcodes:z.array(z.enum(mapcodeTypes)).optional(),geopoliticalView:z.enum(geopoliticalViews).optional()}))(),geographicFiltersSchema=/* @__PURE__ */(()=>z.object({countries:z.array(z.string()).optional()}))(),geographyTypesFilterSchema=/* @__PURE__ */(()=>z.object({geographyTypes:z.array(z.enum(geographyTypes)).optional()}))(),placeFiltersSchema=/* @__PURE__ */(()=>z.object({poiCategories:z.array(z.enum(poiCategories)).optional(),poiBrands:z.array(z.string()).optional(),indexes:z.array(searchIndexTypeSchema).optional(),geographyTypes:geographyTypesFilterSchema.shape.geographyTypes,connectors:z.array(z.enum(connectorTypes)).optional(),fuelTypes:z.array(z.string()).optional(),minPowerKW:z.number().optional(),maxPowerKW:z.number().optional()}))(),searchFiltersSchema=/* @__PURE__ */(()=>geographicFiltersSchema.extend(placeFiltersSchema.shape))(),commonGeocodeAndFuzzySearchParamsSchema=/* @__PURE__ */(()=>z.object({typeahead:z.boolean().optional(),cursor:searchCursorSchema.optional(),geoBias:geoBiasSchema.optional(),filters:geographicFiltersSchema.optional()}))(),geocodingFiltersSchema=/* @__PURE__ */(()=>geographicFiltersSchema.extend(geographyTypesFilterSchema.shape))(),geocodingRequestSchema=/* @__PURE__ */(()=>commonServiceRequestSchema.extend(commonPlacesParamsSchema.shape).extend(commonGeocodeAndFuzzySearchParamsSchema.shape).extend({query:z.string(),filters:geocodingFiltersSchema.optional(),extendedPostalCodesFor:z.array(searchIndexTypeSchema.exclude(["POI"])).optional()}))(),arrayToCSV=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",distinctBy=(e,t)=>{const a=/* @__PURE__ */new Set;return e.filter(e=>{const o=t(e);return!a.has(o)&&(a.add(o),!0)})},resolvePlacesEndpointUrl=(e,t)=>`${e.commonBaseURL}/maps/orbis/places/${t}`,resolvePlacesQueryEndpointUrl=(e,t,a)=>resolvePlacesEndpointUrl(e,`${t}/${encodeURIComponent(a)}.json`),csvLatLonToPosition=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},positionToCSVLatLon=e=>`${e[1]},${e[0]}`,apiToGeoJSONBBox=e=>{let t,a;return"topLeftPoint"in e?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],a=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=csvLatLonToPosition(e.southWest),a=csvLatLonToPosition(e.northEast)),[t[0],t[1],a[0],a[1]]},latLonAPIToPosition=e=>[e.lon,e.lat],positionToLatLonAPI=e=>({lat:e[1],lon:e[0]}),featureCollectionWithBBox=e=>{const t=bboxFromGeoJSON(e);return{type:"FeatureCollection",...t&&{bbox:t},features:e}},buildCredentialHeaders=e=>({...e.apiKey&&{"TomTom-Api-Key":e.apiKey},...!isNil(e.apiVersion)&&{"TomTom-Api-Version":String(e.apiVersion)}}),buildCommonServiceRequestHeaders=e=>({...buildCredentialHeaders(e),...e.language&&{"Accept-Language":serviceLanguage(e.language)}}),buildPlacesRequestHeaders=e=>buildCredentialHeaders(e),appendLanguageParam=(e,t)=>{t.language&&appendOptionalParam(e,"language",placesLanguage(t.language))},toServedView=(e,t)=>e&&servesGeopoliticalView(e,t)?e:void 0,appendEVModelVersionParam=e=>{e.append("evModelVersion","3")},appendByJoiningParamValue=(e,t,a)=>{Array.isArray(a)&&a.length>0&&e.append(t,a.join(","))},appendOptionalParam=(e,t,a)=>{!isNil(a)&&e.append(t,String(a))},appendPlaceEnrichmentParams=(e,t,a)=>{appendOptionalParam(e,"view",toServedView(t.geopoliticalView,a)),appendOptionalParam(e,"openingHours",t.openingHours),appendOptionalParam(e,"timeZone",t.timeZone),appendOptionalParam(e,"relatedPois",t.relatedPois)},appendGeoBiasParams=(e,t)=>{if(!t)return;if(void 0!==t.position)return((e,t)=>{const a=getPosition(t);a&&(e.append("lat",String(a[1])),e.append("lon",String(a[0])))})(e,t.position),void appendOptionalParam(e,"radius",t.radiusMeters);const a=bboxFromGeoJSON(t.boundingBox);a&&(e.append("topLeft",positionToCSVLatLon([a[0],a[3]])),e.append("btmRight",positionToCSVLatLon([a[2],a[1]])))},toConnectorCounts=e=>{const t=[];for(const a of e)for(const e of a.chargingPoints)for(const a of e.connectors??[]){const e=t.find(e=>{return t=a,o=e.connector,t.type===o.type&&t.ratedPowerKW===o.ratedPowerKW;var t,o});e?e.count++:t.push({connector:a,count:1})}return t},parseMoment=e=>{const{year:t,month:a,day:o}=(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:a,day:o,hour:e.hour,minute:e.minute,date:new Date(t,a-1,o,e.hour,e.minute)}},alwaysOpenInThisPeriod=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,parseOpeningHours=e=>{const t=e.timeRanges.map(e=>({start:parseMoment(e.startTime),end:parseMoment(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:alwaysOpenInThisPeriod(t)}},toPlaceFeatureHead=({position:e,boundingBox:t,id:a})=>({type:"Feature",geometry:toPointGeometry(latLonAPIToPosition(e)),...t&&{bbox:apiToGeoJSONBBox(t)},id:a}),toEntryPoints=e=>e.map(e=>({...e,position:latLonAPIToPosition(e.position)})),parseSearchAPIResult=e=>{const{position:t,entryPoints:a,poi:o,id:r,dist:n,boundingBox:i,viewport:s,chargingStations:c,dataSources:l,...d}=e,{chargingAvailability:p,...u}=l??{},m=c&&c.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,capabilities:e.capabilities??[],restrictions:e.restrictions??[],connectors:e.connectors?.map(e=>{return{...e,chargingSpeed:(t=e.ratedPowerKW,t<12?"slow":t<50?"regular":t<150?"fast":"ultra-fast")};var t})}))}));return{...toPlaceFeatureHead({position:t,boundingBox:i,id:r}),properties:{...d,...void 0!==n&&{distance:n},...Object.keys(u).length>0&&{dataSources:u},...a?.length&&{entryPoints:toEntryPoints(a)},...m?.length&&{chargingPark:{connectors:toConnectorCounts(m),chargingStations:m}},...o&&{poi:{name:o.name,categories:(o.categorySet?.map(e=>poiIDsToCategories[e.id])??[]).filter(e=>!!e),localizedCategories:o.categories??[],...o.phone&&{phone:o.phone},...o.brands&&{brands:o.brands.map(e=>e.name)},...o.url&&{url:o.url},...o.openingHours&&{openingHours:parseOpeningHours(o.openingHours)},...o.timeZone&&{timeZone:o.timeZone}}}}}},toPlacesCollection=(e,t)=>{const a=bboxOnlyIfWithArea(bboxFromGeoJSON(e));return{type:"FeatureCollection",properties:t,features:e,...a&&{bbox:a}}},parseSummaryAPI=(e,t)=>{const a=t?.paginated?(({offset:e,numResults:t,totalResults:a})=>{if(0===t)return;const o=e+t;return o>=a||o>1900?void 0:(e=>{let t="";for(let a=0;a<e.length;a+=3){const o=(e.codePointAt(a)??0)<<16|(e.codePointAt(a+1)??0)<<8|(e.codePointAt(a+2)??0);t+=BASE64_ALPHABET[o>>18&63]+BASE64_ALPHABET[o>>12&63],t+=a+1<e.length?BASE64_ALPHABET[o>>6&63]:"=",t+=a+2<e.length?BASE64_ALPHABET[63&o]:"="}return t})(JSON.stringify({ofs:o}))})(e):void 0,{geoBias:o,offset:r,...n}=e;return{...o&&{geoBias:latLonAPIToPosition(o)},...a&&{nextCursor:a},...n}},knownGeographyTypes=/* @__PURE__ */(()=>new Set(geographyTypes))(),isGeographyType=e=>knownGeographyTypes.has(e),parseApiResult=e=>{const{position:t,boundingBox:a,viewport:o,dist:r,entryPoints:n,addressRanges:i,entityType:s,id:c,...l}=e;return{...toPlaceFeatureHead({position:t,boundingBox:a,id:c}),properties:{...l,...void 0!==r&&{distance:r},...s&&{geographyType:s.split(",").filter(isGeographyType)},...n&&{entryPoints:toEntryPoints(n)},...i&&{addressRanges:{...i,from:latLonAPIToPosition(i.from),to:latLonAPIToPosition(i.to)}}}}},geocodingTemplate={requestValidation:{schema:geocodingRequestSchema},buildRequest:e=>{const t=new URL(resolvePlacesQueryEndpointUrl(e,"geocode",e.query)),a=t.searchParams;return appendLanguageParam(a,e),e.typeahead&&a.append("typeahead",String(e.typeahead)),appendOptionalParam(a,"limit",e.limit),appendSearchCursorParam(a,e.cursor,"Geocode"),appendGeoBiasParams(a,e.geoBias),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),e.extendedPostalCodesFor&&a.append("extendedPostalCodesFor",arrayToCSV(e.extendedPostalCodesFor)),e.mapcodes&&a.append("mapcodes",arrayToCSV(e.mapcodes)),appendOptionalParam(a,"view",toServedView(e.geopoliticalView,"geocoding")),appendByJoiningParamValue(a,"entityTypeSet",e.filters?.geographyTypes),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>toPlacesCollection(e.results.map(parseApiResult),parseSummaryAPI(e.summary,{paginated:!0}))},geocode=async e=>callService(e,geocodingTemplate,"Geocode"),geocodeOne=async e=>fetchFirstPlace("geocodeOne","Geocode",e,geocode),geometryDataRequestMandatory=/* @__PURE__ */(()=>z.object({geometries:z.union([featureCollectionSchema,z.array(z.union([z.string(),featureSchema])).min(1).refine(e=>e.length<=20,"geometries takes at most 20 geometry IDs or places").refine(e=>e.every(t=>typeof t==typeof e[0]),"geometries must be all geometry IDs or all places, not a mix")])}))(),geometryDataRequestOptional=/* @__PURE__ */(()=>z.object({zoom:z.number().min(0).max(22).optional()}))(),getGeometryIDs=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>Boolean(e)),geometryDataTemplate={requestValidation:{schema:/* @__PURE__ */(()=>geometryDataRequestMandatory.extend(geometryDataRequestOptional.shape))()},buildRequest:e=>{const t=new URL((e=>resolvePlacesEndpointUrl(e,"additionalData.json"))(e)),a=t.searchParams;return((e,t)=>{let a;a=Array.isArray(t)?(e=>"string"==typeof e[0])(t)?t:getGeometryIDs(t):getGeometryIDs(t.features),e.append("geometries",arrayToCSV(a))})(a,e.geometries),appendOptionalParam(a,"geometriesZoom",e.zoom),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.additionalData.flatMap(e=>"geometryData"in e?e.geometryData.features.map(t=>({...t,id:t.id??e.providerID,bbox:bboxFromGeoJSON(t.geometry)})):[]);return{type:"FeatureCollection",bbox:bboxFromGeoJSON(t),features:t}}};async function geometryData(e){const t=await callService(e,geometryDataTemplate,"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?t:((e,t)=>{const a=/* @__PURE__ */new Map;for(const o of e.features){const e=o.properties.dataSources?.geometry?.id;e&&a.set(e,{...o.properties,placeCoordinates:o.geometry.coordinates})}return{type:"FeatureCollection",bbox:t.bbox,features:t.features.map(e=>({...e,properties:a.get(String(e.id))??null}))}})(e.geometries,t)}var placeDetailOptionsSchema=/* @__PURE__ */(()=>z.object({openingHours:z.enum(["nextSevenDays"]).optional(),timeZone:z.enum(["iana"]).optional(),relatedPois:z.enum(["child","parent","all","off"]).optional()}))(),commonSearchParamsSchema=/* @__PURE__ */(()=>commonPlacesParamsSchema.extend({filters:placeFiltersSchema.optional(),...placeDetailOptionsSchema.shape}))(),placeDetailsRequestMandatory=/* @__PURE__ */(()=>z.object({entityId:z.string()}))(),placeDetailsRequestOptional=/* @__PURE__ */(()=>commonPlacesParamsSchema.pick({mapcodes:!0,geopoliticalView:!0}).extend(placeDetailOptionsSchema.shape))(),placeDetailsTemplate={requestValidation:{schema:/* @__PURE__ */(()=>placeDetailsRequestMandatory.extend(placeDetailsRequestOptional.shape))()},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,"place.json"))(e)}`),a=t.searchParams;return appendLanguageParam(a,e),appendOptionalParam(a,"entityId",e.entityId),appendByJoiningParamValue(a,"mapcodes",e.mapcodes),appendPlaceEnrichmentParams(a,e,"placeDetails"),appendEVModelVersionParam(a),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>e.results?.length?parseSearchAPIResult(e.results[0]):void 0},getPlaceDetails=async e=>callService(e,placeDetailsTemplate,"PlaceDetails"),foldedWords=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"").toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean),compactFoldedText=e=>foldedWords(e).join(""),cache=/* @__PURE__ */new Map,textCache=/* @__PURE__ */new Map,getWithDefault=e=>e??"en-GB",normalizeText=e=>{const t=foldedWords(e);return{words:t.join(" "),compact:t.join("")}},getCachedTextEntries=e=>textCache.get(getWithDefault(e))??[],MATCH_TIERS=[[950,850,(e,t)=>t.words===e.words],[720,620,(e,t)=>t.words.startsWith(`${e.words} `)],[440,380,(e,t)=>` ${t.words} `.includes(` ${e.words} `)],[280,180,(e,t)=>t.compact.includes(e.compact)]],scoreCategory=(e,t)=>{const a=((e,{name:t,synonyms:a})=>{for(const[o,r,n]of MATCH_TIERS){if(n(e,t))return o;if(a.some(t=>n(e,t)))return r}return 0})(e,t);return a?a+40*Math.min(1,e.words.length/Math.max(t.name.words.length,1)):0},withoutCovered=e=>{const t=/* @__PURE__ */new Set;return e.filter(({code:e,childCategoryCodes:a})=>{const o=t.has(e);t.add(e);for(const r of a)t.add(r);return!o})},matchCategories=(e,t,a)=>{const o=t.map(t=>withoutCovered(((e,t)=>{const a=t.find(({category:t})=>t.code===e.trim());if(a)return[a.category];const o=normalizeText(e);if(!o.words)return[];const r=t.map(e=>({category:e.category,score:scoreCategory(o,e)})).filter(({score:e})=>e>0),n=r.map(e=>({...e,tiesWithParent:r.some(({category:t,score:a})=>a===e.score&&t.childCategoryCodes.includes(e.category.code))})).sort((e,t)=>t.score-e.score||Number(e.tiesWithParent)-Number(t.tiesWithParent)),i=.7*(n[0]?.score??0);return distinctBy(n.filter(({score:e})=>e>=i).map(({category:e})=>e),({code:e})=>e)})(t,e)).slice(0,a)),r=Math.max(0,...o.map(({length:e})=>e)),n=Array.from({length:r},(e,t)=>o.flatMap(e=>e.slice(t,t+1))).flat();return{categories:withoutCovered(n),unmatched:t.filter((e,t)=>!o[t].length)}},poiCategoriesRequestSchema=/* @__PURE__ */(()=>commonServiceRequestSchema.extend({filters:z.array(z.string()).optional()}))(),resolvePOICategoriesRequestSchema=/* @__PURE__ */(()=>poiCategoriesRequestSchema.extend({filters:z.array(z.string())}))(),parsePOICategory=e=>{if(0===e.id)return null;const t=poiIDsToCategories[e.id];return t?{code:t,name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>poiIDsToCategories[e]).filter(e=>!!e),synonyms:e.synonyms}:(console.error(`Received unknown POI category ID ${e.id} (${e.name}). This category will be skipped and unavailable for filtering.`),null)},poiCategoriesTemplate={requestValidation:{schema:poiCategoriesRequestSchema},buildRequest:e=>{const t=resolvePlacesEndpointUrl(e,"poiCategories.json"),a=new URL(t);return appendOptionalParam(a.searchParams,"language",e.language&&poiCategoriesLanguage(e.language)),{url:a,headers:buildPlacesRequestHeaders(e)}},apiVersion:1,sendRequest:get,parseResponse:e=>({poiCategories:e.poiCategories.map(parsePOICategory).filter(e=>null!==e)})},knownCodes=/* @__PURE__ */(()=>new Set(poiCategories))(),isKnownCode=e=>knownCodes.has(e),checkRequest=(e,t)=>{throwIfAborted(e.signal,"POICategories");const a=mergeFromGlobal(e);return validateServiceRequest(e,a,t,"POICategories"),a},loadCategories=async(e,t)=>{const a=(e=>cache.get(getWithDefault(e)))(t);if(a)return a;const{poiCategories:o}=await callService(e,poiCategoriesTemplate,"POICategories");return((e,t)=>{const a=getWithDefault(e);cache.set(a,t),textCache.set(a,(e=>e.map(e=>({category:e,name:normalizeText(e.name),synonyms:e.synonyms.map(normalizeText)})))(t))})(t,o),o},copyCategory=e=>({...e,childCategoryCodes:[...e.childCategoryCodes],synonyms:[...e.synonyms]}),getPOICategories=async(e={})=>{const{language:t}=checkRequest(e,poiCategoriesTemplate.requestValidation),a=await loadCategories(e,t);return{poiCategories:(e.filters?.length?matchCategories(getCachedTextEntries(t),e.filters).categories:a).map(copyCategory)}},getPOICategoryCodes=async(e={})=>{const{poiCategories:t}=await getPOICategories(e);return t.map(e=>e.code)},resolvePOICategories=async e=>{const{language:t}=checkRequest(e,{schema:resolvePOICategoriesRequestSchema}),a=e.filters.map(e=>e.trim());if(a.every(isKnownCode))return{poiCategories:[...new Set(a)].slice(0,10),unmatched:[]};await loadCategories(e,t);const{categories:o,unmatched:r}=matchCategories(getCachedTextEntries(t),e.filters,3);return{poiCategories:o.slice(0,10).map(({code:e})=>e),unmatched:r}},routeTypes=["fast","short","efficient","thrilling"],tollTransponderOptions=["all","unknown","none"],vehicleParametersSchema=/* @__PURE__ */(()=>z.object({model:z.object({dimensions:z.object({weightKG:z.number().min(0).optional()}).optional()}).optional(),state:z.object({heading:z.number().min(0).lt(360).optional()}).optional(),restrictions:z.object({maxSpeedKMH:z.number().min(0).max(250).optional(),tollTransponder:z.enum(tollTransponderOptions).optional()}).optional()}))(),costModelSchema=/* @__PURE__ */(()=>z.object({avoid:z.array(z.enum(avoidableTypes)).optional(),traffic:z.enum(["live","historical"]).optional(),routeType:z.enum(routeTypes).optional()}))(),localDateTimeMessage="localDateTime: use a real date and time as YYYY-MM-DDTHH:mm:ss, with seconds and no UTC offset, such as '2026-10-19T08:15:00'.",departArriveSchema=/* @__PURE__ */(()=>z.object({option:z.enum(["departAt","arriveBy"]),date:z.date().optional(),localDateTime:z.iso.datetime({local:!0,precision:0,error:localDateTimeMessage}).regex(/\d$/,localDateTimeMessage).optional()}).check(z.refine(e=>void 0===e.date!=(void 0===e.localDateTime),"when: pass exactly one of date (an instant) and localDateTime (a wall-clock time without an offset).")))(),commonRoutingRequestSchema=/* @__PURE__ */(()=>z.object({costModel:costModelSchema.optional(),travelMode:z.string().optional(),vehicle:vehicleParametersSchema.optional(),when:departArriveSchema.optional()}))(),reachableRangeRequestSchemaMandatory=/* @__PURE__ */(()=>z.object({origin:hasLngLatSchema,budget:z.object({type:z.enum(budgetTypes),value:z.number().positive()})}))(),reachableRangeAvoidSchema=/* @__PURE__ */(()=>z.array(z.enum(avoidableTypes)).check(z.refine(e=>!e.includes("alreadyUsedRoads"),"costModel.avoid: calculateReachableRange has no 'alreadyUsedRoads' avoidable. Drop that entry — the other avoidables are accepted.")))(),reachableRangeVehicleSchema=/* @__PURE__ */(()=>vehicleParametersSchema.check(z.refine(e=>!(e.state&&"heading"in e.state),"vehicle.state.heading: calculateReachableRange has no vehicle heading parameter. Remove it, or use calculateRoute, which accepts it.")))(),reachableRangeWhenSchema=/* @__PURE__ */(()=>departArriveSchema.check(z.refine(e=>"arriveBy"!==e.option,"when: { option: 'arriveBy' }: calculateReachableRange has no arrival-time parameter. Use when: { option: 'departAt', date } or when: { option: 'departAt', localDateTime } instead, or omit when entirely.")))(),reachableRangeCostModelSchema=/* @__PURE__ */(()=>costModelSchema.extend({avoid:reachableRangeAvoidSchema.optional(),avoidAreas:z.unknown().optional()}).check(z.refine(e=>void 0===e.avoidAreas,"costModel.avoidAreas: calculateReachableRange has no avoid-areas parameter. Remove it — the other cost-model options are accepted.")))(),reachableRangeRequestSchemaOptional=/* @__PURE__ */(()=>z.object({when:reachableRangeWhenSchema.optional(),vehicle:reachableRangeVehicleSchema.optional(),costModel:reachableRangeCostModelSchema.optional(),maxFerryLengthMeters:z.number().min(0).optional(),smoothing:z.enum(["none","weak","strong"]).optional()}))(),reachableRangeRequestValidationConfig={schema:/* @__PURE__ */(()=>commonRoutingRequestSchema.extend(reachableRangeRequestSchemaMandatory.extend(reachableRangeRequestSchemaOptional.shape).shape))()},toAPIDateTime=e=>e.localDateTime??e.date.toISOString(),buildCommonRoutingBody=e=>({...e.costModel?.routeType&&{routeType:e.costModel.routeType},...e.costModel?.traffic&&{traffic:e.costModel.traffic},...e.costModel?.avoid?.length&&{avoids:e.costModel.avoid},...e.travelMode&&{travelMode:e.travelMode},..."departAt"===e.when?.option&&{departureDateTime:toAPIDateTime(e.when)}}),buildCommonVehicleBody=e=>{const t={};return e.model?.dimensions?.weightKG&&(t.vehicleWeightInKilograms=e.model.dimensions.weightKG),e.restrictions?.maxSpeedKMH&&(t.vehicleMaxSpeedInKilometersPerHour=e.restrictions.maxSpeedKMH),e.restrictions?.tollTransponder&&(t.vehicleHasElectronicTollCollectionTransponder=e.restrictions.tollTransponder),t},buildPostData=e=>({origin:toPointGeometry(getPositionStrict(e.origin)),...buildCommonRoutingBody(e),...e.vehicle&&buildCommonVehicleBody(e.vehicle)}),buildRequestHeaders$1=e=>({...buildCommonServiceRequestHeaders(e),Attributes:"reachableRange(boundary)"}),propertyKeys=/* @__PURE__ */(()=>Object.keys({origin:!0,budget:!0,costModel:!0,vehicle:!0,travelMode:!0,when:!0,maxFerryLengthMeters:!0,smoothing:!0}))(),closeRing=e=>{const t=e[0],a=e.at(-1);return!t||!a||t[0]===a[0]&&t[1]===a[1]?e:[...e,t]},reachableRangeTemplate={requestValidation:reachableRangeRequestValidationConfig,buildRequest:e=>{const t=(e=>new URL(`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`))(e);return((e,t)=>{const a=t.budget;"timeMinutes"===a.type?e.append("timeBudgetInSec",(60*a.value).toString()):e.append("distanceBudgetInMeters",(1e3*a.value).toString())})(t.searchParams,e),appendOptionalParam(t.searchParams,"maxFerryLengthInMeters",e.maxFerryLengthMeters),appendOptionalParam(t.searchParams,"smoothing",e.smoothing??"strong"),{method:"POST",url:t,data:buildPostData(e),headers:buildRequestHeaders$1(e)}},sendRequest:post,parseResponse:(e,t)=>{const a={type:"Polygon",coordinates:[closeRing(e.reachableRange.boundary.map(e=>[e.longitude,e.latitude]))]};return{type:"Feature",geometry:a,bbox:bboxFromGeoJSON(a),properties:pickKeys(t,propertyKeys)}},parseResponseError:parseRoutingResponseError,apiVersion:3,releaseStage:{stage:"private-preview",access:{product:"Calculate Reachable Range",requestAccessURL:"https://www.tomtom.com/contact-sales/?source_app=docs-portal&source_product=calculate-reachable-range"},withAccess:(e,t)=>{if(!(e instanceof SDKServiceError&&"INSUFFICIENT_PERMISSIONS"===e.code)||void 0!==e.apiErrorCode&&"Forbidden"!==e.apiErrorCode)return e;const{product:a,requestAccessURL:o}=t;return new SDKServiceError(`${e.message}. ${a} is in Private Preview (https://docs.tomtom.com/legal/private-preview), and the API key needs access to it: request it from TomTom Sales at ${o}`,e.service,e.status,{apiErrorCode:e.apiErrorCode,privatePreviewAccess:t})}}},calculateReachableRange=async e=>callService(e,reachableRangeTemplate,"ReachableRange"),combineSignals=(...e)=>{const t=e.filter(e=>!!e);if(t.length<2)return{signal:t[0],release:()=>{}};const a=new AbortController,o=[];for(const r of t){if(r.aborted){a.abort(r.reason);break}const e=()=>a.abort(r.reason);r.addEventListener("abort",e,{once:!0}),o.push([r,e])}return{signal:a.signal,release:()=>o.forEach(([e,t])=>e.removeEventListener("abort",t))}},calculateReachableRanges=async(e,t)=>{const a=[];for(const r of e){const{signal:e,release:n}=combineSignals(r.signal,t?.signal);try{a.push(await calculateReachableRange({...r,...e&&{signal:e}}))}catch(o){if(!(o instanceof SDKServiceError&&"INVALID_REQUEST"===o.code))throw o}finally{n()}}return featureCollectionWithBBox(a)},AREA_TYPE_BY_GEOGRAPHY_TYPE={Country:"country",CountrySubdivision:"countrySubdivision",CountrySecondarySubdivision:"countrySecondarySubdivision",CountryTertiarySubdivision:"countryTertiarySubdivision",Municipality:"municipality",MunicipalitySubdivision:"municipalitySubdivision",MunicipalitySecondarySubdivision:"municipalitySecondarySubdivision",Neighbourhood:"neighborhood",PostalCodeArea:"postalCode"},ISO2_TO_ISO3={AF:"AFG",AX:"ALA",AL:"ALB",DZ:"DZA",AS:"ASM",AD:"AND",AO:"AGO",AI:"AIA",AQ:"ATA",AG:"ATG",AR:"ARG",AM:"ARM",AW:"ABW",AU:"AUS",AT:"AUT",AZ:"AZE",BS:"BHS",BH:"BHR",BD:"BGD",BB:"BRB",BY:"BLR",BE:"BEL",BZ:"BLZ",BJ:"BEN",BM:"BMU",BT:"BTN",BO:"BOL",BQ:"BES",BA:"BIH",BW:"BWA",BV:"BVT",BR:"BRA",IO:"IOT",BN:"BRN",BG:"BGR",BF:"BFA",BI:"BDI",CV:"CPV",KH:"KHM",CM:"CMR",CA:"CAN",KY:"CYM",CF:"CAF",TD:"TCD",CL:"CHL",CN:"CHN",CX:"CXR",CC:"CCK",CO:"COL",KM:"COM",CG:"COG",CD:"COD",CK:"COK",CR:"CRI",CI:"CIV",HR:"HRV",CU:"CUB",CW:"CUW",CY:"CYP",CZ:"CZE",DK:"DNK",DJ:"DJI",DM:"DMA",DO:"DOM",EC:"ECU",EG:"EGY",SV:"SLV",GQ:"GNQ",ER:"ERI",EE:"EST",SZ:"SWZ",ET:"ETH",FK:"FLK",FO:"FRO",FJ:"FJI",FI:"FIN",FR:"FRA",GF:"GUF",PF:"PYF",TF:"ATF",GA:"GAB",GM:"GMB",GE:"GEO",DE:"DEU",GH:"GHA",GI:"GIB",GR:"GRC",GL:"GRL",GD:"GRD",GP:"GLP",GU:"GUM",GT:"GTM",GG:"GGY",GN:"GIN",GW:"GNB",GY:"GUY",HT:"HTI",HM:"HMD",VA:"VAT",HN:"HND",HK:"HKG",HU:"HUN",IS:"ISL",IN:"IND",ID:"IDN",IR:"IRN",IQ:"IRQ",IE:"IRL",IM:"IMN",IL:"ISR",IT:"ITA",JM:"JAM",JP:"JPN",JE:"JEY",JO:"JOR",KZ:"KAZ",KE:"KEN",KI:"KIR",KP:"PRK",KR:"KOR",XK:"XKX",KW:"KWT",KG:"KGZ",LA:"LAO",LV:"LVA",LB:"LBN",LS:"LSO",LR:"LBR",LY:"LBY",LI:"LIE",LT:"LTU",LU:"LUX",MO:"MAC",MG:"MDG",MW:"MWI",MY:"MYS",MV:"MDV",ML:"MLI",MT:"MLT",MH:"MHL",MQ:"MTQ",MR:"MRT",MU:"MUS",YT:"MYT",MX:"MEX",FM:"FSM",MD:"MDA",MC:"MCO",MN:"MNG",ME:"MNE",MS:"MSR",MA:"MAR",MZ:"MOZ",MM:"MMR",NA:"NAM",NR:"NRU",NP:"NPL",NL:"NLD",NC:"NCL",NZ:"NZL",NI:"NIC",NE:"NER",NG:"NGA",NU:"NIU",NF:"NFK",MK:"MKD",MP:"MNP",NO:"NOR",OM:"OMN",PK:"PAK",PW:"PLW",PS:"PSE",PA:"PAN",PG:"PNG",PY:"PRY",PE:"PER",PH:"PHL",PN:"PCN",PL:"POL",PT:"PRT",PR:"PRI",QA:"QAT",RE:"REU",RO:"ROU",RU:"RUS",RW:"RWA",BL:"BLM",SH:"SHN",KN:"KNA",LC:"LCA",MF:"MAF",PM:"SPM",VC:"VCT",WS:"WSM",SM:"SMR",ST:"STP",SA:"SAU",SN:"SEN",RS:"SRB",SC:"SYC",SL:"SLE",SG:"SGP",SX:"SXM",SK:"SVK",SI:"SVN",SB:"SLB",SO:"SOM",ZA:"ZAF",GS:"SGS",SS:"SSD",ES:"ESP",LK:"LKA",SD:"SDN",SR:"SUR",SJ:"SJM",SE:"SWE",CH:"CHE",SY:"SYR",TW:"TWN",TJ:"TJK",TZ:"TZA",TH:"THA",TL:"TLS",TG:"TGO",TK:"TKL",TO:"TON",TT:"TTO",TN:"TUN",TR:"TUR",TM:"TKM",TC:"TCA",TV:"TUV",UG:"UGA",UA:"UKR",AE:"ARE",GB:"GBR",US:"USA",UM:"UMI",UY:"URY",UZ:"UZB",VU:"VUT",VE:"VEN",VN:"VNM",VG:"VGB",VI:"VIR",WF:"WLF",EH:"ESH",YE:"YEM",ZM:"ZMB",ZW:"ZWE"},toIso3=e=>ISO2_TO_ISO3[e]??e,PLACE_TYPE_BY_RESULT_TYPE={street:"Street",area:"Geography",address:"Point Address"},GEOGRAPHY_TYPE_BY_AREA_TYPE=/* @__PURE__ */(()=>Object.fromEntries(Object.entries(AREA_TYPE_BY_GEOGRAPHY_TYPE).map(([e,t])=>[t,e])))(),mapAddress=e=>{const{street:t,houseNumber:a,countryCodeIso2:o,...r}=e;return{...r,...t&&{streetName:t},...a&&{streetNumber:a},...o&&{countryCode:o,countryCodeISO3:toIso3(o)}}},revGeocodeRequestMandatory=/* @__PURE__ */(()=>z.object({position:hasLngLatSchema}))(),revGeocodeRequestOptional=/* @__PURE__ */(()=>z.object({geographyTypes:z.array(z.enum(geographyTypes)).optional(),heading:z.number().min(-360).max(360).optional(),radiusMeters:z.number().positive().max(5e6).optional(),geopoliticalView:z.enum(geopoliticalViews).optional()}))(),reverseGeocodingTemplate={requestValidation:{schema:/* @__PURE__ */(()=>revGeocodeRequestMandatory.extend(revGeocodeRequestOptional.shape))()},buildRequest:e=>{const[t,a]=getPositionStrict(e.position),o=new URL((e=>resolvePlacesEndpointUrl(e,"reverseGeocode"))(e)),r=o.searchParams;return r.append("position",`${t},${a}`),appendOptionalParam(r,"radiusInMeters",e.radiusMeters),e.geographyTypes&&r.append("areaTypes",e.geographyTypes.map(e=>AREA_TYPE_BY_GEOGRAPHY_TYPE[e]).join(",")),appendOptionalParam(r,"vehicleHeadingInDegrees",e.heading),appendOptionalParam(r,"geopoliticalView",toServedView(e.geopoliticalView,"reverseGeocoding")),{url:o,headers:{...buildCommonServiceRequestHeaders(e),Attributes:"results(*)"}}},apiVersion:2,sendRequest:get,parseResponse:(e,t)=>{const a=e.results[0],o=toPointGeometry(getPositionStrict(t.position));return a?{type:"Feature",geometry:o,id:a.id,properties:{type:PLACE_TYPE_BY_RESULT_TYPE[a.type],address:{freeformAddress:a.title,...mapAddress(a.address)},...a.areaType&&{geographyType:[GEOGRAPHY_TYPE_BY_AREA_TYPE[a.areaType]]},...a.accessPoints?.length&&{entryPoints:a.accessPoints.map(e=>({position:e.position.coordinates}))},originalPosition:a.position.coordinates}}:{type:"Feature",geometry:o,id:generateId()}}},reverseGeocode=async e=>callService(e,reverseGeocodingTemplate,"ReverseGeocode"),EXPLICIT_SECTION_TYPES=["tollVignette","tollRoad","roadShields","importantRoadStretch"],buildAttributesHeader=e=>{const t=["summary","legs(summary,path)"],a=e.sectionTypes,o=geometrySectionTypes;if(!a||a.some(e=>!o.includes(e))){t.push("sections");const o=!a;for(const e of EXPLICIT_SECTION_TYPES)(o||a.includes(e))&&t.push(`sections.${e}`);e.guidance&&(o||a.includes("lanes"))&&t.push("sections.lanes")}0!==e.extendedRouteRepresentations?.length&&t.push("progressPoints"),e.guidance&&t.push("instructions(*,nextRoadInformation.roadShields.iconReference,previousRoadInformation.roadShields.iconReference,signpost.exitIconReference,distanceToPreviousTrafficLightInMeters)");const r=`routes(${t.join(",")})`;return e.guidance?`roadShieldAtlasReference,${r}`:r},buildVehicleBody=e=>{const t=e.state?.heading;return{...buildCommonVehicleBody(e),...!isNil(t)&&{vehicleHeadingInDegrees:t}}},isPathLike=e=>"path"===getRoutePlanningLocationType(e),expandPathToStops=e=>{const t=(e=>Array.isArray(e)?e:e.geometry.coordinates)(e),a=(e=>{if(!Array.isArray(e))return e.properties?.sections?.leg})(e);if(a&&a.length>1&&a.every(e=>null!=e.startPointIndex&&null!=e.endPointIndex)){const e=a.map(e=>{const a=e.startPointIndex??0,o=e.endPointIndex??0;return{coordinate:t[a],legToNext:{path:{type:"LineString",coordinates:t.slice(a,o+1)}}}});return e.push({coordinate:t[a.at(-1)?.endPointIndex??t.length-1]}),e}return[{coordinate:t[0],legToNext:{path:{type:"LineString",coordinates:t}}},{coordinate:t.at(-1)??t[0]}]},getRouteStopOptions=e=>{if(!Array.isArray(e)&&"properties"in e)return e.properties??void 0},toLegRequest=e=>{const t=e.options;if(!t)return{};const a={...t.pauseDurationSeconds&&{pauseDurationInSeconds:t.pauseDurationSeconds},...t.candidateEntryPoints?.length&&{entryPoints:(o=t.candidateEntryPoints,{type:"MultiPoint",coordinates:o.map(e=>getPositionStrict(e))}),...!isNil(t.preferredEntryPointIndex)&&{preferredEntryPointIndex:t.preferredEntryPointIndex}}};var o;return{...t.legCostModel?.routeType&&{routeType:t.legCostModel.routeType},...t.legCostModel?.avoid?.length&&{avoids:t.legCostModel.avoid.map(e=>({name:e}))},...Object.keys(a).length>0&&{routeStop:a}}},arrivalSides=["any","curb"],routeStopOptionsSchema=/* @__PURE__ */(()=>z.object({pauseDurationSeconds:z.number().min(0).optional(),legCostModel:costModelSchema.pick({routeType:!0,avoid:!0}).optional(),candidateEntryPoints:z.array(hasLngLatSchema).optional(),preferredEntryPointIndex:z.number().optional()}))(),pathCoordinatesSchema=/* @__PURE__ */(()=>positionsInRangeSchema(2,"a path (route reconstruction) location needs at least 2 points","path (route reconstruction)"))(),pathLikeSchema=/* @__PURE__ */(()=>z.union([pathCoordinatesSchema,featureSchema.extend({geometry:lineStringSchema$1.extend({coordinates:pathCoordinatesSchema})})]))(),mandatorySchema=/* @__PURE__ */(()=>z.object({locations:z.array(z.union([hasLngLatSchemaWithProperties(routeStopOptionsSchema.nullish()),pathLikeSchema])).min(1)}))(),curveDetectionSchema=/* @__PURE__ */(()=>z.object({curve:z.object({minHeadingChangeInDegrees:z.number().min(0).optional(),maxRadiusInMeters:z.number().positive().optional(),maxStraightInMeters:z.number().min(0).optional()}).optional(),curvyStretch:z.object({maxGapInMeters:z.number().min(0).optional(),minCurveCount:z.number().int().min(1).optional()}).optional()}))(),optionalSchema=/* @__PURE__ */(()=>z.object({costModel:costModelSchema.extend({avoidAreas:z.array(hasBBoxSchema).max(10).optional()}).optional(),useEntryPoints:z.enum(["main-when-available","ignore"]).optional(),arrivalSide:z.enum(arrivalSides).optional(),computeTravelTimeFor:z.enum(["none","all"]).optional(),extendedRouteRepresentations:z.array(z.enum(["distance","travelTime"])).optional(),guidance:z.object({type:z.enum(["coded"])}).optional(),maxAlternatives:z.number().int().min(0).max(5).optional(),sectionTypes:z.array(z.enum(inputSectionTypesWithGuidance)).optional(),curveDetection:curveDetectionSchema.optional()}))(),routeRequestValidationConfig={schema:/* @__PURE__ */(()=>commonRoutingRequestSchema.extend(mandatorySchema.extend(optionalSchema.shape).shape))(),refinements:[{check:e=>{const t=e.locations.map(getRoutePlanningLocationType),a=t.filter(e=>"waypoint"===e).length,o=t.filter(e=>"path"===e).length;return a>=2||o>=1},message:"At least 2 waypoints or 1 path (route reconstruction) is required."},{check:e=>{const t=e.locations.at(-1);return!(t&&!isPathLike(t)&&getRouteStopOptions(t)?.pauseDurationSeconds)},message:"pauseDurationSeconds is not supported on the destination: the routing API requires the wait on the last leg to be 0."},{check:e=>e.locations.every(e=>{if(isPathLike(e))return!0;const{candidateEntryPoints:t,preferredEntryPointIndex:a}=getRouteStopOptions(e)??{};return!(!isNil(a)&&t?.length)||Number.isInteger(a)&&a>=0&&a<t.length}),message:"preferredEntryPointIndex must be the index of one of the candidateEntryPoints on the same stop."}]},iconCategoryByCategory={other:"unknown",accident:"accident",fog:"fog",danger:"dangerousConditions",rain:"rain",frost:"ice",jam:"jam","lane-closed":"laneClosed","road-closed":"roadClosed",roadworks:"roadWorks",wind:"wind",flooding:"flooding","broken-down-vehicle":"brokenDownVehicle"},iconCategoryLookup=/* @__PURE__ */(()=>new Map(Object.entries(iconCategoryByCategory)))(),categoryByIconCategory=/* @__PURE__ */(()=>new Map(trafficIncidentRequestCategories.map(e=>[iconCategoryByCategory[e],e])))(),delayMagnitudeByAPIMagnitude={unknown:"unknown",minor:"minor",moderate:"moderate",major:"major",undefined:"indefinite"},delayMagnitudeLookup=/* @__PURE__ */(()=>new Map(Object.entries(delayMagnitudeByAPIMagnitude)))(),toIconCategory=e=>iconCategoryLookup.get(e)??e,toTrafficIncidentCategory=e=>categoryByIconCategory.get(e)??"other",toDelayMagnitude=e=>delayMagnitudeLookup.get(e)??"unknown",parseSummary=e=>({lengthInMeters:e.lengthInMeters,travelTimeInSeconds:e.travelDurationInSeconds,trafficDelayInSeconds:e.trafficDelayDurationInSeconds,trafficLengthInMeters:e.trafficLengthInMeters,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,departureTime:new Date(e.departureDateTime),arrivalTime:new Date(e.arrivalDateTime),deviationDistanceInMeters:e.deviationDistanceInMeters,deviationTimeInSeconds:e.deviationDurationInSeconds,...e.deviationPoint&&{deviationPoint:e.deviationPoint.coordinates}}),toSectionProps=e=>({id:generateId(),startPointIndex:e.startPathIndex,endPointIndex:e.endPathIndex}),toCountrySectionProps=e=>({...toSectionProps(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:toIso3(e.countryCodeIso2??"")}),basicSectionKeys=["carTrain","ferry","tunnel","motorway","pedestrian","toll","tollRoad","carpool","urban","unpaved","lowEmissionZone"],toSDKValue=(e,t)=>e[t]??t,toLaneDirection=e=>toSDKValue(LANE_DIRECTION_MAP,e),parseSections=(e,t)=>{const a={leg:(r=e.legs,r.reduce((e,t,a)=>{const o=t.path.coordinates.length,n=0===a?0:e[a-1]?.endPointIndex;let i;isNil(n)||(i=0===a?Math.max(o-1,0):n+o);const s=((e,t)=>{if(!t)return;const a=new Date(e.summary.arrivalDateTime).getTime(),o=new Date(t.summary.departureDateTime).getTime();if(Number.isNaN(a)||Number.isNaN(o))return;const r=Math.round((o-a)/1e3);return r>0?r:void 0})(t,r[a+1]),{originalWaypointIndexAtEndOfLeg:c}=t.summary;return e.push({...!isNil(n)&&{startPointIndex:n},...void 0!==i&&{endPointIndex:i},...!isNil(c)&&{originalWaypointIndex:c},summary:{...parseSummary(t.summary),...void 0!==s&&{stopTimeInSeconds:s}},id:generateId()}),e},[]))},o=e.sections;var r;if(!o)return a;for(const n of basicSectionKeys){const e=o[n];e?.length&&(a[n]=e.map(toSectionProps))}return o.country?.length&&(a.country=o.country.map(toCountrySectionProps)),o.travelMode?.length&&(a.vehicleRestricted=o.travelMode.filter(e=>"other"===e.travelMode).map(toSectionProps)),o.traffic?.length&&(a.traffic=o.traffic.map(e=>{return{...toSectionProps(e),delayInSeconds:e.delayDurationInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKilometersPerHour,categories:(t=e,t.tec?.causes?.length?t.tec.causes.map(e=>{switch(e.mainCauseCode){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 17:return"wind";case 18:return"fog";case 19:return"rain";default:return"other"}}):[toTrafficIncidentCategory(t.iconCategory)]),magnitudeOfDelay:toDelayMagnitude(e.delayMagnitude),...e.tec&&{tec:e.tec},...e.eventId&&{eventId:e.eventId}};var t})),o.speedLimit?.length&&(a.speedLimit=o.speedLimit.map(e=>{const t=e.speedRestrictions?.find(e=>"maximum"===e.type)?.inKilometersPerHour;return isNil(t)?void 0:{...toSectionProps(e),maxSpeedLimitInKmh:t}}).filter(e=>!!e)),o.lanes?.length&&(a.lanes=o.lanes.map(e=>({...toSectionProps(e),lanes:(e.lanes??[]).map(e=>({directions:e.directions.map(toLaneDirection),...e.follow&&{follow:toLaneDirection(e.follow)}})),laneSeparators:(e.laneSeparators??[]).map(e=>toSDKValue(LANE_SEPARATOR_MAP,e)),properties:e.properties?.map(e=>toSDKValue(LANE_PROPERTY_MAP,e))}))),o.roadShields?.length&&(a.roadShields=o.roadShields.map(e=>({...toSectionProps(e),roadShieldReferences:e.roadShieldReferences??[]}))),o.tollVignette?.length&&(a.tollVignette=o.tollVignette.map(toCountrySectionProps)),o.importantRoadStretch?.length&&(a.importantRoadStretch=o.importantRoadStretch.map(e=>({...toSectionProps(e),index:e.importantRoadStretchIndex,...e.streetName&&{streetName:e.streetName.text},...e.roadNumbers?.length&&{roadNumbers:e.roadNumbers.map(e=>e.text)}}))),((e,t)=>{if(!t)return;const a=new Set(t);for(const o of Object.keys(e))"leg"===o||a.has(o)||delete e[o]})(a,t.sectionTypes),a},similar=(e,t)=>Math.abs(e[0]-t[0])<1e-4&&Math.abs(e[1]-t[1])<1e-4,MANEUVER_MAP={depart:"DEPART",waypointLeft:"WAYPOINT_LEFT",waypointRight:"WAYPOINT_RIGHT",waypointReached:"WAYPOINT_REACHED",waypointAhead:"WAYPOINT_AHEAD",arrive:"ARRIVE",arriveLeft:"ARRIVE_LEFT",arriveRight:"ARRIVE_RIGHT",arriveAhead:"ARRIVE_AHEAD",continueStraight:"STRAIGHT",keepLeft:"KEEP_LEFT",keepRight:"KEEP_RIGHT",turnSlightRight:"SLIGHT_RIGHT",turnRight:"TURN_RIGHT",turnSharpRight:"SHARP_RIGHT",turnSlightLeft:"SLIGHT_LEFT",turnLeft:"TURN_LEFT",turnSharpLeft:"SHARP_LEFT",makeUTurn:"MAKE_UTURN",roundaboutStraight:"ROUNDABOUT_STRAIGHT",roundaboutSharpRight:"ROUNDABOUT_SHARP_RIGHT",roundaboutRight:"ROUNDABOUT_RIGHT",roundaboutSlightRight:"ROUNDABOUT_SLIGHT_RIGHT",roundaboutSlightLeft:"ROUNDABOUT_SLIGHT_LEFT",roundaboutLeft:"ROUNDABOUT_LEFT",roundaboutSharpLeft:"ROUNDABOUT_SHARP_LEFT",roundaboutBack:"ROUNDABOUT_BACK",exitRoundabout:"EXIT_ROUNDABOUT",exitMotorwayLeft:"EXIT_MOTORWAY_LEFT",exitMotorwayRight:"EXIT_MOTORWAY_RIGHT",switchMotorwayLeft:"SWITCH_MOTORWAY_LEFT",switchMotorwayRight:"SWITCH_MOTORWAY_RIGHT",enterCarpoolLaneLeft:"ENTER_CARPOOL_LANE_LEFT",enterCarpoolLaneRight:"ENTER_CARPOOL_LANE_RIGHT",exitCarpoolLaneLeft:"EXIT_CARPOOL_LANE_LEFT",exitCarpoolLaneRight:"EXIT_CARPOOL_LANE_RIGHT",mergeLeftLane:"MERGE_LEFT_LANE",mergeRightLane:"MERGE_RIGHT_LANE",takeShipFerry:"TAKE_SHIP_FERRY",takeCarTrain:"TAKE_CAR_TRAIN",leaveShipFerry:"LEAVE_SHIP_FERRY",leaveCarTrain:"LEAVE_CAR_TRAIN",crossBorder:"CROSS_BORDER",passTollgate:"TOLLGATE"},ROAD_PROPERTY_MAP={urban:"URBAN",motorway:"MOTORWAY",controlledAccess:"CONTROLLED_ACCESS"},LANDMARK_MAP={endOfRoad:"END_OF_ROAD",atTrafficLight:"AT_TRAFFIC_LIGHT",onToBridge:"ON_TO_BRIDGE",onBridge:"ON_BRIDGE",afterBridge:"AFTER_BRIDGE",intoTunnel:"INTO_TUNNEL",insideTunnel:"INSIDE_TUNNEL",afterTunnel:"AFTER_TUNNEL"},TOLL_PAYMENT_MAP={cashCoinsAndBills:"CASH_COINS_AND_BILLS",cashBillsOnly:"CASH_BILLS_ONLY",cashCoinsOnly:"CASH_COINS_ONLY",cashExactChange:"CASH_EXACT_CHANGE",creditCard:"CREDIT_CARD",debitCard:"DEBIT_CARD",travelCard:"TRAVEL_CARD",etc:"ETC",etcTransponder:"ETC_TRANSPONDER",etcVideoCamera:"ETC_VIDEO_CAMERA",subscription:"SUBSCRIPTION"},LANE_DIRECTION_MAP={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",rightUTurn:"RIGHT_U_TURN",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",leftUTurn:"LEFT_U_TURN"},LANE_SEPARATOR_MAP={unknown:"UNKNOWN",noMarking:"NO_MARKING",longDashed:"LONG_DASHED",doubleSolid:"DOUBLE_SOLID",singleSolid:"SINGLE_SOLID",solidDashed:"SOLID_DASHED",dashedSolid:"DASHED_SOLID",shortDashed:"SHORT_DASHED",shadedAreaMarking:"SHADED_AREA_MARKING",dashedBlocks:"DASHED_BLOCKS",doubleDashed:"DOUBLE_DASHED",crossingAlert:"CROSSING_ALERT",physicalDivider:"PHYSICAL_DIVIDER",physicalDividerLessThan3m:"PHYSICAL_DIVIDER_LESS_THAN_3M",physicalDividerGuardrail:"PHYSICAL_DIVIDER_GUARDRAIL",curb:"CURB"},LANE_PROPERTY_MAP={isManeuver:"IS_MANEUVER"},MANEUVER_ANGLE_MAP={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",back:"BACK"},ROUNDABOUT_TYPE_MAP={regular:"REGULAR",small:"SMALL"},SIDE_ROAD_SIDE_MAP={left:"LEFT",right:"RIGHT",leftAndRight:"LEFT_AND_RIGHT"},toInstructionText=e=>({text:e.text}),parseInstructionRoadInformation=e=>({properties:(e.properties??[]).map(e=>ROAD_PROPERTY_MAP[e]??e.toUpperCase()),...e.roadNames?.length&&{streetName:toInstructionText(e.roadNames[0].identifier)},...e.countryCodeIso2&&{countryCode:toIso3(e.countryCodeIso2)},...e.roadShields?.length&&{roadShields:e.roadShields.map(e=>({roadNumber:e.roadNumber?toInstructionText(e.roadNumber):{text:""},countryCode:toIso3(e.countryCodeIso2??""),...e.countrySubdivisionCodeIso&&{stateCode:e.countrySubdivisionCodeIso},...e.iconReference&&{roadShieldReference:e.iconReference}}))}}),parseTollAndCrossing=e=>({...e.tollgateName&&{tollgateName:toInstructionText(e.tollgateName)},...e.tollPaymentTypes?.length&&{tollPaymentTypes:e.tollPaymentTypes.map(e=>toSDKValue(TOLL_PAYMENT_MAP,e))},...e.countryCrossingFromName&&{countryCrossingFromName:toInstructionText(e.countryCrossingFromName)},...e.countryCrossingFromCodeIso2&&{countryCrossingFromCode:toIso3(e.countryCrossingFromCodeIso2)},...e.countryCrossingToName&&{countryCrossingToName:toInstructionText(e.countryCrossingToName)},...e.countryCrossingToCodeIso2&&{countryCrossingToCode:toIso3(e.countryCrossingToCodeIso2)}}),toManeuverAngle=e=>toSDKValue(MANEUVER_ANGLE_MAP,e),parseManeuverExtras=e=>{return{...e.message&&{message:e.message},...e.intersectionName&&{intersectionName:toInstructionText(e.intersectionName)},...e.drivingSide&&{drivingSide:e.drivingSide.toUpperCase()},...e.landmark&&{landmark:toSDKValue(LANDMARK_MAP,e.landmark)},...!isNil(e.distanceToPreviousTrafficLightInMeters)&&{trafficLightOffsetInMeters:e.distanceToPreviousTrafficLightInMeters},...e.sideRoads&&{sideRoads:(a=e.sideRoads,a.map(e=>({side:toSDKValue(SIDE_ROAD_SIDE_MAP,e.side),offsetFromManeuverInMeters:e.offsetFromManeuverInMeters,...!isNil(e.isDrivable)&&{isDrivable:e.isDrivable}})))},...e.maneuverView&&{maneuverView:(t=e.maneuverView,{...t.onRouteAngle&&{onRouteAngle:toManeuverAngle(t.onRouteAngle)},offRouteAngles:(t.offRouteAngles??[]).map(toManeuverAngle)})},...e.roundaboutType&&{roundaboutType:toSDKValue(ROUNDABOUT_TYPE_MAP,e.roundaboutType)},...!isNil(e.isManeuverObligatory)&&{isManeuverObligatory:e.isManeuverObligatory},...!isNil(e.changeOfAngleInDegrees)&&{changeOfAngleInDegrees:e.changeOfAngleInDegrees},...!isNil(e.ambiguousExitOffsetFromManeuverInMeters)&&{offsetOfAmbiguousExitFromManeuverInMeters:e.ambiguousExitOffsetFromManeuverInMeters},...!isNil(e.roundaboutExitNumber)&&{roundaboutExitNumber:e.roundaboutExitNumber}};var t,a},parseRoadShieldFields=(e,t)=>{const a=e.signpost?(e=>{if(e.exitName||e.exitNumber||e.towardName)return{...e.exitName&&{exitName:toInstructionText(e.exitName)},...e.exitNumber&&{exitNumber:toInstructionText(e.exitNumber)},towardName:e.towardName?toInstructionText(e.towardName):{text:""}}})(e.signpost):void 0,o=(e.nextRoadInformation?.roadShields??[]).flatMap(e=>e.iconReference??[]);return{...a&&{signpost:a},...t&&{roadShieldAtlasReference:t},...o.length&&{roadShieldReferences:o},...e.signpost?.exitIconReference&&{signpostRoadShieldReferences:[e.signpost.exitIconReference]}}},parseInstruction=(e,t,a,o)=>({maneuverPoint:t,pathPointIndex:a,routeOffsetInMeters:e.routeOffsetInMeters,maneuver:e.maneuver?toSDKValue(MANEUVER_MAP,e.maneuver):e.maneuver,routePath:(e.routePath??[]).map(e=>({point:e.point.coordinates,distanceInMeters:e.distanceFromRouteStartInMeters,travelTimeInSeconds:e.travelTimeFromRouteStartInSeconds})),nextRoadInfo:e.nextRoadInformation?parseInstructionRoadInformation(e.nextRoadInformation):{properties:[]},previousRoadInfo:e.previousRoadInformation?parseInstructionRoadInformation(e.previousRoadInformation):{properties:[]},...parseManeuverExtras(e),...parseRoadShieldFields(e,o),...parseTollAndCrossing(e)}),parseGuidance=(e,t,a)=>{const o=[];let r=0;for(const n of e){const e=n.maneuverPoint.coordinates,i=a=>Math.abs(t[a][0]-e[0])+Math.abs(t[a][1]-e[1]);let s;for(let a=r;a<t.length;a++)if(similar(t[a],e))(void 0===s||i(a)<i(s))&&(s=a);else if(void 0!==s)break;r=s??r,o.push(parseInstruction(n,e,r,a))}return{instructions:o}},calculateRouteTemplate={requestValidation:routeRequestValidationConfig,buildRequest:e=>{const t=e.locations.some(isPathLike),a=((e,t)=>{const a=[];for(const o of e)if(isPathLike(o))a.push(...expandPathToStops(o));else{const e=getRouteStopOptions(o),r=a.length>0&&e?.candidateEntryPoints?.length?"ignore":t,[n,i]=getPositionStrict(o,{useEntryPoint:r});a.push({coordinate:[n,i],...e&&{options:e}})}return a})(e.locations,e.useEntryPoints),o=(e=>{const t=toPointGeometry(e[0].coordinate),a=toPointGeometry((e.at(-1)??e[0]).coordinate),o=e.slice(1,-1);return{origin:t,destination:a,...o.length&&{waypoints:{type:"MultiPoint",coordinates:o.map(e=>e.coordinate)}}}})(a),r=(e=>{return{...buildCommonRoutingBody(e),...e.maxAlternatives&&{maxPathAlternativeRoutes:e.maxAlternatives},..."arriveBy"===e.when?.option&&{arrivalDateTime:toAPIDateTime(e.when)},...e.guidance&&{guidance:"instructions",instructionPhonetics:"ipa"},...e.costModel?.avoidAreas?.length&&{avoidAreas:(t=e.costModel.avoidAreas,{rectangles:t.map(e=>{const t=bboxFromGeoJSON(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");return{type:"Feature",bbox:t,geometry:null}})})},...e.arrivalSide&&{arrivalSidePreference:"curb"===e.arrivalSide?"curbSide":"anySide"}};var t})(e),n=(e=>({...buildCommonServiceRequestHeaders(e),Attributes:buildAttributesHeader(e)}))(e),i=((e,t)=>{const a=e.slice(1).map((t,a)=>({...e[a].legToNext,...toLegRequest(t)}));if(t||!a.every(e=>0===Object.keys(e).length))return a})(a,t),s={routePlanningLocations:o,...r,...i&&{legs:i},...e.vehicle&&buildVehicleBody(e.vehicle)},c=new URL(`${e.commonBaseURL}/maps/orbis/routing/routes/calculate`);return((e,t)=>{t.computeTravelTimeFor&&e.searchParams.set("computeTravelTimeFor",t.computeTravelTimeFor)})(c,e),{method:"POST",url:c,data:s,headers:n}},sendRequest:post,parseResponse:(e,t)=>{const a=e.routes.map((a,o)=>((e,t,a,o)=>{const r={type:"LineString",coordinates:e.legs.flatMap(e=>e.path.coordinates)},n={type:"Feature",geometry:r,id:generateId(),bbox:bboxFromGeoJSON(r),properties:{index:t,summary:parseSummary(e.summary),sections:parseSections(e,a),...e.instructions?.length&&{guidance:parseGuidance(e.instructions,r.coordinates,o)},...e.progressPoints&&{progress:e.progressPoints.map(e=>({pointIndex:e.pathIndex,distanceInMeters:e.distanceInMeters,travelTimeInSeconds:e.travelDurationInSeconds}))}}};return((e,{sectionTypes:t,curveDetection:a})=>{const o=e=>!!t?.includes(e);if(!o("curve")&&!o("curvyStretch"))return;const{sections:r}=e.properties,{curve:n,curvyStretch:i}=withCurveSections(e,a).properties.sections;o("curve")&&n&&(r.curve=n),o("curvyStretch")&&i&&(r.curvyStretch=i)})(n,a),n})(a,o,t,e.roadShieldAtlasReference));return a.length>1&&getDistinctSections(a).forEach((e,t)=>{a[t].properties.sections.distinct=e}),featureCollectionWithBBox(a)},parseResponseError:parseRoutingResponseError,apiVersion:3},calculateRoute=async e=>callService(e,calculateRouteTemplate,"Routing"),positionsArraySchema=/* @__PURE__ */(()=>positionsInRangeSchema(2,"a route needs at least two positions","route"))(),lineStringSchema=/* @__PURE__ */(()=>z.object({type:z.literal("LineString"),coordinates:positionsArraySchema}))(),routeFeatureSchema=/* @__PURE__ */(()=>z.object({type:z.literal("Feature"),geometry:lineStringSchema}))(),routeSchema=/* @__PURE__ */(()=>z.union([lineStringSchema,routeFeatureSchema,positionsArraySchema]))(),alongRouteSearchRequestMandatory=/* @__PURE__ */(()=>z.object({route:routeSchema,maxDetourTimeSeconds:z.number().int().positive().max(3600)}))(),alongRouteSearchRequestOptional=/* @__PURE__ */(()=>z.object({sortBy:z.enum(["detourTime","detourOffset"]).optional()}))(),hasFilterValue=e=>void 0!==e&&!(Array.isArray(e)&&0===e.length),appendCommonSearchParams=(e,t)=>{const a=e.searchParams,{filters:o}=t;appendLanguageParam(a,t),appendOptionalParam(a,"limit",t.limit),appendByJoiningParamValue(a,"fuelSet",o?.fuelTypes),appendByJoiningParamValue(a,"idxSet",o?.indexes),appendByJoiningParamValue(a,"brandSet",o?.poiBrands),o?.poiCategories&&appendByJoiningParamValue(a,"categorySet",o.poiCategories.map(e=>poiCategoriesToID[e])),appendByJoiningParamValue(a,"connectorSet",o?.connectors),appendByJoiningParamValue(a,"mapcodes",t.mapcodes),appendByJoiningParamValue(a,"extendedPostalCodesFor",t.extendedPostalCodesFor),appendOptionalParam(a,"minPowerKW",o?.minPowerKW),appendOptionalParam(a,"maxPowerKW",o?.maxPowerKW),appendPlaceEnrichmentParams(a,t,"search"),appendByJoiningParamValue(a,"entityTypeSet",o?.geographyTypes),appendEVModelVersionParam(a)},parseAlongRouteResult=({detourTime:e,detourDistance:t,detourOffset:a,...o})=>{const r=parseSearchAPIResult(o);return{...r,properties:{...r.properties,detourTimeInSeconds:e,detourDistanceInMeters:t,...void 0!==a&&{detourOffsetInMeters:a}}}},alongRouteSearchTemplate={requestValidation:{schema:/* @__PURE__ */(()=>commonSearchParamsSchema.extend({...alongRouteSearchRequestMandatory.shape,...alongRouteSearchRequestOptional.shape}))(),refinements:[{check:({query:e,filters:{indexes:t,...a}={}})=>Boolean(e)||Object.values(a).some(hasFilterValue),message:"Along-route search needs a query or at least one filter other than indexes."}]},buildRequest:e=>{const t=new URL(resolvePlacesQueryEndpointUrl(e,"searchAlongRoute",e.query??""));appendCommonSearchParams(t,e);const a=t.searchParams;return a.append("maxDetourTime",String(e.maxDetourTimeSeconds)),appendOptionalParam(a,"sortBy",e.sortBy),"detourOffset"===e.sortBy&&a.append("detourOffset","true"),appendOptionalParam(a,"spreadingMode","plan"),{url:t,headers:buildPlacesRequestHeaders(e),data:{route:{points:(o=e.route,Array.isArray(o)?{type:"LineString",coordinates:o}:"Feature"===o.type?o.geometry:o).coordinates.map(positionToLatLonAPI)}}};var o},sendRequest:post,parseResponse:({summary:e,results:t})=>toPlacesCollection(t.map(parseAlongRouteResult),parseSummaryAPI(e))},fuzzyLevelSchema=/* @__PURE__ */(()=>z.number().int().min(1).max(4).optional())(),fuzzySearchRequestOptional=/* @__PURE__ */(()=>z.object({minFuzzyLevel:fuzzyLevelSchema,maxFuzzyLevel:fuzzyLevelSchema,filters:searchFiltersSchema.optional()}))(),queryIntentApiToSdk=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:latLonAPIToPosition(e.details)}};break;case"NEARBY":t={...e,details:{position:latLonAPIToPosition(e.details),text:e.details.text,query:e.details.query}};break;case"BOOKMARK":case"W3W":t=e}return t},fuzzySearchTemplate={requestValidation:{schema:/* @__PURE__ */(()=>commonSearchParamsSchema.extend(commonGeocodeAndFuzzySearchParamsSchema.extend(fuzzySearchRequestOptional.shape).shape))(),refinements:[{check:({minFuzzyLevel:e,maxFuzzyLevel:t})=>void 0===e||e<=(t??2),message:"minFuzzyLevel can't exceed maxFuzzyLevel, which defaults to 2."}]},buildRequest:e=>{const t=new URL(resolvePlacesQueryEndpointUrl(e,"search",e.query??""));appendCommonSearchParams(t,e);const a=t.searchParams;return appendOptionalParam(a,"typeahead",e.typeahead),appendSearchCursorParam(a,e.cursor,"FuzzySearch"),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),appendGeoBiasParams(a,e.geoBias),appendOptionalParam(a,"minFuzzyLevel",e.minFuzzyLevel),appendOptionalParam(a,"maxFuzzyLevel",e.maxFuzzyLevel),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.summary.queryIntent?.map(queryIntentApiToSdk);return toPlacesCollection(e.results.map(parseSearchAPIResult),{...parseSummaryAPI(e.summary,{paginated:!0}),...t&&{queryIntent:t}})}},circleCenterSchema=/* @__PURE__ */(()=>positionSchema.refine(isLngLatInRange,lngLatRangeMessage("a Circle center")))(),searchGeometrySchema=/* @__PURE__ */(()=>z.discriminatedUnion("type",[polygonGeometrySchema,z.object({type:z.literal("Circle"),coordinates:circleCenterSchema,radius:z.number().positive()}),z.object({type:z.literal("FeatureCollection"),features:z.array(z.object({type:z.literal("Feature"),geometry:polygonGeometrySchema})).min(1,"a FeatureCollection needs at least one feature")})]))(),geometrySearchRequestMandatory=/* @__PURE__ */(()=>z.object({geometries:z.array(searchGeometrySchema).min(1,"geometries needs at least one geometry")}))(),sampleRingToMaxVertices=e=>{if(e.length<=50)return e;const t=e[0],a=e.at(-1);return((e,t)=>{const a=e.length;if(a<=t)return e;if(t<=1)return e.slice(0,t);const o=(a-1)/(t-1);return Array.from({length:t},(t,a)=>e[Math.round(a*o)])})(t?.[0]===a?.[0]&&t?.[1]===a?.[1]?e.slice(0,-1):e,50)},sdkGeometryToApiGeometries=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:positionToCSVLatLon(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:sampleRingToMaxVertices(e.coordinates[0]).map(e=>positionToCSVLatLon(e))}];case"MultiPolygon":return(e.coordinates.length>50?(e=>{const t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const a=bboxFromGeoJSON({type:"Polygon",coordinates:[e[0]]});if(a){const o=bboxLongitudeSpan(a)*(a[3]-a[1]);t.set(e,o)}}),[...t.entries()].sort((e,t)=>t[1]-e[1]).slice(0,50).map(([e])=>e)})(e):e.coordinates).flatMap(e=>sdkGeometryToApiGeometries({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>sdkGeometryToApiGeometries(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},geometrySearchTemplate={requestValidation:{schema:/* @__PURE__ */(()=>commonSearchParamsSchema.extend(geometrySearchRequestMandatory.shape))()},buildRequest:e=>{const t=new URL(resolvePlacesQueryEndpointUrl(e,"geometrySearch",e.query??""));return appendCommonSearchParams(t,e),{url:t,headers:buildPlacesRequestHeaders(e),data:{geometryList:e.geometries.flatMap(sdkGeometryToApiGeometries)}}},sendRequest:post,parseResponse:e=>toPlacesCollection(e.results.map(parseSearchAPIResult),parseSummaryAPI(e.summary))},LOOKUP_CONFIG_KEYS=["apiKey","commonBaseURL","language","retry","sendUserAgentHeader","validateRequest","signal"],withPOICategoryQueryCodes=async e=>{if(void 0===e.filters?.poiCategoryQuery)return e;const{poiCategoryQuery:t,...a}=e.filters,{poiCategories:o}=await resolvePOICategories({...pickKeys(e,LOOKUP_CONFIG_KEYS),filters:Array.isArray(t)?t:[t]});if(!o.length)throw new SDKError(`discoverPlaces: no POI category matches filters.poiCategoryQuery ${JSON.stringify(t)}. Pass it as query to search it as free text, or pick a code with getPOICategories.`,"DiscoverPlaces",{code:"INVALID_REQUEST"});return{...e,filters:{...a,poiCategories:o}}};async function discoverPlaces(e){return e.route?(async e=>callService(e,alongRouteSearchTemplate,"AlongRouteSearch"))(await withPOICategoryQueryCodes(e)):e.geometries?(async e=>callService(e,geometrySearchTemplate,"GeometrySearch"))(await withPOICategoryQueryCodes(e)):(async e=>callService(e,fuzzySearchTemplate,"FuzzySearch"))(await withPOICategoryQueryCodes(e))}var discoverOnePlace=async e=>fetchFirstPlace("discoverOnePlace","FuzzySearch",e,discoverPlaces),autocompleteSearchSegmentTypes=["brand","category","plaintext"],autocompleteSearchRequestMandatory=/* @__PURE__ */(()=>z.object({query:z.string()}))(),autocompleteSearchRequestOptional=/* @__PURE__ */(()=>z.object({geoBias:pointGeoBiasSchema.extend({radiusMeters:z.number().max(5e6).optional()}).optional(),limit:commonPlacesParamsSchema.shape.limit,filters:geographicFiltersSchema.optional(),resultTypes:z.array(z.enum(autocompleteSearchSegmentTypes)).optional()}))(),parseSegment=e=>{if("brand"===e.type||"plaintext"===e.type)return[e];if("category"!==e.type)return[];const{id:t,...a}=e,o=poiIDsToCategories[Number(t)];return o?[{...a,category:o}]:[]},parseGeoBias=({position:e,radius:t})=>({...e&&{position:latLonAPIToPosition(e)},...void 0!==t&&{radiusMeters:t}}),autocompleteSearchTemplate={requestValidation:{schema:/* @__PURE__ */(()=>autocompleteSearchRequestMandatory.extend(autocompleteSearchRequestOptional.shape))()},buildRequest:e=>{const t=new URL(resolvePlacesQueryEndpointUrl(e,"autocomplete",e.query)),a=t.searchParams;return e.language=e.language??"en-GB",appendLanguageParam(a,e),appendOptionalParam(a,"limit",e.limit),appendGeoBiasParams(a,e.geoBias),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),appendByJoiningParamValue(a,"resultSet",e.resultTypes),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const{geoBias:t,...a}=e.context;return{context:{...a,...t&&{geoBias:parseGeoBias(t)}},results:(o=e.results,o.map(e=>({segments:e.segments.flatMap(parseSegment)})))};var o}},autocompleteSearch=async e=>callService(e,autocompleteSearchTemplate,"Autocomplete"),notCurrent={current:!1},createLatestRequest=e=>{const t="on-start"===(e?.supersede??"on-start");let a=[];const o=()=>{for(const e of a)e.abort();a=[]},r=e=>{const t=a.indexOf(e);for(const o of a.slice(0,t))o.abort();a=a.slice(t+1)};return{run:async e=>{t&&o();const n=new AbortController;a.push(n);const{signal:i}=n;try{const t=await e(i);return i.aborted?notCurrent:(r(n),{current:!0,value:t})}catch(s){if(i.aborted)return notCurrent;throw r(n),s}},cancel:o,isRunning:()=>a.length>0}},namesOf=e=>"category"===e.type&&e.matchedAlternativeName?[e.value,e.matchedAlternativeName]:[e.value],titleMatches=(e,t)=>{const a=foldedWords(e);return foldedWords(t).every(e=>a.some(t=>t.startsWith(e)))},blendSuggestions=({query:e,concept:t,places:a,limit:o})=>{const r=distinctBy(a,e=>e.id),n="none"===t.status?r:[...r.filter(t=>titleMatches(t.title,e)),...r.filter(t=>!titleMatches(t.title,e))];return[..."shown"===t.status?[t.suggestion]:[],...n].slice(0,o)},REFINEMENT_KINDS={brand:!0,category:!0},INDEXES_BY_PLACE_KIND={place:["POI"],address:["PAD","Addr","XStr"],street:["Str"],area:["Geo"]},searchSuggestionsRequestSchema=/* @__PURE__ */(()=>z.object({query:z.string(),limit:z.number().optional(),filters:z.object({kinds:z.array(z.enum([...Object.keys(INDEXES_BY_PLACE_KIND),...Object.keys(REFINEMENT_KINDS)])).optional(),countries:geographicFiltersSchema.shape.countries,areaTypes:placeFiltersSchema.shape.geographyTypes,poiTypes:placeFiltersSchema.shape.poiCategories,boundingBox:hasBBoxSchema.optional()}).optional(),geoBias:pointGeoBiasSchema.pick({position:!0}).optional(),geopoliticalView:commonPlacesParamsSchema.shape.geopoliticalView}))(),SERVICE_NAME="SearchSuggestions",isRefinementKind=e=>e in REFINEMENT_KINDS,KIND_BY_PLACE_TYPE={POI:"place",Street:"street",Geography:"area","Point Address":"address","Address Range":"address","Cross Street":"address"},distanceFrom=(e,t)=>e.properties.distance??(t&&distance(t,e.geometry.coordinates,{units:"meters"})),toPlaceSuggestions=(e,t)=>{const a=getPosition(t)??void 0,o=((e,t)=>{if(t)return((e,t)=>{let a,o;for(const r of e){const e=distanceFrom(r,t);void 0===e||Number.isNaN(e)||(void 0===o||e<o)&&(a=r,o=e)}return a})(e,t)?.properties.address.countryCode;const a=/* @__PURE__ */new Map;for(const n of e){const e=String(n.properties.address.countryCode);a.set(e,(a.get(e)??0)+1)}let o,r=0;for(const[n,i]of a)i>r&&(o=n,r=i);return o})(e,a);return e.map(e=>((e,t,a)=>{const{type:o,address:r,poi:n}=e.properties,i=r.freeformAddress.split(", ").filter(Boolean),[s="",...c]=n?.name?[n.name,...i]:i,l=r.countryCode!==t?r.country:void 0;return{kind:KIND_BY_PLACE_TYPE[o],id:String(e.id),title:s,subtitles:l?[...c,l]:c,distanceInMeters:distanceFrom(e,a),resolve:async()=>{const{distance:t,score:a,...o}=e.properties;return{...e,properties:o}}}})(e,o,a))},throwAsSearchSuggestionsError=e=>{if(e instanceof SDKAbortError)throw new SDKAbortError(SERVICE_NAME,e.cause);if(e instanceof SDKServiceError)throw new SDKServiceError(e.message,SERVICE_NAME,e.status,{apiErrorCode:e.apiErrorCode});if(e instanceof SDKError)throw new SDKError(e.message,SERVICE_NAME,{code:e.code,issues:e.issues,cause:e.cause});throw e},toRefinement=(e,t)=>{const a="brand"===e.type?{poiBrands:[e.value]}:{poiCategories:[e.category]},o={...t,filters:{...t.filters,...a}},r={title:e.value,refineParams:o,refine:e=>discoverPlaces({...o,...e&&{signal:e}})};return"brand"===e.type?{...r,kind:"brand"}:{...r,kind:"category",category:e.category}},toRefinementSuggestions=(e,t)=>distinctBy(e.flatMap(e=>e.segments.flatMap(e=>"plaintext"===e.type?[]:[toRefinement(e,t)])),e=>`${e.kind}:${e.title}`),pickConcept=(e,t,a,o,r)=>{const n=((e,t)=>{const a=t.flatMap(({segments:t})=>{const[a]=t;return 1===t.length&&"plaintext"!==a.type&&namesOf(a).some(t=>((e,t)=>{const a=compactFoldedText(t),o=foldedWords(e);return""!==a&&o.some((e,t)=>o.slice(t).join("").startsWith(a))})(t,e))?[a]:[]});return a.find(t=>namesOf(t).some(t=>((e,t)=>{const[a,...o]=foldedWords(t);return 0===o.length&&foldedWords(e).some(e=>e.startsWith(a)&&2*a.length>=e.length)})(t,e)))??a[0]})(e,t);if(!n)return{status:"none"};const i=!r||r.includes("place");return"brand"===n.type&&i&&!((e,t)=>{const a=compactFoldedText(e);return t.slice(0,5).some(e=>e.properties.poi?.brands?.some(e=>compactFoldedText(e)===a))})(n.value,a)?{status:"withheld"}:{status:"shown",suggestion:toRefinement(n,o)}},getSearchSuggestions=async e=>{(e=>{throwIfAborted(e.signal,SERVICE_NAME);const t=mergeFromGlobal(e);throwIfInsecureBaseURL(t.commonBaseURL,SERVICE_NAME),validateServiceRequest(e,t,{schema:searchSuggestionsRequestSchema},SERVICE_NAME)})(e);const{query:t,limit:a,filters:o,geoBias:r,signal:n,...i}=e,s=o?.countries,c=clamp(a??5,1,10),{placeKinds:l,refinementKinds:d,wantsPlaces:p,wantsRefinements:u}=(e=>{const t=e?.filter(e=>!isRefinementKind(e)),a=e?.filter(isRefinementKind);return{placeKinds:t,refinementKinds:a,wantsPlaces:!e||Boolean(t?.length),wantsRefinements:!e||Boolean(a?.length)}})(o?.kinds),m=r&&{position:r.position},g=(o?.boundingBox&&{boundingBox:o.boundingBox})??m,{onAPIRequest:h,onAPIResponse:y,...S}=i,R={...S,query:"",...s&&{filters:{countries:s}},geoBias:g},T={...i,signal:n,query:t,limit:10,typeahead:!0,geoBias:g,filters:{countries:s,indexes:l?.flatMap(e=>INDEXES_BY_PLACE_KIND[e]),poiCategories:o?.poiTypes,geographyTypes:o?.areaTypes}},[f,P]=await Promise.all([p?discoverPlaces(T):void 0,u?autocompleteSearch({...i,signal:n,query:t,limit:c,...s&&{filters:{countries:s}},geoBias:m,resultTypes:d??["brand","category"]}):void 0]).catch(throwAsSearchSuggestionsError),A=P?.results??[];if(!p)return{suggestions:toRefinementSuggestions(A,R).slice(0,c)};const I=(f?.features??[]).filter(e=>!l||l.includes(KIND_BY_PLACE_TYPE[e.properties.type]));return{suggestions:blendSuggestions({query:t,concept:pickConcept(t,A,I,R,l),places:toPlaceSuggestions(I,r?.position),limit:c})}},addDays=(e,t)=>{const a=new Date(e);return a.setUTCDate(a.getUTCDate()+t),a},daysAgo=e=>addDays(/* @__PURE__ */new Date,-e),toDateString=e=>e instanceof Date?e.toISOString().slice(0,10):e,startOfDayUTC=e=>Date.parse(toDateString(e)),OFFSET=/(?:Z|[+-]\d{2}:\d{2})$/,parseDateTime=e=>new Date(OFFSET.test(e)?e:`${e}Z`),functionalRoadClasses=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],API_NAMES_BY_METRIC_KEY={speed:{dataType:"SPEED",field:"v"},freeFlowSpeed:{dataType:"FREE_FLOW_SPEED",field:"fv"},congestionLevel:{dataType:"CONGESTION_LEVEL",field:"c"},travelTime:{dataType:"TRAVEL_TIME",field:"t"},networkLength:{dataType:"NETWORK_LENGTH",field:"l"}},ALL_HOURS=/* @__PURE__ */(()=>Array.from({length:24},(e,t)=>t))(),frcToNumber=e=>functionalRoadClasses.indexOf(e),parseMetricFields=(e,t)=>{const a={};return areaAnalyticsMetricKeys.forEach(o=>{const r=e[API_NAMES_BY_METRIC_KEY[o].field];void 0!==r&&(a[o]=t(r))}),a},parseMetrics=e=>parseMetricFields(e,e=>e),parseMetricKey=e=>areaAnalyticsMetricKeys.find(t=>API_NAMES_BY_METRIC_KEY[t].dataType===e),parsePeriodStart=e=>{const t=parseDateTime(e);return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,date:new Date(startOfDayUTC(t)),hour:t.getUTCHours()}},IDENTIFIERS_BY_GRANULARITY={yearly:({year:e})=>({year:e}),monthly:({year:e,month:t})=>({year:e,month:t}),weekly:({date:e})=>(e=>{const t=addDays(e,4-(e.getUTCDay()||7)),a=t.getUTCFullYear(),o=(t.getTime()-Date.UTC(a,0,1))/864e5;return{year:a,week:Math.floor(o/7)+1}})(e),daily:({date:e})=>({date:e}),hourly:({date:e,hour:t})=>({date:e,hour:t})},parseCalendarEntries=(e,t)=>e.map(e=>({...IDENTIFIERS_BY_GRANULARITY[t](parsePeriodStart(e.time)),...parseMetrics(e)})),DAY_BY_API_DAY_OF_WEEK={MONDAY:1,TUESDAY:2,WEDNESDAY:3,THURSDAY:4,FRIDAY:5,SATURDAY:6,SUNDAY:7},parseAverageEntry=e=>{const[t,a]=e.time.split("-"),o=Object.hasOwn(DAY_BY_API_DAY_OF_WEEK,t)?DAY_BY_API_DAY_OF_WEEK[t]:void 0;return void 0===o?void 0:{day:o,hour:Number(a),...parseMetrics(e)}},hourOfWeek=({day:e,hour:t})=>24*(e-1)+t,parseTileEntry=e=>({tileCentre:latLonAPIToPosition(e),...parseMetrics(e)}),parseAnomaly=e=>({startDate:parseDateTime(e.startDate),endDate:parseDateTime(e.endDate),labels:e.labels.map(({name:e})=>e)}),parseTimedData=e=>{return{...e.yearly&&{yearly:parseCalendarEntries(e.yearly,"yearly")},...e.monthly&&{monthly:parseCalendarEntries(e.monthly,"monthly")},...e.weekly&&{weekly:parseCalendarEntries(e.weekly,"weekly")},...e.daily&&{daily:parseCalendarEntries(e.daily,"daily")},...e.hourly&&{hourly:parseCalendarEntries(e.hourly,"hourly")},...e.average&&{average:(t=e.average,t.map(parseAverageEntry).filter(e=>void 0!==e).sort((e,t)=>hourOfWeek(e)-hourOfWeek(t)))}};var t},parseAnomalies=e=>parseMetricFields(e,e=>e.map(parseAnomaly)),parseFeature=e=>{return{type:e.type,id:e.id,geometry:e.geometry,properties:(t=e.properties,{...void 0!==t.name&&{name:t.name},...void 0!==t.timezone&&{timezone:t.timezone},level:t.level,baseData:parseMetrics(t.baseData),timedData:parseTimedData(t.timedData),...t.tiledData&&{tiledData:{tiles:t.tiledData.tiles.map(parseTileEntry)}},...t.anomalies&&{anomalies:parseAnomalies(t.anomalies)}}),bbox:bboxFromGeoJSON(e.geometry)};var t},computeTileRanges=e=>{const t=e.flatMap(e=>e.properties.tiledData?.tiles??[]),a={};return areaAnalyticsMetricKeys.forEach(e=>{t.forEach(t=>{const o=t[e];if(null==o)return;const r=a[e];r?(r.min=Math.min(r.min,o),r.max=Math.max(r.max,o)):a[e]={min:o,max:o}})}),a},parseAnalysisPeriod=e=>{const t=e.map(startOfDayUTC);return{startDate:new Date(Math.min(...t)),endDate:new Date(Math.max(...t))}},dateInputSchema=/* @__PURE__ */(()=>z.union([z.date(),z.iso.date("Date must be a valid date in 'YYYY-MM-DD' format")]))(),isAccepted=e=>startOfDayUTC(e)<=startOfDayUTC(daysAgo(2)),trafficAreaAnalyticsTemplate={requestValidation:{schema:/* @__PURE__ */(()=>commonServiceRequestSchema.extend({name:z.string().optional(),startDate:dateInputSchema.optional(),endDate:dateInputSchema.optional(),days:z.array(dateInputSchema).min(1).optional(),metrics:z.union([z.array(z.enum(areaAnalyticsMetricKeys)).min(1),z.literal("all")]),functionalRoadClasses:z.union([z.array(z.enum(functionalRoadClasses)).min(1),z.literal("all")]),hours:z.union([z.array(z.number().int().min(0).max(23)).min(1),z.literal("all")]),geometry:polygonGeometrySchema}).refine(e=>{const t=void 0!==e.days,a=void 0!==e.startDate;if(t&&(a||void 0!==e.endDate))return!1;if(!t&&!a)return!1;if(void 0!==e.startDate){const t=e.endDate??daysAgo(3),a=(startOfDayUTC(t)-startOfDayUTC(e.startDate))/864e5;return a>=1&&a<=31}return!0},{message:"Provide either startDate (with optional endDate, at least 1 day apart and within 31 days) or days — but not both"}).refine(e=>void 0!==e.days?e.days.every(isAccepted):void 0===e.endDate||isAccepted(e.endDate),{message:"Dates must be at least 2 days before today"}))()},buildRequest:e=>{const t=new URL((e=>`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));((e,t)=>{e.append("apiVersion",String(t.apiVersion)),t.apiKey&&e.append("key",t.apiKey),t.language&&e.append("language",serviceLanguage(t.language))})(t.searchParams,e);const a=void 0!==e.days?{days:e.days.map(toDateString)}:{startDate:toDateString(e.startDate),endDate:toDateString(e.endDate??daysAgo(3))};return{method:"POST",url:t,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...a,dataTypes:("all"===e.metrics?areaAnalyticsMetricKeys:e.metrics).map(e=>API_NAMES_BY_METRIC_KEY[e].dataType),frcs:"all"===e.functionalRoadClasses?functionalRoadClasses.map((e,t)=>t):e.functionalRoadClasses.map(frcToNumber),hours:"all"===e.hours?ALL_HOURS:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},sendRequest:post,parseResponse:e=>{const t=e.features.map(parseFeature);return{type:"FeatureCollection",properties:{...parseAnalysisPeriod(e.properties.days),metrics:e.properties.dataTypes.map(parseMetricKey).filter(e=>void 0!==e),heatmap:e.properties.heatmap,frcs:e.properties.frcs,ranges:computeTileRanges(t)},features:t}}},trafficAreaAnalytics=async e=>callService(e,trafficAreaAnalyticsTemplate,"TrafficAreaAnalytics"),INCIDENT_PROPERTIES={id:!0,iconCategory:!0,magnitudeOfDelay:!0,"events.description":!0,"events.code":!0,"events.iconCategory":!0,startTime:!0,endTime:!0,from:!0,to:!0,lengthInMeters:!0,delayInSeconds:!0,roadNumbers:!0,timeValidity:!0,probabilityOfOccurrence:!0,numberOfReports:!0,lastReportTime:!0},DEFAULT_ATTRIBUTES=/* @__PURE__ */(()=>["incidents.type","incidents.geometry.type","incidents.geometry.coordinates",...Object.keys(INCIDENT_PROPERTIES).map(e=>`incidents.properties.${e}`)].join(","))(),parseEvent=e=>({description:e.description,code:e.code,category:toTrafficIncidentCategory(e.iconCategory)}),parseIncident=e=>{const t=e.properties;return{type:"Feature",id:t.id,geometry:e.geometry,properties:{id:t.id,category:toTrafficIncidentCategory(t.iconCategory),magnitudeOfDelay:toDelayMagnitude(t.magnitudeOfDelay),events:(t.events??[]).map(parseEvent),...t.startTime&&{startTime:new Date(t.startTime)},...t.endTime&&{endTime:new Date(t.endTime)},...t.from&&{from:t.from},...t.to&&{to:t.to},...null!=t.lengthInMeters&&{lengthInMeters:t.lengthInMeters},...null!=t.delayInSeconds&&{delayInSeconds:t.delayInSeconds},...t.roadNumbers&&{roadNumbers:t.roadNumbers},timeValidity:t.timeValidity,...t.probabilityOfOccurrence&&{probabilityOfOccurrence:t.probabilityOfOccurrence},...null!=t.numberOfReports&&{numberOfReports:t.numberOfReports},...t.lastReportTime&&{lastReportTime:new Date(t.lastReportTime)}}}},withoutBBox=e=>"Polygon"===e.type?{type:"Polygon",coordinates:e.coordinates}:{type:"MultiPolygon",coordinates:e.coordinates},incidentsIntersecting=(e,t)=>{const a=(e=>"FeatureCollection"===e.type?e.features.map(e=>e.geometry):["Feature"===e.type?e.geometry:e])(t).map(withoutBBox).map(e=>({geometry:e,bbox:bbox(e)}));return e.filter(e=>{const t=bbox(e.geometry);return a.some(a=>{return o=t,r=a.bbox,o[0]<=r[2]&&r[0]<=o[2]&&o[1]<=r[3]&&r[1]<=o[3]&&booleanIntersects(e.geometry,a.geometry);var o,r})})},polygonFeatureSchema=/* @__PURE__ */(()=>featureSchema.omit({bbox:!0}).extend({geometry:polygonGeometrySchema}))(),polygonSchema=/* @__PURE__ */(()=>z.union([polygonGeometrySchema,polygonFeatureSchema,z.object({type:z.literal("FeatureCollection"),features:z.array(polygonFeatureSchema).min(1,"a FeatureCollection polygon needs at least one feature")})]))(),trafficIncidentDetailsTemplate={requestValidation:{schema:/* @__PURE__ */(()=>commonServiceRequestSchema.extend({bbox:hasBBoxSchema.optional(),polygon:polygonSchema.optional(),ids:z.array(z.string()).min(1,"ids must contain at least one id").max(100,"ids must contain at most 100 ids").optional(),categoryFilter:z.array(z.enum(trafficIncidentRequestCategories)).optional(),timeValidityFilter:z.array(z.enum(trafficIncidentTimeValidities)).optional()}))(),refinements:[{check:e=>1===[e.bbox,e.polygon,e.ids].filter(Boolean).length,message:"Provide exactly one of bbox, polygon or ids"}]},apiVersion:2,buildRequest:e=>{const t=new URL((e=>`${e.commonBaseURL}/maps/orbis/traffic/incidents/details`)(e)),a=t.searchParams;((e,t)=>{appendByJoiningParamValue(e,"iconCategories",t.categoryFilter?.map(toIconCategory)),appendByJoiningParamValue(e,"timeValidity",t.timeValidityFilter)})(a,e);const o=(e=>{const t=trafficIncidentLanguage(e.language);return{...buildCommonServiceRequestHeaders({...e,language:void 0}),...t&&{"Accept-Language":t},Attributes:DEFAULT_ATTRIBUTES}})(e);if(e.ids){const{ids:r}=e;return r.length>5?{method:"POST",url:t,headers:o,data:{ids:r}}:(a.append("ids",r.join(",")),{method:"GET",url:t,headers:o})}const r=e.polygon?bbox(e.polygon,{recompute:!0}):bboxFromGeoJSON(e.bbox);return r&&a.append("bbox",r.join(",")),{method:"GET",url:t,headers:o}},sendRequest:async(e,t,a)=>{if("GET"===e.method)return get(e,t,a);if("POST"===e.method)return post(e,t,a);throw new Error(`Unsupported HTTP method received: ${e.method}`)},parseResponse:(e,t)=>{const a=(e.incidents??[]).filter(e=>null!==e).map(parseIncident);return{type:"FeatureCollection",features:t?.polygon?incidentsIntersecting(a,t.polygon):a}}},trafficIncidentDetails=async e=>callService(e,trafficIncidentDetailsTemplate,"TrafficIncidentDetails");export{APIErrorCode,SDKAbortError,SDKError,SDKServiceError,arrivalSides,calculateReachableRange,calculateReachableRanges,calculateRoute,createLatestRequest,discoverOnePlace,discoverPlaces,functionalRoadClasses,geocode,geocodeOne,geometryData,getPOICategories,getPOICategoryCodes,getPlaceDetails,getSearchSuggestions,resolvePOICategories,reverseGeocode,routeTypes,tollTransponderOptions,trafficAreaAnalytics,trafficIncidentDetails};
|