{"version":3,"sources":["../src/constants.ts","../src/rateLimiter.ts","../src/utils/geo.ts","../src/ors.ts","../src/tools/geocode.ts","../src/tools/routeProximity.ts","../src/tools/tourPlanner.ts","../src/tools/vrpPlanner.ts"],"names":["axios","EARTH_RADIUS_KM","toRadians","EPSILON","distanceToSeed","MS_PER_DAY","normalizeCoordinate","normalizeClient"],"mappings":"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","file":"index.cjs","sourcesContent":["export const DEFAULT_BASE_URL = 'https://api.openrouteservice.org';\nexport const DEFAULT_API_VERSION = 'v2';\nexport const DEFAULT_TIMEOUT = 30000;\nexport const DEFAULT_ENV_KEY = 'ORS_API_KEY';\n\nexport type DirectionModeGroup = 'driving' | 'cycling' | 'foot' | 'wheelchair';\n\nexport const PROFILE_GROUPS: Record<DirectionModeGroup, string[]> = {\n  driving: [\n    'driving-car',\n    'driving-hgv',\n    'driving-tractor',\n    'driving-electric',\n    'driving-emergency'\n  ],\n  cycling: [\n    'cycling-regular',\n    'cycling-road',\n    'cycling-mountain',\n    'cycling-electric',\n    'cycling-safe',\n    'cycling-tour',\n    'cycling-gravel'\n  ],\n  foot: ['foot-walking', 'foot-hiking'],\n  wheelchair: ['wheelchair']\n};\n\nexport interface RateLimit {\n  requests: number;\n  intervalMs: number;\n}\n\nexport interface DirectionLimits {\n  maxWaypoints: number;\n  maxAvoidPolygonAreaKm2: number;\n  maxAvoidPolygonExtentKm: number;\n  maxAlternativeRoutes: number;\n  maxRoundTripDistanceKm: number;\n  maxDistanceKmByGroup: Record<DirectionModeGroup, number>;\n  maxRestrictedDistanceKmByGroup: Partial<Record<DirectionModeGroup, number>>;\n}\n\nexport interface IsochroneLimits {\n  maxLocations: number;\n  maxIntervals: number;\n  maxRangeDistanceKm: number;\n  maxRangeTimeHoursByGroup: Record<Exclude<DirectionModeGroup, 'wheelchair'>, number>;\n}\n\nexport interface MatrixLimits {\n  maxLocationsProduct: number;\n  maxDynamicLocations: number;\n}\n\nexport interface SnapLimits {\n  maxLocations: number;\n}\n\nexport interface PoisLimits {\n  maxBboxAreaKm2: number;\n  maxLinestringLengthKm: number;\n  maxSearchRadiusKm: number;\n}\n\nexport interface ElevationLimits {\n  maxVertices: number;\n}\n\nexport interface OptimizationLimits {\n  maxRoutes: number;\n  maxVehicles: number;\n}\n\nexport interface ExportLimits {\n  maxBboxAreaKm2: number;\n}\n\nexport interface ORSLimits {\n  rateLimit: RateLimit;\n  directions: DirectionLimits;\n  isochrones: IsochroneLimits;\n  matrix: MatrixLimits;\n  snap: SnapLimits;\n  pois: PoisLimits;\n  elevation: ElevationLimits;\n  optimization: OptimizationLimits;\n  export: ExportLimits;\n}\n\nexport const DEFAULT_LIMITS: ORSLimits = {\n  rateLimit: {\n    requests: 40,\n    intervalMs: 60_000\n  },\n  directions: {\n    maxWaypoints: 50,\n    maxAvoidPolygonAreaKm2: 200,\n    maxAvoidPolygonExtentKm: 20,\n    maxAlternativeRoutes: 3,\n    maxRoundTripDistanceKm: 100,\n    maxDistanceKmByGroup: {\n      driving: 6000,\n      cycling: 6000,\n      foot: 6000,\n      wheelchair: 6000\n    },\n    maxRestrictedDistanceKmByGroup: {\n      driving: 150,\n      cycling: 150,\n      foot: 150,\n      wheelchair: 300\n    }\n  },\n  isochrones: {\n    maxLocations: 5,\n    maxIntervals: 10,\n    maxRangeDistanceKm: 120,\n    maxRangeTimeHoursByGroup: {\n      driving: 1,\n      cycling: 5,\n      foot: 20\n    }\n  },\n  matrix: {\n    maxLocationsProduct: 3500,\n    maxDynamicLocations: 25\n  },\n  snap: {\n    maxLocations: 5000\n  },\n  pois: {\n    maxBboxAreaKm2: 50,\n    maxLinestringLengthKm: 500,\n    maxSearchRadiusKm: 2\n  },\n  elevation: {\n    maxVertices: 2000\n  },\n  optimization: {\n    maxRoutes: 50,\n    maxVehicles: 3\n  },\n  export: {\n    maxBboxAreaKm2: 10\n  }\n};\n\nexport const DEFAULT_USER_AGENT = 'ors-ts-client/0.1.0';\n","type Task = {\n  fn: () => Promise<unknown>;\n  resolve: (value: unknown) => void;\n  reject: (reason?: unknown) => void;\n};\n\nexport interface RateLimiterOptions {\n  requests: number;\n  intervalMs: number;\n}\n\nexport class RateLimiter {\n  private readonly capacity: number;\n  private readonly intervalMs: number;\n  private tokens: number;\n  private lastRefill: number;\n  private queue: Task[] = [];\n  private timer?: NodeJS.Timeout;\n\n  constructor(options: RateLimiterOptions) {\n    if (options.requests <= 0 || options.intervalMs <= 0) {\n      throw new Error('Rate limiter requires positive request and interval values.');\n    }\n    this.capacity = options.requests;\n    this.intervalMs = options.intervalMs;\n    this.tokens = options.requests;\n    this.lastRefill = Date.now();\n  }\n\n  async schedule<T>(fn: () => Promise<T>): Promise<T> {\n    this.refillTokens();\n    if (this.tokens > 0 && this.queue.length === 0) {\n      this.tokens -= 1;\n      return fn();\n    }\n\n    return new Promise<T>((resolve, reject) => {\n      const task: Task = {\n        fn: () => fn() as Promise<unknown>,\n        resolve: (value) => resolve(value as T),\n        reject\n      };\n      this.queue.push(task);\n      this.ensureProcessingScheduled();\n    });\n  }\n\n  private ensureProcessingScheduled() {\n    if (this.timer) {\n      return;\n    }\n    const delay = Math.max(0, this.intervalMs - (Date.now() - this.lastRefill));\n    this.timer = setTimeout(() => {\n      this.timer = undefined;\n      this.processQueue();\n    }, delay);\n  }\n\n  private processQueue() {\n    this.refillTokens();\n    while (this.tokens > 0 && this.queue.length > 0) {\n      const task = this.queue.shift() as Task;\n      this.tokens -= 1;\n      task.fn().then(task.resolve, task.reject);\n    }\n\n    if (this.queue.length > 0) {\n      this.ensureProcessingScheduled();\n    }\n  }\n\n  private refillTokens() {\n    const now = Date.now();\n    if (this.tokens >= this.capacity) {\n      this.lastRefill = now;\n      return;\n    }\n\n    const elapsed = now - this.lastRefill;\n    if (elapsed >= this.intervalMs) {\n      const intervals = Math.floor(elapsed / this.intervalMs);\n      this.tokens = Math.min(this.capacity, this.tokens + intervals * this.capacity);\n      this.lastRefill += intervals * this.intervalMs;\n    }\n  }\n}\n","import type { Feature, FeatureCollection, GeoJsonObject, LineString, MultiPolygon, Polygon } from 'geojson';\n\nexport type LonLat = [number, number];\n\nconst EARTH_RADIUS_KM = 6371;\n\nconst toRadians = (value: number): number => (value * Math.PI) / 180;\n\nexport const haversineDistanceKm = (a: LonLat, b: LonLat): number => {\n  const [lon1, lat1] = a;\n  const [lon2, lat2] = b;\n\n  const dLat = toRadians(lat2 - lat1);\n  const dLon = toRadians(lon2 - lon1);\n  const lat1Rad = toRadians(lat1);\n  const lat2Rad = toRadians(lat2);\n\n  const sinDLat = Math.sin(dLat / 2);\n  const sinDLon = Math.sin(dLon / 2);\n\n  const h =\n    sinDLat * sinDLat + Math.cos(lat1Rad) * Math.cos(lat2Rad) * sinDLon * sinDLon;\n  const c = 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h));\n\n  return EARTH_RADIUS_KM * c;\n};\n\nexport const bboxAreaKm2 = (bbox: [number, number, number, number]): number => {\n  const [minLon, minLat, maxLon, maxLat] = bbox;\n  const width = haversineDistanceKm([minLon, minLat], [maxLon, minLat]);\n  const height = haversineDistanceKm([minLon, minLat], [minLon, maxLat]);\n  return width * height;\n};\n\nconst polygonRingAreaKm2 = (ring: LonLat[], latitudeFactor: number): number => {\n  let area = 0;\n  for (let i = 0; i < ring.length; i += 1) {\n    const [lon1, lat1] = ring[i];\n    const [lon2, lat2] = ring[(i + 1) % ring.length];\n    const x1 = lon1 * latitudeFactor;\n    const x2 = lon2 * latitudeFactor;\n    const y1 = lat1;\n    const y2 = lat2;\n    area += x1 * y2 - x2 * y1;\n  }\n\n  const km2Factor = Math.pow((Math.PI / 180) * EARTH_RADIUS_KM, 2);\n  return Math.abs(area) * 0.5 * km2Factor;\n};\n\nexport const polygonAreaKm2 = (polygon: Polygon): number => {\n  const [outerRing] = polygon.coordinates;\n  if (!outerRing) {\n    return 0;\n  }\n\n  const avgLat =\n    outerRing.reduce((sum, [, lat]) => sum + lat, 0) / outerRing.length || 0;\n  const latitudeFactor = Math.cos(toRadians(avgLat));\n\n  let area = polygonRingAreaKm2(outerRing as LonLat[], latitudeFactor);\n  if (polygon.coordinates.length > 1) {\n    for (let i = 1; i < polygon.coordinates.length; i += 1) {\n      area -= polygonRingAreaKm2(polygon.coordinates[i] as LonLat[], latitudeFactor);\n    }\n  }\n  return Math.max(area, 0);\n};\n\nconst multiPolygonAreaKm2 = (multiPolygon: MultiPolygon): number =>\n  multiPolygon.coordinates.reduce((sum, polygonCoords) => {\n    const polygon: Polygon = {\n      type: 'Polygon',\n      coordinates: polygonCoords\n    };\n    return sum + polygonAreaKm2(polygon);\n  }, 0);\n\nexport const featureCollectionAreaKm2 = (\n  geojson: FeatureCollection | Feature | Polygon | MultiPolygon\n): number => {\n  if ('type' in geojson) {\n    switch (geojson.type) {\n      case 'Polygon':\n        return polygonAreaKm2(geojson);\n      case 'MultiPolygon':\n        return multiPolygonAreaKm2(geojson);\n      case 'Feature':\n        if (geojson.geometry) {\n          return featureCollectionAreaKm2(geojson.geometry as GeoJsonObject as Polygon | MultiPolygon);\n        }\n        return 0;\n      case 'FeatureCollection':\n        return geojson.features.reduce(\n          (sum, feature) => sum + featureCollectionAreaKm2(feature),\n          0\n        );\n      default:\n        return 0;\n    }\n  }\n  return 0;\n};\n\nexport const linestringLengthKm = (line: LineString): number => {\n  const { coordinates } = line;\n  if (!coordinates || coordinates.length < 2) {\n    return 0;\n  }\n  let length = 0;\n  for (let i = 0; i < coordinates.length - 1; i += 1) {\n    length += haversineDistanceKm(\n      coordinates[i] as LonLat,\n      coordinates[i + 1] as LonLat\n    );\n  }\n  return length;\n};\n\nexport const metersToKilometers = (meters: number): number => meters / 1000;\n\nexport const pathLengthKm = (coordinates: LonLat[]): number => {\n  if (coordinates.length < 2) {\n    return 0;\n  }\n  let total = 0;\n  for (let i = 0; i < coordinates.length - 1; i += 1) {\n    total += haversineDistanceKm(coordinates[i], coordinates[i + 1]);\n  }\n  return total;\n};\n","import axios, { AxiosInstance, AxiosRequestConfig } from \"axios\"\r\nimport {\r\n\tDEFAULT_API_VERSION,\r\n\tDEFAULT_BASE_URL,\r\n\tDEFAULT_ENV_KEY,\r\n\tDEFAULT_LIMITS,\r\n\tDEFAULT_TIMEOUT,\r\n\tDEFAULT_USER_AGENT,\r\n\tDirectionModeGroup,\r\n\tORSLimits,\r\n\tPROFILE_GROUPS,\r\n} from \"./constants.js\"\r\nimport { RateLimiter } from \"./rateLimiter.js\"\r\nimport type { RateLimiterOptions } from \"./rateLimiter.js\"\r\nimport {\r\n\tbboxAreaKm2,\r\n\tfeatureCollectionAreaKm2,\r\n\thaversineDistanceKm,\r\n\tlinestringLengthKm,\r\n\tmetersToKilometers,\r\n\tpathLengthKm,\r\n} from \"./utils/geo.js\"\r\nimport type {\r\n\tDirectionsProfile,\r\n\tDirectionsRequest,\r\n\tElevationLineRequest,\r\n\tElevationPointRequest,\r\n\tGeocodeCommonParams,\r\n\tIsochroneProfile,\r\n\tIsochroneRequest,\r\n\tMatrixProfile,\r\n\tMatrixRequest,\r\n\tOptimizationRequest,\r\n\tORSClientOptions,\r\n\tPoisRequest,\r\n\tRequestOptions,\r\n\tSnapProfile,\r\n\tSnapRequest,\r\n} from \"./types.js\"\r\nimport type {\r\n\tFeature,\r\n\tFeatureCollection,\r\n\tGeoJsonObject,\r\n\tGeometryCollection,\r\n\tLineString,\r\n\tMultiLineString,\r\n\tMultiPoint,\r\n\tMultiPolygon,\r\n\tPoint,\r\n\tPolygon,\r\n} from \"geojson\"\r\n\r\nconst cloneLimits = (limits: ORSLimits): ORSLimits => JSON.parse(JSON.stringify(limits))\r\n\r\nconst deepMerge = (target: any, source?: any): any => {\r\n\tif (!source) {\r\n\t\treturn target\r\n\t}\r\n\tfor (const key of Object.keys(source)) {\r\n\t\tconst value = source[key]\r\n\t\tif (value === undefined || value === null) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\t\tconst current = target[key]\r\n\t\tif (\r\n\t\t\ttypeof current === \"object\" &&\r\n\t\t\tcurrent !== null &&\r\n\t\t\t!Array.isArray(current) &&\r\n\t\t\ttypeof value === \"object\" &&\r\n\t\t\tvalue !== null &&\r\n\t\t\t!Array.isArray(value)\r\n\t\t) {\r\n\t\t\ttarget[key] = deepMerge({ ...current }, value)\r\n\t\t} else {\r\n\t\t\ttarget[key] = value\r\n\t\t}\r\n\t}\r\n\treturn target\r\n}\r\n\r\nconst buildBaseUrl = (baseUrl: string, apiVersion: string): string => {\r\n\tconst normalizedBase = baseUrl.replace(/\\/+$/, \"\")\r\n\tconst normalizedVersion = apiVersion.replace(/^\\/+/, \"\")\r\n\treturn `${normalizedBase}/${normalizedVersion}`\r\n}\r\n\r\nconst getProfileGroup = (profile: DirectionsProfile): DirectionModeGroup => {\r\n\tfor (const [group, profiles] of Object.entries(PROFILE_GROUPS) as Array<[DirectionModeGroup, string[]]>) {\r\n\t\tif (profiles.includes(profile)) {\r\n\t\t\treturn group\r\n\t\t}\r\n\t}\r\n\tthrow new Error(`Unsupported profile \"${profile}\".`)\r\n}\r\n\r\nconst isGeoJsonObject = (geometry: unknown): geometry is GeoJsonObject => {\r\n\treturn Boolean(geometry && typeof geometry === \"object\" && \"type\" in geometry)\r\n}\r\n\r\nconst appendCoordinates = (geometry: GeoJsonObject, sink: Array<[number, number]>): void => {\r\n\tswitch (geometry.type) {\r\n\t\tcase \"FeatureCollection\": {\r\n\t\t\tconst collection = geometry as FeatureCollection\r\n\t\t\tfor (const feature of collection.features) {\r\n\t\t\t\tif (feature.geometry) {\r\n\t\t\t\t\tappendCoordinates(feature.geometry as GeoJsonObject, sink)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"Feature\": {\r\n\t\t\tconst feature = geometry as Feature\r\n\t\t\tif (feature.geometry) {\r\n\t\t\t\tappendCoordinates(feature.geometry as GeoJsonObject, sink)\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"GeometryCollection\": {\r\n\t\t\tconst collection = geometry as GeometryCollection\r\n\t\t\tfor (const innerGeometry of collection.geometries) {\r\n\t\t\t\tappendCoordinates(innerGeometry as GeoJsonObject, sink)\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"Point\": {\r\n\t\t\tconst [lon, lat] = (geometry as Point).coordinates\r\n\t\t\tif (Number.isFinite(lon) && Number.isFinite(lat)) {\r\n\t\t\t\tsink.push([lon, lat])\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"MultiPoint\": {\r\n\t\t\tconst coordinates = (geometry as MultiPoint).coordinates\r\n\t\t\tfor (const coordinate of coordinates) {\r\n\t\t\t\tif (coordinate.length >= 2) {\r\n\t\t\t\t\tsink.push([coordinate[0], coordinate[1]])\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"LineString\": {\r\n\t\t\tconst coordinates = (geometry as LineString).coordinates\r\n\t\t\tfor (const coordinate of coordinates) {\r\n\t\t\t\tif (coordinate.length >= 2) {\r\n\t\t\t\t\tsink.push([coordinate[0], coordinate[1]])\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"MultiLineString\": {\r\n\t\t\tconst lines = (geometry as MultiLineString).coordinates\r\n\t\t\tfor (const line of lines) {\r\n\t\t\t\tfor (const coordinate of line) {\r\n\t\t\t\t\tif (coordinate.length >= 2) {\r\n\t\t\t\t\t\tsink.push([coordinate[0], coordinate[1]])\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"Polygon\": {\r\n\t\t\tconst rings = (geometry as Polygon).coordinates\r\n\t\t\tfor (const ring of rings) {\r\n\t\t\t\tfor (const coordinate of ring) {\r\n\t\t\t\t\tif (coordinate.length >= 2) {\r\n\t\t\t\t\t\tsink.push([coordinate[0], coordinate[1]])\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tcase \"MultiPolygon\": {\r\n\t\t\tconst polygons = (geometry as MultiPolygon).coordinates\r\n\t\t\tfor (const polygon of polygons) {\r\n\t\t\t\tfor (const ring of polygon) {\r\n\t\t\t\t\tfor (const coordinate of ring) {\r\n\t\t\t\t\t\tif (coordinate.length >= 2) {\r\n\t\t\t\t\t\t\tsink.push([coordinate[0], coordinate[1]])\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\t}\r\n\t\tdefault:\r\n\t\t\tbreak\r\n\t}\r\n}\r\n\r\nconst flattenCoordinates = (feature: Feature | FeatureCollection | GeoJsonObject): Array<[number, number]> => {\r\n\tconst coords: Array<[number, number]> = []\r\n\tif (!isGeoJsonObject(feature)) {\r\n\t\treturn coords\r\n\t}\r\n\r\n\tappendCoordinates(feature, coords)\r\n\treturn coords\r\n}\r\n\r\nconst computeGeometryBbox = (\r\n\tgeometry: Feature | FeatureCollection | GeoJsonObject\r\n): [number, number, number, number] | undefined => {\r\n\tconst coords = flattenCoordinates(geometry)\r\n\tif (!coords.length) {\r\n\t\treturn undefined\r\n\t}\r\n\tlet minLon = coords[0][0]\r\n\tlet minLat = coords[0][1]\r\n\tlet maxLon = coords[0][0]\r\n\tlet maxLat = coords[0][1]\r\n\tfor (const [lon, lat] of coords) {\r\n\t\tminLon = Math.min(minLon, lon)\r\n\t\tminLat = Math.min(minLat, lat)\r\n\t\tmaxLon = Math.max(maxLon, lon)\r\n\t\tmaxLat = Math.max(maxLat, lat)\r\n\t}\r\n\treturn [minLon, minLat, maxLon, maxLat]\r\n}\r\n\r\nexport class ORS {\r\n\tprivate apiKey: string\r\n\tprivate readonly client: AxiosInstance\r\n\tprivate readonly limits: ORSLimits\r\n\tprivate readonly defaultProfile?: DirectionsProfile\r\n\tprivate readonly defaultHeaders: Record<string, string>\r\n\tprivate readonly rateLimiter?: RateLimiter\r\n\r\n\t/**\r\n\t * Builds a ready-to-use ORS client with shared axios transport, limits, and optional rate limiting.\r\n\t * The constructor configures custom base URLs, hydrates defaults for downstream calls, and reads the API key from options or environment variables.\r\n\t * @param options - Client level overrides such as API key, timeouts, default profile, base URL, headers, and limits.\r\n\t * @throws Error when no API key is supplied via options or the expected environment variable.\r\n\t * @example\r\n\t * ```ts\r\n\t * import { ORS } from './ors.js';\r\n\t *\r\n\t * const ors = new ORS({\r\n\t *   apiKey: process.env.ORS_TOKEN ?? '',\r\n\t *   defaultProfile: 'driving-car'\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tconstructor(options: ORSClientOptions = {}) {\r\n\t\tconst {\r\n\t\t\tbaseUrl = DEFAULT_BASE_URL,\r\n\t\t\tapiVersion = DEFAULT_API_VERSION,\r\n\t\t\ttimeoutMs = DEFAULT_TIMEOUT,\r\n\t\t\theaders,\r\n\t\t\tuserAgent = DEFAULT_USER_AGENT,\r\n\t\t\tdefaultProfile,\r\n\t\t\trateLimit,\r\n\t\t\tlimits: limitOverrides,\r\n\t\t} = options\r\n\r\n\t\tconst resolvedApiKey = options.apiKey ?? process.env[DEFAULT_ENV_KEY]\r\n\t\tif (!resolvedApiKey) {\r\n\t\t\tthrow new Error(\r\n\t\t\t\t`Missing openrouteservice API key. Provide it via options.apiKey or set ${DEFAULT_ENV_KEY} in your environment.`\r\n\t\t\t)\r\n\t\t}\r\n\t\tthis.apiKey = resolvedApiKey\r\n\r\n\t\tconst limitsClone = cloneLimits(DEFAULT_LIMITS)\r\n\t\tthis.limits = deepMerge(limitsClone, limitOverrides)\r\n\r\n\t\tconst rateLimitOverrides: RateLimiterOptions = {\r\n\t\t\trequests: rateLimit?.requests ?? this.limits.rateLimit.requests,\r\n\t\t\tintervalMs: rateLimit?.intervalMs ?? this.limits.rateLimit.intervalMs,\r\n\t\t}\r\n\r\n\t\tif (rateLimit?.enabled !== false) {\r\n\t\t\tthis.rateLimiter = new RateLimiter(rateLimitOverrides)\r\n\t\t}\r\n\r\n\t\tthis.defaultHeaders = {\r\n\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\"User-Agent\": userAgent,\r\n\t\t\t...headers,\r\n\t\t}\r\n\r\n\t\tthis.client = axios.create({\r\n\t\t\tbaseURL: buildBaseUrl(baseUrl, apiVersion),\r\n\t\t\ttimeout: timeoutMs,\r\n\t\t})\r\n\t\tthis.defaultProfile = defaultProfile\r\n\t}\r\n\r\n\t/**\r\n\t * Replaces the API key used for subsequent API calls without rebuilding the client.\r\n\t * @param apiKey - The OpenRouteService token to apply.\r\n\t * @throws Error when the provided key is empty.\r\n\t * @example\r\n\t * ```ts\r\n\t * ors.setApiKey(env.ORS_FALLBACK_KEY);\r\n\t * ```\r\n\t */\r\n\tpublic setApiKey(apiKey: string): void {\r\n\t\tif (!apiKey) {\r\n\t\t\tthrow new Error(\"API key cannot be empty.\")\r\n\t\t}\r\n\t\tthis.apiKey = apiKey\r\n\t}\r\n\r\n\t/**\r\n\t * Executes an HTTP request with merged headers, opt-in abort signals, and optional rate limiting.\r\n\t * @param config - Base axios request configuration to send.\r\n\t * @param options - Optional per-request overrides including abort signal and axios tweaks.\r\n\t * @returns The typed response payload from the API.\r\n\t * @throws Error when the request fails or the rate limiter rejects execution.\r\n\t * @example\r\n\t * ```ts\r\n\t * return this.runRequest<{ status: string }>({\r\n\t *   method: 'GET',\r\n\t *   url: 'health'\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tprivate async runRequest<T>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\r\n\t\tconst overrideConfig = options?.axios ?? {}\r\n\t\tconst mergedHeaders = {\r\n\t\t\t...this.defaultHeaders,\r\n\t\t\t...overrideConfig.headers,\r\n\t\t\t...config.headers,\r\n\t\t\tAuthorization: this.apiKey,\r\n\t\t}\r\n\r\n\t\tconst finalConfig: AxiosRequestConfig = {\r\n\t\t\t...overrideConfig,\r\n\t\t\t...config,\r\n\t\t\theaders: mergedHeaders,\r\n\t\t\tsignal: options?.signal ?? overrideConfig.signal ?? config.signal,\r\n\t\t}\r\n\r\n\t\tconst execute = async () => {\r\n\t\t\tconst response = await this.client.request<T>(finalConfig)\r\n\t\t\treturn response.data\r\n\t\t}\r\n\r\n\t\tif (!this.rateLimiter) {\r\n\t\t\treturn execute()\r\n\t\t}\r\n\r\n\t\treturn this.rateLimiter.schedule(execute)\r\n\t}\r\n\r\n\t/**\r\n\t * Resolves the effective directions profile, falling back to the configured default when missing.\r\n\t * @param profile - Optional profile provided by the caller.\r\n\t * @returns Profile value guaranteed to be defined.\r\n\t * @throws Error when no profile is supplied and no default profile has been configured.\r\n\t * @example\r\n\t * ```ts\r\n\t * const profile = this.ensureProfile(inputProfile);\r\n\t * ```\r\n\t */\r\n\tprivate ensureProfile(profile?: DirectionsProfile): DirectionsProfile {\r\n\t\tif (profile) {\r\n\t\t\treturn profile\r\n\t\t}\r\n\t\tif (!this.defaultProfile) {\r\n\t\t\tthrow new Error(\r\n\t\t\t\t\"A profile is required. Provide it as an argument or configure defaultProfile in the client options.\"\r\n\t\t\t)\r\n\t\t}\r\n\t\treturn this.defaultProfile\r\n\t}\r\n\r\n\t/**\r\n\t * Ensures a directions request respects configured limits before contacting the API.\r\n\t * @param profile - Directions profile used to evaluate constraint thresholds.\r\n\t * @param request - Directions body submitted by the caller.\r\n\t * @throws Error when mandatory fields are missing or limits are exceeded.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateDirections('driving-car', requestBody);\r\n\t * ```\r\n\t */\r\n\tprivate validateDirections(profile: DirectionsProfile, request: DirectionsRequest): void {\r\n\t\tif (!request.coordinates || request.coordinates.length < 2) {\r\n\t\t\tthrow new Error(\"Directions request requires at least two coordinates.\")\r\n\t\t}\r\n\r\n\t\tif (request.coordinates.length > this.limits.directions.maxWaypoints) {\r\n\t\t\tthrow new Error(`Directions request exceeds ${this.limits.directions.maxWaypoints} waypoints limit.`)\r\n\t\t}\r\n\r\n\t\tconst group = getProfileGroup(profile)\r\n\t\tconst hasRestrictions =\r\n\t\t\ttypeof request.options?.profile_params?.restrictions === \"object\" &&\r\n\t\t\trequest.options?.profile_params?.restrictions !== null\r\n\t\tif (hasRestrictions) {\r\n\t\t\tconst straightDistance = pathLengthKm(request.coordinates)\r\n\t\t\tconst restrictionLimit = this.limits.directions.maxRestrictedDistanceKmByGroup[group]\r\n\t\t\tif (restrictionLimit !== undefined && straightDistance > restrictionLimit) {\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t`Directions with profile restrictions are limited to ${restrictionLimit} km straight-line distance for ${group} profiles.`\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst options = request.options ?? {}\r\n\t\tconst roundTrip = options.round_trip ?? request.round_trip\r\n\t\tif (roundTrip?.length !== undefined) {\r\n\t\t\tconst roundTripLengthKm = metersToKilometers(roundTrip.length)\r\n\t\t\tif (roundTripLengthKm > this.limits.directions.maxRoundTripDistanceKm) {\r\n\t\t\t\tthrow new Error(`Round trip length exceeds ${this.limits.directions.maxRoundTripDistanceKm} km limit.`)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (options.alternative_routes?.target_count !== undefined) {\r\n\t\t\tif (options.alternative_routes.target_count > this.limits.directions.maxAlternativeRoutes) {\r\n\t\t\t\tthrow new Error(`Alternative routes target_count cannot exceed ${this.limits.directions.maxAlternativeRoutes}.`)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst avoidGeometry = options.avoid_polygons ?? options.avoid_areas\r\n\t\tif (avoidGeometry && isGeoJsonObject(avoidGeometry)) {\r\n\t\t\tconst areaKm2 = featureCollectionAreaKm2(avoidGeometry)\r\n\t\t\tif (areaKm2 > this.limits.directions.maxAvoidPolygonAreaKm2) {\r\n\t\t\t\tthrow new Error(`Avoid areas exceed ${this.limits.directions.maxAvoidPolygonAreaKm2} km² limit.`)\r\n\t\t\t}\r\n\r\n\t\t\tconst bbox = computeGeometryBbox(avoidGeometry)\r\n\t\t\tif (bbox) {\r\n\t\t\t\tconst width = haversineDistanceKm([bbox[0], bbox[1]], [bbox[2], bbox[1]])\r\n\t\t\t\tconst height = haversineDistanceKm([bbox[0], bbox[1]], [bbox[0], bbox[3]])\r\n\t\t\t\tif (Math.max(width, height) > this.limits.directions.maxAvoidPolygonExtentKm) {\r\n\t\t\t\t\tthrow new Error(`Avoid polygon extent exceeds ${this.limits.directions.maxAvoidPolygonExtentKm} km limit.`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates isochrone input against supported profiles, ranges, and limit constraints.\r\n\t * @param profile - Isochrone profile to validate against.\r\n\t * @param request - Isochrone payload provided by the caller.\r\n\t * @throws Error when required fields are absent or a limit is surpassed.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateIsochrones('cycling-electric', requestPayload);\r\n\t * ```\r\n\t */\r\n\tprivate validateIsochrones(profile: IsochroneProfile, request: IsochroneRequest): void {\r\n\t\tif (!request.locations || request.locations.length === 0) {\r\n\t\t\tthrow new Error(\"Isochrone request requires at least one location.\")\r\n\t\t}\r\n\t\tif (request.locations.length > this.limits.isochrones.maxLocations) {\r\n\t\t\tthrow new Error(`Isochrones request exceeds ${this.limits.isochrones.maxLocations} locations limit.`)\r\n\t\t}\r\n\t\tif (!request.range || request.range.length === 0) {\r\n\t\t\tthrow new Error(\"Isochrone request requires at least one range value.\")\r\n\t\t}\r\n\t\tif (request.range.length > this.limits.isochrones.maxIntervals) {\r\n\t\t\tthrow new Error(`Isochrones request exceeds ${this.limits.isochrones.maxIntervals} range intervals limit.`)\r\n\t\t}\r\n\r\n\t\tconst rangeType = request.range_type ?? \"time\"\r\n\t\tconst group = getProfileGroup(profile)\r\n\t\tif (group === \"wheelchair\") {\r\n\t\t\tthrow new Error(\"Wheelchair profile is not supported for isochrone requests.\")\r\n\t\t}\r\n\t\tfor (const value of request.range) {\r\n\t\t\tif (rangeType === \"distance\") {\r\n\t\t\t\tconst valueKm = request.units === \"km\" ? value : metersToKilometers(value)\r\n\t\t\t\tif (valueKm > this.limits.isochrones.maxRangeDistanceKm) {\r\n\t\t\t\t\tthrow new Error(`Isochrone distance range exceeds ${this.limits.isochrones.maxRangeDistanceKm} km limit.`)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconst valueHours = value / 3600\r\n\t\t\t\tconst maxHours =\r\n\t\t\t\t\tthis.limits.isochrones.maxRangeTimeHoursByGroup[\r\n\t\t\t\t\t\tgroup as keyof typeof this.limits.isochrones.maxRangeTimeHoursByGroup\r\n\t\t\t\t\t]\r\n\t\t\t\tif (maxHours !== undefined && valueHours > maxHours) {\r\n\t\t\t\t\tthrow new Error(`Isochrone time range exceeds ${maxHours} hours for ${group} profiles.`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Checks matrix requests for minimum fields and cell-count thresholds before dispatching.\r\n\t * @param request - Matrix request definition.\r\n\t * @throws Error when coordinates are missing or size thresholds are exceeded.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateMatrix(matrixRequest);\r\n\t * ```\r\n\t */\r\n\tprivate validateMatrix(request: MatrixRequest): void {\r\n\t\tif (!request.locations || request.locations.length === 0) {\r\n\t\t\tthrow new Error(\"Matrix request requires at least one location.\")\r\n\t\t}\r\n\t\tconst totalLocations = request.locations.length\r\n\t\tconst sourcesCount =\r\n\t\t\trequest.sources === undefined || request.sources === \"all\"\r\n\t\t\t\t? totalLocations\r\n\t\t\t\t: Array.isArray(request.sources)\r\n\t\t\t\t? request.sources.length\r\n\t\t\t\t: totalLocations\r\n\t\tconst destinationsCount =\r\n\t\t\trequest.destinations === undefined || request.destinations === \"all\"\r\n\t\t\t\t? totalLocations\r\n\t\t\t\t: Array.isArray(request.destinations)\r\n\t\t\t\t? request.destinations.length\r\n\t\t\t\t: totalLocations\r\n\r\n\t\tconst product = sourcesCount * destinationsCount\r\n\t\tif (product > this.limits.matrix.maxLocationsProduct) {\r\n\t\t\tthrow new Error(\r\n\t\t\t\t`Matrix request exceeds ${this.limits.matrix.maxLocationsProduct} cell limit (${sourcesCount} sources x ${destinationsCount} destinations).`\r\n\t\t\t)\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t(typeof request.sources === \"string\" || typeof request.destinations === \"string\") &&\r\n\t\t\tproduct > this.limits.matrix.maxDynamicLocations\r\n\t\t) {\r\n\t\t\tthrow new Error(\r\n\t\t\t\t`Matrix requests with dynamic sources/destinations cannot exceed ${this.limits.matrix.maxDynamicLocations} cells.`\r\n\t\t\t)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Guards snap requests to ensure location counts stay within supported bounds.\r\n\t * @param request - Snap request body to validate.\r\n\t * @throws Error when no locations are provided or the limit is exceeded.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateSnap(snapRequest);\r\n\t * ```\r\n\t */\r\n\tprivate validateSnap(request: SnapRequest): void {\r\n\t\tif (!request.locations || request.locations.length === 0) {\r\n\t\t\tthrow new Error(\"Snap request requires at least one location.\")\r\n\t\t}\r\n\t\tif (request.locations.length > this.limits.snap.maxLocations) {\r\n\t\t\tthrow new Error(`Snap request exceeds ${this.limits.snap.maxLocations} coordinate limit.`)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Runs safety checks on POI searches to keep geometry areas, radii, and linestrings inside service limits.\r\n\t * @param request - POIs request submitted by the caller.\r\n\t * @throws Error when mandatory geometry is missing or a constraint is breached.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validatePois(poisRequest);\r\n\t * ```\r\n\t */\r\n\tprivate validatePois(request: PoisRequest): void {\r\n\t\tif (!request.geometry) {\r\n\t\t\tthrow new Error(\"POIs request requires geometry definition.\")\r\n\t\t}\r\n\t\tif (request.request === \"bbox\" && request.geometry.bbox) {\r\n\t\t\tconst area = bboxAreaKm2(request.geometry.bbox)\r\n\t\t\tif (area > this.limits.pois.maxBboxAreaKm2) {\r\n\t\t\t\tthrow new Error(`POIs bbox area exceeds ${this.limits.pois.maxBboxAreaKm2} km² limit.`)\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (request.request === \"radius\" && request.geometry.radius !== undefined) {\r\n\t\t\tconst radiusKm = metersToKilometers(request.geometry.radius)\r\n\t\t\tif (radiusKm > this.limits.pois.maxSearchRadiusKm) {\r\n\t\t\t\tthrow new Error(`POIs radius exceeds ${this.limits.pois.maxSearchRadiusKm} km limit.`)\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (request.geometry.geojson && isGeoJsonObject(request.geometry.geojson)) {\r\n\t\t\tconst areaKm2 = featureCollectionAreaKm2(request.geometry.geojson)\r\n\t\t\tif (areaKm2 > this.limits.pois.maxBboxAreaKm2) {\r\n\t\t\t\tthrow new Error(`POIs polygon area exceeds ${this.limits.pois.maxBboxAreaKm2} km² limit.`)\r\n\t\t\t}\r\n\r\n\t\t\tconst bbox = computeGeometryBbox(request.geometry.geojson)\r\n\t\t\tif (bbox) {\r\n\t\t\t\tconst width = haversineDistanceKm([bbox[0], bbox[1]], [bbox[2], bbox[1]])\r\n\t\t\t\tconst height = haversineDistanceKm([bbox[0], bbox[1]], [bbox[0], bbox[3]])\r\n\t\t\t\tif (width * height > this.limits.pois.maxBboxAreaKm2) {\r\n\t\t\t\t\tthrow new Error(`POIs search area exceeds ${this.limits.pois.maxBboxAreaKm2} km² limit.`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst geojsonValue = request.geometry.geojson\r\n\t\t\tconst geometry = (geojsonValue as Feature)?.geometry ?? geojsonValue\r\n\t\t\tif (geometry?.type === \"LineString\") {\r\n\t\t\t\tconst length = linestringLengthKm(geometry as LineString)\r\n\t\t\t\tif (length > this.limits.pois.maxLinestringLengthKm) {\r\n\t\t\t\t\tthrow new Error(`POIs linestring length exceeds ${this.limits.pois.maxLinestringLengthKm} km limit.`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Confirms elevation point requests include a geometry payload.\r\n\t * @param request - Elevation point request payload.\r\n\t * @throws Error when geometry input is missing.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateElevationPoint(elevationPointRequest);\r\n\t * ```\r\n\t */\r\n\tprivate validateElevationPoint(request: ElevationPointRequest): void {\r\n\t\tif (!request.geometry) {\r\n\t\t\tthrow new Error(\"Elevation point request requires geometry.\")\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Confirms elevation line requests contain valid geometry and respect vertex limits.\r\n\t * @param request - Elevation line request payload.\r\n\t * @throws Error when geometry is absent or exceeds the supported vertex count.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateElevationLine(elevationLineRequest);\r\n\t * ```\r\n\t */\r\n\tprivate validateElevationLine(request: ElevationLineRequest): void {\r\n\t\tif (!request.geometry) {\r\n\t\t\tthrow new Error(\"Elevation line request requires geometry.\")\r\n\t\t}\r\n\r\n\t\tconst geometry = (request.geometry as Feature)?.geometry ?? request.geometry\r\n\t\tif (!geometry || geometry.type !== \"LineString\") {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tconst coordinates = (geometry as LineString).coordinates\r\n\t\tif (coordinates && coordinates.length > this.limits.elevation.maxVertices) {\r\n\t\t\tthrow new Error(`Elevation line requests cannot exceed ${this.limits.elevation.maxVertices} vertices.`)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates optimization payloads for minimum jobs, vehicles, and limit compliance.\r\n\t * @param request - Optimization request the client is about to send.\r\n\t * @throws Error when jobs or vehicles are missing or the limits are hit.\r\n\t * @example\r\n\t * ```ts\r\n\t * this.validateOptimization(optimizationRequest);\r\n\t * ```\r\n\t */\r\n\tprivate validateOptimization(request: OptimizationRequest): void {\r\n\t\tif (!Array.isArray(request.jobs) || request.jobs.length === 0) {\r\n\t\t\tthrow new Error(\"Optimization request requires at least one job.\")\r\n\t\t}\r\n\t\tif (request.jobs.length > this.limits.optimization.maxRoutes) {\r\n\t\t\tthrow new Error(`Optimization request exceeds ${this.limits.optimization.maxRoutes} jobs limit.`)\r\n\t\t}\r\n\t\tif (!Array.isArray(request.vehicles) || request.vehicles.length === 0) {\r\n\t\t\tthrow new Error(\"Optimization request requires at least one vehicle.\")\r\n\t\t}\r\n\t\tif (request.vehicles.length > this.limits.optimization.maxVehicles) {\r\n\t\t\tthrow new Error(`Optimization request exceeds ${this.limits.optimization.maxVehicles} vehicles limit.`)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Requests turn-by-turn directions for the given profile and coordinates after validating limits.\r\n\t * @param profile - Routing profile to use; falls back to the default profile when omitted.\r\n\t * @param request - Directions payload including coordinates, format, and options.\r\n\t * @param options - Optional request options such as abort signals or axios overrides.\r\n\t * @returns API response typed as T based on the requested format.\r\n\t * @example\r\n\t * ```ts\r\n\t * const ors = new ORS({ apiKey: process.env.ORS_TOKEN ?? '' });\r\n\t * const route = await ors.directions('driving-car', {\r\n\t *   coordinates: [\r\n\t *     [8.681495, 49.41461],\r\n\t *     [8.687872, 49.420318]\r\n\t *   ]\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync directions<T = unknown>(\r\n\t\tprofile: DirectionsProfile,\r\n\t\trequest: DirectionsRequest,\r\n\t\toptions?: RequestOptions\r\n\t): Promise<T> {\r\n\t\tconst resolvedProfile = this.ensureProfile(profile)\r\n\t\tthis.validateDirections(resolvedProfile, request)\r\n\t\tconst { format = \"json\", ...body } = request\r\n\t\tconst responseType = format === \"gpx\" ? \"text\" : \"json\"\r\n\t\tconst acceptHeader =\r\n\t\t\tformat === \"gpx\" ? \"application/gpx+xml\" : format === \"geojson\" ? \"application/geo+json\" : \"application/json\"\r\n\t\tconst path = `directions/${resolvedProfile}/${format}`\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: path,\r\n\t\t\t\tdata: body,\r\n\t\t\t\theaders: {\r\n\t\t\t\t\tAccept: acceptHeader,\r\n\t\t\t\t},\r\n\t\t\t\tresponseType,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Generates isochrone polygons for the provided profile once the payload passes validation.\r\n\t * @param profile - Isochrone profile to use; defaults to the configured profile when compatible.\r\n\t * @param request - Isochrone request body with locations and range settings.\r\n\t * @param options - Optional request execution controls.\r\n\t * @returns API response typed as T.\r\n\t * @throws Error when no compatible profile is available.\r\n\t * @example\r\n\t * ```ts\r\n\t * const ors = new ORS({ apiKey: process.env.ORS_TOKEN ?? '' });\r\n\t * const isochrone = await ors.isochrones('cycling-regular', {\r\n\t *   locations: [[8.681495, 49.41461]],\r\n\t *   range: [600, 1200]\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync isochrones<T = unknown>(\r\n\t\tprofile: IsochroneProfile,\r\n\t\trequest: IsochroneRequest,\r\n\t\toptions?: RequestOptions\r\n\t): Promise<T> {\r\n\t\tlet resolvedProfile = profile\r\n\t\tif (!resolvedProfile) {\r\n\t\t\tif (!this.defaultProfile) {\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t\"An isochrone profile is required. Provide it as an argument or configure a compatible defaultProfile.\"\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t\tif (this.defaultProfile === \"wheelchair\") {\r\n\t\t\t\tthrow new Error(\"Wheelchair profile is not supported for isochrone requests.\")\r\n\t\t\t}\r\n\t\t\tresolvedProfile = this.defaultProfile as IsochroneProfile\r\n\t\t}\r\n\t\tif (!resolvedProfile) {\r\n\t\t\tthrow new Error(\r\n\t\t\t\t\"An isochrone profile is required. Provide it as an argument or configure a compatible defaultProfile.\"\r\n\t\t\t)\r\n\t\t}\r\n\t\tthis.validateIsochrones(resolvedProfile, request)\r\n\t\tconst path = `isochrones/${resolvedProfile}`\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: path,\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Computes a travel matrix for the given profile and locations.\r\n\t * @param profile - Matrix profile to apply; falls back to the default profile when omitted.\r\n\t * @param request - Matrix request configuration.\r\n\t * @param options - Optional request options such as per-call axios overrides.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const matrix = await ors.matrix('driving-hgv', {\r\n\t *   locations: [\r\n\t *     [8.681495, 49.41461],\r\n\t *     [8.687872, 49.420318]\r\n\t *   ]\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync matrix<T = unknown>(profile: MatrixProfile, request: MatrixRequest, options?: RequestOptions): Promise<T> {\r\n\t\tconst resolvedProfile = this.ensureProfile(profile)\r\n\t\tthis.validateMatrix(request)\r\n\t\tconst path = `matrix/${resolvedProfile}`\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: path,\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Runs the ORS optimization endpoint after validating jobs and vehicles.\r\n\t * @param request - Optimization problem definition.\r\n\t * @param options - Optional request settings.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const solution = await ors.optimization({\r\n\t *   jobs: [{ id: 1, location: [8.681495, 49.41461] }],\r\n\t *   vehicles: [{ id: 1, start: [8.687872, 49.420318] }]\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync optimization<T = unknown>(request: OptimizationRequest, options?: RequestOptions): Promise<T> {\r\n\t\tthis.validateOptimization(request)\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"optimization\",\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Snaps coordinate sequences to the road network for a specific profile.\r\n\t * @param profile - Snap profile to apply.\r\n\t * @param request - Snap request body containing locations and options.\r\n\t * @param options - Optional request settings.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const snapped = await ors.snap('cycling-road', {\r\n\t *   locations: [\r\n\t *     [8.681495, 49.41461],\r\n\t *     [8.687872, 49.420318]\r\n\t *   ]\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync snap<T = unknown>(profile: SnapProfile, request: SnapRequest, options?: RequestOptions): Promise<T> {\r\n\t\tconst resolvedProfile = this.ensureProfile(profile)\r\n\t\tthis.validateSnap(request)\r\n\t\tconst path = `snap/${resolvedProfile}`\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: path,\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Queries points of interest within the provided geometry constraints.\r\n\t * @param request - POIs request payload.\r\n\t * @param options - Optional request settings.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const pois = await ors.pois({\r\n\t *   request: 'radius',\r\n\t *   geometry: {\r\n\t *     center: [8.681495, 49.41461],\r\n\t *     radius: 500\r\n\t *   }\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync pois<T = unknown>(request: PoisRequest, options?: RequestOptions): Promise<T> {\r\n\t\tthis.validatePois(request)\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"pois\",\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches elevation data for point geometries after validating the payload.\r\n\t * @param request - Elevation point request body.\r\n\t * @param options - Optional request options.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const elevation = await ors.elevationPoint({\r\n\t *   geometry: {\r\n\t *     coordinates: [8.681495, 49.41461],\r\n\t *     type: 'Point'\r\n\t *   }\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync elevationPoint<T = unknown>(request: ElevationPointRequest, options?: RequestOptions): Promise<T> {\r\n\t\tthis.validateElevationPoint(request)\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"elevation/point\",\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Fetches elevation profiles for line geometries while enforcing vertex limits.\r\n\t * @param request - Elevation line request definition.\r\n\t * @param options - Optional request options.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const elevationProfile = await ors.elevationLine({\r\n\t *   geometry: {\r\n\t *     type: 'LineString',\r\n\t *     coordinates: [\r\n\t *       [8.681495, 49.41461],\r\n\t *       [8.687872, 49.420318]\r\n\t *     ]\r\n\t *   }\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync elevationLine<T = unknown>(request: ElevationLineRequest, options?: RequestOptions): Promise<T> {\r\n\t\tthis.validateElevationLine(request)\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\turl: \"elevation/line\",\r\n\t\t\t\tdata: request,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Internal helper for running geocode GET requests with shared plumbing.\r\n\t * @param endpoint - Geocode endpoint segment.\r\n\t * @param params - Query parameters accepted by geocode endpoints.\r\n\t * @param options - Optional request options.\r\n\t * @returns API response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * return this.geocode('geocode/search', params, options);\r\n\t * ```\r\n\t */\r\n\tprivate async geocode<T = unknown>(\r\n\t\tendpoint: string,\r\n\t\tparams: GeocodeCommonParams,\r\n\t\toptions?: RequestOptions\r\n\t): Promise<T> {\r\n\t\treturn this.runRequest<T>(\r\n\t\t\t{\r\n\t\t\t\tmethod: \"GET\",\r\n\t\t\t\turl: endpoint,\r\n\t\t\t\tparams,\r\n\t\t\t},\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a forward geocoding query using free-form text.\r\n\t * @param params - Geocode parameters; must include non-empty text.\r\n\t * @param options - Optional request options.\r\n\t * @returns Geocode response typed as T.\r\n\t * @throws Error when the text parameter is missing or blank.\r\n\t * @example\r\n\t * ```ts\r\n\t * const results = await ors.geocodeSearch({ text: 'Heidelberg' });\r\n\t * ```\r\n\t */\r\n\tasync geocodeSearch<T = unknown>(params: GeocodeCommonParams, options?: RequestOptions): Promise<T> {\r\n\t\tif (typeof params.text !== \"string\" || params.text.trim().length === 0) {\r\n\t\t\tthrow new Error('Geocode search requires a non-empty \"text\" parameter.')\r\n\t\t}\r\n\t\treturn this.geocode<T>(\"geocode/search\", params, options)\r\n\t}\r\n\r\n\t/**\r\n\t * Performs reverse geocoding for the provided point coordinates.\r\n\t * @param params - Geocode parameters; must include a point with lat and lng.\r\n\t * @param options - Optional request options.\r\n\t * @returns Geocode response typed as T.\r\n\t * @throws Error when the point coordinates are incomplete.\r\n\t * @example\r\n\t * ```ts\r\n\t * const reverse = await ors.geocodeReverse({\r\n\t *   point: { lat: 49.41461, lng: 8.681495 }\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync geocodeReverse<T = unknown>(params: GeocodeCommonParams, options?: RequestOptions): Promise<T> {\r\n\t\tif (\r\n\t\t\ttypeof params.point !== \"object\" ||\r\n\t\t\tparams.point === null ||\r\n\t\t\ttypeof (params.point as Record<string, unknown>).lng !== \"number\" ||\r\n\t\t\ttypeof (params.point as Record<string, unknown>).lat !== \"number\"\r\n\t\t) {\r\n\t\t\tthrow new Error('Geocode reverse requires \"point.lat\" and \"point.lng\" numeric parameters.')\r\n\t\t}\r\n\t\treturn this.geocode<T>(\"geocode/reverse\", params, options)\r\n\t}\r\n\r\n\t/**\r\n\t * Retrieves autocomplete candidates for partial text input.\r\n\t * @param params - Geocode parameters; requires non-empty text.\r\n\t * @param options - Optional request options.\r\n\t * @returns Geocode autocomplete response typed as T.\r\n\t * @throws Error when the text parameter is missing or blank.\r\n\t * @example\r\n\t * ```ts\r\n\t * const suggestions = await ors.geocodeAutocomplete({ text: 'Heidel' });\r\n\t * ```\r\n\t */\r\n\tasync geocodeAutocomplete<T = unknown>(params: GeocodeCommonParams, options?: RequestOptions): Promise<T> {\r\n\t\tif (typeof params.text !== \"string\" || params.text.trim().length === 0) {\r\n\t\t\tthrow new Error('Geocode autocomplete requires a non-empty \"text\" parameter.')\r\n\t\t}\r\n\t\treturn this.geocode<T>(\"geocode/autocomplete\", params, options)\r\n\t}\r\n\r\n\t/**\r\n\t * Runs a structured geocoding query with fielded address input.\r\n\t * @param params - Geocode parameters to forward to the structured endpoint.\r\n\t * @param options - Optional request options.\r\n\t * @returns Geocode response typed as T.\r\n\t * @example\r\n\t * ```ts\r\n\t * const structured = await ors.geocodeStructured({\r\n\t *   housenumber: '1',\r\n\t *   street: 'Korngasse',\r\n\t *   locality: 'Heidelberg'\r\n\t * });\r\n\t * ```\r\n\t */\r\n\tasync geocodeStructured<T = unknown>(params: GeocodeCommonParams, options?: RequestOptions): Promise<T> {\r\n\t\treturn this.geocode<T>(\"geocode/structured\", params, options)\r\n\t}\r\n}\r\n\r\nexport default ORS\r\n","import type { Point } from \"geojson\"\nimport { ORS } from \"../ors.js\"\nimport type { LonLat } from \"../utils/geo.js\"\nimport type {\n\tGeocodeCommonParams,\n\tGeocodeFeature,\n\tGeocodeLookupAttempt,\n\tGeocodeLookupResult,\n\tGeocodeTownZipQuery,\n\tRequestOptions,\n} from \"../types.js\"\n\ninterface GeocodeResponse {\n\tfeatures?: GeocodeFeature[]\n}\n\ninterface GeocodeMatch {\n\tfeature: GeocodeFeature\n\tcoordinates: LonLat\n}\n\nconst normalizeLookupInput = (value?: string): string | undefined => {\n\tif (typeof value !== \"string\") {\n\t\treturn undefined\n\t}\n\tconst trimmed = value.trim()\n\treturn trimmed.length > 0 ? trimmed : undefined\n}\n\nconst getTownPrefix = (town: string): string => {\n\tconst normalized = normalizeLookupInput(town)\n\tif (!normalized) {\n\t\treturn \"\"\n\t}\n\tconst [firstWord] = normalized.split(/\\s+/u)\n\treturn (firstWord ?? \"\").slice(0, 3)\n}\n\nconst findFirstPointFeature = (response?: GeocodeResponse | null): GeocodeMatch | null => {\n\tif (!response || !Array.isArray(response.features)) {\n\t\treturn null\n\t}\n\tfor (const feature of response.features) {\n\t\tif (!feature?.geometry || feature.geometry.type !== \"Point\") {\n\t\t\tcontinue\n\t\t}\n\t\tconst point = feature.geometry as Point\n\t\tconst [lon, lat] = point.coordinates ?? []\n\t\tif (Number.isFinite(lon) && Number.isFinite(lat)) {\n\t\t\treturn {\n\t\t\t\tfeature,\n\t\t\t\tcoordinates: [lon, lat] as LonLat,\n\t\t\t}\n\t\t}\n\t}\n\treturn null\n}\n\nconst featureContainsTown = (feature: GeocodeFeature, normalizedTown: string): boolean => {\n\tif (!normalizedTown) {\n\t\treturn false\n\t}\n\tconst properties = feature.properties ?? {}\n\tif (typeof properties !== \"object\" || properties === null) {\n\t\treturn false\n\t}\n\tconst candidateKeys = [\"locality\", \"name\", \"city\", \"localadmin\", \"county\", \"region\", \"state\", \"label\"]\n\tfor (const key of candidateKeys) {\n\t\tconst value = (properties as Record<string, unknown>)[key]\n\t\tif (typeof value === \"string\" && value.toLowerCase().includes(normalizedTown)) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nconst pickAutocompleteMatch = (response: GeocodeResponse | undefined, town: string): GeocodeMatch | null => {\n\tconst normalizedTown = normalizeLookupInput(town)?.toLowerCase()\n\tif (!response) {\n\t\treturn null\n\t}\n\tif (normalizedTown) {\n\t\tfor (const feature of response.features ?? []) {\n\t\t\tif (!feature?.geometry || feature.geometry.type !== \"Point\") {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (featureContainsTown(feature, normalizedTown)) {\n\t\t\t\tconst point = feature.geometry as Point\n\t\t\t\tconst [lon, lat] = point.coordinates ?? []\n\t\t\t\tif (Number.isFinite(lon) && Number.isFinite(lat)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tfeature,\n\t\t\t\t\t\tcoordinates: [lon, lat] as LonLat,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn findFirstPointFeature(response)\n}\n\n/**\n * Attempts to resolve a town/ZIP combination by chaining structured and autocomplete geocoding calls.\n * The helper feeds previous results back into ORS endpoints to improve match quality for European style addresses.\n * @param ors - An initialized ORS client instance.\n * @param query - Town, ZIP, and optional country code inputs provided by the caller.\n * @param options - Optional ORS request overrides such as throttling or axios tweaks.\n * @returns A best-effort lookup result with coordinates, the winning stage, and debug attempts.\n * @example\n * ```ts\n * const lookup = await geocodeTownZipLookup(ors, {\n *   town: 'Nice',\n *   zip: '06000',\n *   countryCode: 'FR'\n * });\n * if (lookup.coordinates) {\n *   console.log(`Matched ${lookup.stage} at`, lookup.coordinates);\n * }\n * ```\n */\nexport const geocodeTownZipLookup = async (\n\tors: ORS,\n\tquery: GeocodeTownZipQuery,\n\toptions?: RequestOptions\n): Promise<GeocodeLookupResult> => {\n\tconst attempts: GeocodeLookupAttempt[] = []\n\tconst town = normalizeLookupInput(query.town)\n\tconst zip = normalizeLookupInput(query.zip)\n\tconst countryCode = normalizeLookupInput(query.countryCode)?.toUpperCase()\n\tconst structuredSize =\n\t\ttypeof query.structuredSize === \"number\" && query.structuredSize > 0 ? query.structuredSize : undefined\n\tconst autocompleteSize =\n\t\ttypeof query.autocompleteSize === \"number\" && query.autocompleteSize > 0 ? query.autocompleteSize : undefined\n\n\tif (!zip && !town) {\n\t\tthrow new Error('geocodeTownZipLookup requires at least a \"zip\" or \"town\" input.')\n\t}\n\n\tconst buildStructuredParams = (overrides: Record<string, unknown>): GeocodeCommonParams => {\n\t\tconst params: GeocodeCommonParams = { ...overrides }\n\t\tif (countryCode) {\n\t\t\tparams.country = countryCode\n\t\t}\n\t\tif (structuredSize) {\n\t\t\tparams.size = structuredSize\n\t\t}\n\t\treturn params\n\t}\n\n\tlet structuredPostalMatch: GeocodeMatch | null = null\n\n\tif (zip && town) {\n\t\tconst params = buildStructuredParams({\n\t\t\tpostalcode: zip,\n\t\t\tlocality: town,\n\t\t})\n\t\tlet stageMatch: GeocodeMatch | null = null\n\t\tlet stageError: unknown\n\t\ttry {\n\t\t\tconst response = await ors.geocodeStructured<GeocodeResponse>(params, options)\n\t\t\tstageMatch = findFirstPointFeature(response)\n\t\t} catch (error) {\n\t\t\tstageError = error\n\t\t}\n\t\tattempts.push({\n\t\t\tstage: \"structured_postal_locality\",\n\t\t\tparams,\n\t\t\tfeature: stageMatch?.feature,\n\t\t\tcoordinates: stageMatch?.coordinates,\n\t\t\terror: stageError,\n\t\t})\n\t\tif (stageMatch) {\n\t\t\treturn {\n\t\t\t\tstage: \"structured_postal_locality\",\n\t\t\t\tfeature: stageMatch.feature,\n\t\t\t\tcoordinates: stageMatch.coordinates,\n\t\t\t\tattempts,\n\t\t\t}\n\t\t}\n\t}\n\n\tif (zip) {\n\t\tconst params = buildStructuredParams({ postalcode: zip })\n\t\tlet stageError: unknown\n\t\ttry {\n\t\t\tconst response = await ors.geocodeStructured<GeocodeResponse>(params, options)\n\t\t\tstructuredPostalMatch = findFirstPointFeature(response)\n\t\t} catch (error) {\n\t\t\tstageError = error\n\t\t}\n\t\tattempts.push({\n\t\t\tstage: \"structured_postal\",\n\t\t\tparams,\n\t\t\tfeature: structuredPostalMatch?.feature,\n\t\t\tcoordinates: structuredPostalMatch?.coordinates,\n\t\t\terror: stageError,\n\t\t})\n\t\tif (structuredPostalMatch && !town) {\n\t\t\treturn {\n\t\t\t\tstage: \"structured_postal\",\n\t\t\t\tfeature: structuredPostalMatch.feature,\n\t\t\t\tcoordinates: structuredPostalMatch.coordinates,\n\t\t\t\tattempts,\n\t\t\t}\n\t\t}\n\t}\n\n\tif (structuredPostalMatch && town) {\n\t\tconst prefix = getTownPrefix(town)\n\t\tif (prefix.length) {\n\t\t\tconst params: GeocodeCommonParams = { text: prefix }\n\t\t\tif (autocompleteSize) {\n\t\t\t\tparams.size = autocompleteSize\n\t\t\t}\n\t\t\tparams[\"focus.point.lat\"] = structuredPostalMatch.coordinates[1]\n\t\t\tparams[\"focus.point.lon\"] = structuredPostalMatch.coordinates[0]\n\t\t\tif (countryCode) {\n\t\t\t\tparams[\"boundary.country\"] = countryCode\n\t\t\t}\n\n\t\t\tlet stageError: unknown\n\t\t\tlet autoMatch: GeocodeMatch | null = null\n\t\t\ttry {\n\t\t\t\tconst response = await ors.geocodeAutocomplete<GeocodeResponse>(params, options)\n\t\t\t\tautoMatch = pickAutocompleteMatch(response, town)\n\t\t\t} catch (error) {\n\t\t\t\tstageError = error\n\t\t\t}\n\t\t\tattempts.push({\n\t\t\t\tstage: \"autocomplete\",\n\t\t\t\tparams,\n\t\t\t\tfeature: autoMatch?.feature,\n\t\t\t\tcoordinates: autoMatch?.coordinates,\n\t\t\t\terror: stageError,\n\t\t\t})\n\t\t\tif (autoMatch) {\n\t\t\t\treturn {\n\t\t\t\t\tstage: \"autocomplete\",\n\t\t\t\t\tfeature: autoMatch.feature,\n\t\t\t\t\tcoordinates: autoMatch.coordinates,\n\t\t\t\t\tattempts,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (structuredPostalMatch) {\n\t\treturn {\n\t\t\tstage: \"structured_postal\",\n\t\t\tfeature: structuredPostalMatch.feature,\n\t\t\tcoordinates: structuredPostalMatch.coordinates,\n\t\t\tattempts,\n\t\t}\n\t}\n\n\treturn {\n\t\tstage: \"not_found\",\n\t\tattempts,\n\t}\n}\n","import type {\n  Feature,\n  FeatureCollection,\n  GeoJsonObject,\n  GeometryCollection,\n  LineString,\n  MultiLineString\n} from 'geojson';\nimport { haversineDistanceKm } from '../utils/geo.js';\nimport type { LonLat } from '../utils/geo.js';\n\nconst EARTH_RADIUS_KM = 6371;\nconst DEFAULT_TOLERANCE_KM = 0.1;\nconst EPSILON = 1e-9;\n\nexport interface RouteProximityOptions {\n  toleranceKm?: number;\n}\n\nexport interface RouteProximityResult {\n  distanceKm: number;\n  isWithinTolerance: boolean;\n}\n\nconst toRadians = (value: number): number => (value * Math.PI) / 180;\n\nconst sanitizeCoordinate = (coordinate: number[]): LonLat | null => {\n  if (!Array.isArray(coordinate) || coordinate.length < 2) {\n    return null;\n  }\n  const lon = Number(coordinate[0]);\n  const lat = Number(coordinate[1]);\n  if (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n    return null;\n  }\n  return [lon, lat];\n};\n\nconst sanitizeLine = (coordinates: number[][]): LonLat[] => {\n  const line: LonLat[] = [];\n  for (const coordinate of coordinates) {\n    const normalized = sanitizeCoordinate(coordinate);\n    if (normalized) {\n      line.push(normalized);\n    }\n  }\n  return line;\n};\n\nconst appendLineStrings = (\n  geometry: GeoJsonObject,\n  sink: LonLat[][]\n): void => {\n  switch (geometry.type) {\n    case 'FeatureCollection': {\n      const collection = geometry as FeatureCollection;\n      for (const feature of collection.features) {\n        if (feature.geometry) {\n          appendLineStrings(feature.geometry as GeoJsonObject, sink);\n        }\n      }\n      break;\n    }\n    case 'Feature': {\n      const feature = geometry as Feature;\n      if (feature.geometry) {\n        appendLineStrings(feature.geometry as GeoJsonObject, sink);\n      }\n      break;\n    }\n    case 'GeometryCollection': {\n      const collection = geometry as GeometryCollection;\n      for (const inner of collection.geometries) {\n        appendLineStrings(inner as GeoJsonObject, sink);\n      }\n      break;\n    }\n    case 'LineString': {\n      const line = sanitizeLine((geometry as LineString).coordinates);\n      if (line.length >= 2) {\n        sink.push(line);\n      }\n      break;\n    }\n    case 'MultiLineString': {\n      const lines = (geometry as MultiLineString).coordinates;\n      for (const lineCoordinates of lines) {\n        const line = sanitizeLine(lineCoordinates);\n        if (line.length >= 2) {\n          sink.push(line);\n        }\n      }\n      break;\n    }\n    default:\n      break;\n  }\n};\n\nconst initialBearingRad = (from: LonLat, to: LonLat): number => {\n  const [lon1, lat1] = from;\n  const [lon2, lat2] = to;\n  const φ1 = toRadians(lat1);\n  const φ2 = toRadians(lat2);\n  const Δλ = toRadians(lon2 - lon1);\n  const y = Math.sin(Δλ) * Math.cos(φ2);\n  const x =\n    Math.cos(φ1) * Math.sin(φ2) -\n    Math.sin(φ1) * Math.cos(φ2) * Math.cos(Δλ);\n  return Math.atan2(y, x);\n};\n\nconst pointToSegmentDistanceKm = (point: LonLat, start: LonLat, end: LonLat): number => {\n  const segmentLengthKm = haversineDistanceKm(start, end);\n  if (segmentLengthKm < EPSILON) {\n    return haversineDistanceKm(point, start);\n  }\n\n  const distanceToStartKm = haversineDistanceKm(start, point);\n  if (distanceToStartKm < EPSILON) {\n    return 0;\n  }\n\n  // Cross-track calculations on a sphere (see https://www.movable-type.co.uk/scripts/latlong.html)\n  const δ13 = distanceToStartKm / EARTH_RADIUS_KM;\n  const θ13 = initialBearingRad(start, point);\n  const θ12 = initialBearingRad(start, end);\n  const sinCrossTrack = Math.sin(δ13) * Math.sin(θ13 - θ12);\n  const δxt = Math.asin(Math.max(-1, Math.min(1, sinCrossTrack)));\n  const crossTrackKm = Math.abs(δxt) * EARTH_RADIUS_KM;\n\n  const alongTrackRad = Math.atan2(\n    Math.sin(δ13) * Math.cos(θ13 - θ12),\n    Math.cos(δ13)\n  );\n  if (Number.isNaN(alongTrackRad)) {\n    return Math.min(distanceToStartKm, haversineDistanceKm(point, end));\n  }\n  if (alongTrackRad < -EPSILON) {\n    return distanceToStartKm;\n  }\n\n  const segmentLengthRad = segmentLengthKm / EARTH_RADIUS_KM;\n  if (alongTrackRad - segmentLengthRad > EPSILON) {\n    return haversineDistanceKm(point, end);\n  }\n\n  return crossTrackKm;\n};\n\nconst computeMinimumDistanceKm = (lines: LonLat[][], coordinate: LonLat): number => {\n  let minimum = Number.POSITIVE_INFINITY;\n  for (const line of lines) {\n    for (let i = 0; i < line.length - 1; i += 1) {\n      const distance = pointToSegmentDistanceKm(coordinate, line[i], line[i + 1]);\n      if (distance < minimum) {\n        minimum = distance;\n        if (minimum < EPSILON) {\n          return 0;\n        }\n      }\n    }\n  }\n  return minimum;\n};\n\nconst validateCoordinate = (coordinate: LonLat): void => {\n  if (\n    !Array.isArray(coordinate) ||\n    coordinate.length !== 2 ||\n    !Number.isFinite(coordinate[0]) ||\n    !Number.isFinite(coordinate[1])\n  ) {\n    throw new Error('Coordinate must be a [lon, lat] pair with finite values.');\n  }\n};\n\n/**\n * Measures how far a coordinate sits from a route geometry and reports whether it is within tolerance.\n * Handles FeatureCollection, Feature, or raw GeoJSON inputs and keeps calculations spherical.\n * @param route - GeoJSON describing the route or corridor to compare against.\n * @param coordinate - `[lon, lat]` location to test.\n * @param options - Optional overrides including `toleranceKm`.\n * @returns Distance in kilometers plus a boolean convenience flag.\n * @example\n * ```ts\n * const proximity = computeRouteProximity(routeGeoJson, [8.68, 49.41], {\n *   toleranceKm: 0.2\n * });\n * if (!proximity.isWithinTolerance) {\n *   console.warn(`Client is ${proximity.distanceKm.toFixed(2)} km away from the route`);\n * }\n * ```\n */\nexport const computeRouteProximity = (\n  route: FeatureCollection | Feature | GeoJsonObject,\n  coordinate: LonLat,\n  options?: RouteProximityOptions\n): RouteProximityResult => {\n  if (!route || typeof route !== 'object') {\n    throw new Error('Route GeoJSON input is required.');\n  }\n\n  validateCoordinate(coordinate);\n\n  const lineStrings: LonLat[][] = [];\n  appendLineStrings(route as GeoJsonObject, lineStrings);\n  if (lineStrings.length === 0) {\n    throw new Error('Route GeoJSON must contain at least one LineString with two or more coordinates.');\n  }\n\n  const distanceKm = computeMinimumDistanceKm(lineStrings, coordinate);\n  const toleranceKm =\n    options?.toleranceKm && options.toleranceKm > 0\n      ? options.toleranceKm\n      : DEFAULT_TOLERANCE_KM;\n\n  return {\n    distanceKm,\n    isWithinTolerance: distanceKm <= toleranceKm\n  };\n};\n\n/**\n * Convenience wrapper that answers “is this coordinate close enough to the route?” using `computeRouteProximity`.\n * @param route - GeoJSON describing the route or corridor to compare against.\n * @param coordinate - `[lon, lat]` location to test.\n * @param toleranceKm - Optional tolerance in kilometers (defaults to the helper’s internal value).\n * @returns `true` when the coordinate is at or below the tolerance, otherwise `false`.\n * @example\n * ```ts\n * if (isCoordinateNearRoute(routeGeoJson, [8.68, 49.41], 0.15)) {\n *   console.log('The stop remains inside the delivery corridor');\n * }\n * ```\n */\nexport const isCoordinateNearRoute = (\n  route: FeatureCollection | Feature | GeoJsonObject,\n  coordinate: LonLat,\n  toleranceKm?: number\n): boolean => {\n  const result = computeRouteProximity(route, coordinate, {\n    toleranceKm\n  });\n  return result.isWithinTolerance;\n};\n","import type { Feature, FeatureCollection, GeoJsonObject, MultiPolygon, Polygon, Position } from \"geojson\"\nimport { ORS } from \"../ors.js\"\nimport { DEFAULT_LIMITS, PROFILE_GROUPS } from \"../constants.js\"\nimport type { DirectionsProfile, IsochroneProfile, MatrixRequest, RequestOptions } from \"../types.js\"\nimport type { LonLat } from \"../utils/geo.js\"\nimport { haversineDistanceKm } from \"../utils/geo.js\"\nimport { computeRouteProximity } from \"./routeProximity.js\"\n\nconst MS_PER_DAY = 86_400_000\nconst KM_PER_M = 0.001\nconst SEC_PER_MIN = 60\nconst EPSILON = 1e-6\n\nconst resolveProfileGroup = (profile: DirectionsProfile): keyof typeof PROFILE_GROUPS | null => {\n\tfor (const [group, profiles] of Object.entries(PROFILE_GROUPS) as Array<[keyof typeof PROFILE_GROUPS, string[]]>) {\n\t\tif (profiles.includes(profile)) {\n\t\t\treturn group\n\t\t}\n\t}\n\treturn null\n}\n\nexport interface DeliveryClientInput {\n\tid?: string\n\tname: string\n\tcoordinate: LonLat\n\tweightKg: number\n\torderDate: string | Date\n\turgent?: boolean\n}\n\nexport interface TourPlanningRequest {\n\tclients: DeliveryClientInput[]\n\ttruckCapacityKg: number\n\tdesiredTourCount: number\n\tdepot: LonLat\n}\n\nexport interface TourScoringWeights {\n\tage: number\n\tdistance: number\n\tcluster: number\n\turgent: number\n}\n\nexport interface TourPlanningLimits {\n\tmatrixMaxCells?: number\n\tdirectionsMaxWaypoints?: number\n\tisochroneMaxLocations?: number\n}\n\nexport interface TourPlanningOptions {\n\tprofile?: DirectionsProfile\n\tisoRangeMinutes?: number\n\tmaxIsoRequests?: number\n\tclusterRadiusKm?: number\n\tneighborRadiusKm?: number\n\talongRouteToleranceKm?: number\n\taverageSpeedKmh?: number\n\tscoringWeights?: Partial<TourScoringWeights>\n\treferenceDate?: Date\n\tmaxCandidatesPerTour?: number\n\tlimits?: TourPlanningLimits\n\tmatrixRequestOptions?: RequestOptions\n\tisochroneRequestOptions?: RequestOptions\n\tdirectionsRequestOptions?: RequestOptions\n}\n\nexport interface PlannedClient extends DeliveryClientInput {\n\tid: string\n\torderDate: Date\n\turgent: boolean\n\tageDays: number\n\tdistanceFromDepotKm: number\n\tdurationFromDepotMin: number\n\tneighborCount: number\n\tscore: number\n\tseed?: boolean\n\tmatrixIndex: number\n}\n\nexport interface PlannedStop extends PlannedClient {\n\tinsertionCostKm: number\n\tposition: number\n}\n\nexport interface PlannedTour {\n\tid: string\n\tstops: PlannedStop[]\n\ttotalWeightKg: number\n\testimatedDistanceKm: number\n\testimatedDurationMin: number\n\trouteGeoJson?: FeatureCollection | Feature | GeoJsonObject\n\twarnings: string[]\n}\n\nexport interface TourPlanningResult {\n\ttours: PlannedTour[]\n\tunassigned: PlannedClient[]\n\twarnings: string[]\n\tscoringWeights: TourScoringWeights\n\tcreatedAt: Date\n}\n\ninterface MatrixResponse {\n\tdistances?: number[][]\n\tdurations?: number[][]\n}\n\ninterface MatrixData {\n\tdistancesKm: number[][]\n\tdurationsMin: number[][]\n\twarnings: string[]\n}\n\ninterface StandardizedClient extends PlannedClient {\n\tmatrixIndex: number\n}\n\ninterface BuildTourContext {\n\tseed: StandardizedClient\n\tstops: PlannedStop[]\n\ttotalWeight: number\n\twarnings: string[]\n\trouteGeoJson?: FeatureCollection | Feature | GeoJsonObject\n}\n\nconst DEFAULT_SCORING_WEIGHTS: TourScoringWeights = {\n\tage: 0.5,\n\tdistance: 0.25,\n\tcluster: 0.15,\n\turgent: 0.1,\n}\n\nconst DEFAULT_OPTIONS: Required<\n\tPick<\n\t\tTourPlanningOptions,\n\t\t| \"profile\"\n\t\t| \"isoRangeMinutes\"\n\t\t| \"maxIsoRequests\"\n\t\t| \"clusterRadiusKm\"\n\t\t| \"neighborRadiusKm\"\n\t\t| \"alongRouteToleranceKm\"\n\t\t| \"averageSpeedKmh\"\n\t\t| \"maxCandidatesPerTour\"\n\t>\n> = {\n\tprofile: \"driving-hgv\",\n\tisoRangeMinutes: 60,\n\tmaxIsoRequests: 5,\n\tclusterRadiusKm: 35,\n\tneighborRadiusKm: 25,\n\talongRouteToleranceKm: 8,\n\taverageSpeedKmh: 55,\n\tmaxCandidatesPerTour: 40,\n}\n\nconst normalizeCoordinate = (coordinate: LonLat, label: string): LonLat => {\n\tif (!Array.isArray(coordinate) || coordinate.length < 2) {\n\t\tthrow new Error(`${label} must be a [lon, lat] pair.`)\n\t}\n\tconst lon = Number(coordinate[0])\n\tconst lat = Number(coordinate[1])\n\tif (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n\t\tthrow new Error(`${label} must contain finite coordinates.`)\n\t}\n\treturn [lon, lat]\n}\n\nconst normalizeClient = (\n\tclient: DeliveryClientInput,\n\tindex: number,\n\tdepot: LonLat,\n\treferenceDate: Date,\n\taverageSpeedKmh: number\n): StandardizedClient => {\n\tconst id = client.id ?? `client_${index + 1}`\n\tconst coordinate = normalizeCoordinate(client.coordinate, `Client ${id} coordinate`)\n\tconst orderDate = new Date(client.orderDate)\n\tif (Number.isNaN(orderDate.getTime())) {\n\t\tthrow new Error(`Invalid orderDate for client \"${id}\".`)\n\t}\n\tconst ageMs = Math.max(0, referenceDate.getTime() - orderDate.getTime())\n\tconst ageDays = ageMs / MS_PER_DAY\n\tconst distanceFromDepotKm = haversineDistanceKm(depot, coordinate)\n\tconst durationFromDepotMin = (distanceFromDepotKm / averageSpeedKmh) * 60\n\treturn {\n\t\t...client,\n\t\tid,\n\t\tcoordinate,\n\t\torderDate,\n\t\turgent: Boolean(client.urgent),\n\t\tageDays,\n\t\tdistanceFromDepotKm,\n\t\tdurationFromDepotMin,\n\t\tneighborCount: 0,\n\t\tscore: 0,\n\t\tseed: false,\n\t\tmatrixIndex: index + 1,\n\t}\n}\n\nconst buildMatrix = async (\n\tors: ORS,\n\tprofile: DirectionsProfile,\n\tdepot: LonLat,\n\tclients: StandardizedClient[],\n\toptions: TourPlanningOptions,\n\tlimits: TourPlanningLimits\n): Promise<MatrixData> => {\n\tconst matrixWarnings: string[] = []\n\tconst locations: LonLat[] = [depot, ...clients.map((client) => client.coordinate)]\n\tconst maxCells = limits.matrixMaxCells ?? DEFAULT_LIMITS.matrix.maxLocationsProduct\n\tconst locationCount = locations.length\n\tconst cellCount = locationCount * locationCount\n\tif (cellCount > maxCells) {\n\t\tmatrixWarnings.push(`Matrix size ${cellCount} exceeds limit ${maxCells}. Falling back to haversine distances.`)\n\t\treturn buildFallbackMatrix(locations, options.averageSpeedKmh ?? DEFAULT_OPTIONS.averageSpeedKmh, matrixWarnings)\n\t}\n\tconst request: MatrixRequest = {\n\t\tlocations,\n\t\tmetrics: [\"distance\", \"duration\"],\n\t}\n\ttry {\n\t\tconst response = await ors.matrix<MatrixResponse>(profile, request, options.matrixRequestOptions)\n\t\treturn normalizeMatrixResponse(\n\t\t\tresponse,\n\t\t\tlocations,\n\t\t\toptions.averageSpeedKmh ?? DEFAULT_OPTIONS.averageSpeedKmh,\n\t\t\tmatrixWarnings\n\t\t)\n\t} catch (error) {\n\t\tmatrixWarnings.push(`ORS matrix request failed (${(error as Error).message}). Using haversine fallback.`)\n\t\treturn buildFallbackMatrix(locations, options.averageSpeedKmh ?? DEFAULT_OPTIONS.averageSpeedKmh, matrixWarnings)\n\t}\n}\n\nconst buildFallbackMatrix = (locations: LonLat[], averageSpeedKmh: number, warnings: string[]): MatrixData => {\n\tconst distancesKm: number[][] = []\n\tconst durationsMin: number[][] = []\n\tfor (let i = 0; i < locations.length; i += 1) {\n\t\tdistancesKm[i] = []\n\t\tdurationsMin[i] = []\n\t\tfor (let j = 0; j < locations.length; j += 1) {\n\t\t\tif (i === j) {\n\t\t\t\tdistancesKm[i][j] = 0\n\t\t\t\tdurationsMin[i][j] = 0\n\t\t\t} else {\n\t\t\t\tconst distance = haversineDistanceKm(locations[i], locations[j])\n\t\t\t\tdistancesKm[i][j] = distance\n\t\t\t\tdurationsMin[i][j] = (distance / averageSpeedKmh) * 60\n\t\t\t}\n\t\t}\n\t}\n\twarnings.push(\"Used haversine fallback for pairwise distances and durations.\")\n\treturn { distancesKm, durationsMin, warnings }\n}\n\nconst normalizeMatrixResponse = (\n\tresponse: MatrixResponse,\n\tlocations: LonLat[],\n\taverageSpeedKmh: number,\n\twarnings: string[]\n): MatrixData => {\n\tconst distancesKm: number[][] = []\n\tconst durationsMin: number[][] = []\n\tconst size = locations.length\n\tconst rawDistances = response.distances\n\tconst rawDurations = response.durations\n\tfor (let i = 0; i < size; i += 1) {\n\t\tdistancesKm[i] = []\n\t\tdurationsMin[i] = []\n\t\tfor (let j = 0; j < size; j += 1) {\n\t\t\tconst distanceM = rawDistances?.[i]?.[j]\n\t\t\tconst durationSec = rawDurations?.[i]?.[j]\n\t\t\tif (typeof distanceM === \"number\") {\n\t\t\t\tdistancesKm[i][j] = distanceM * KM_PER_M\n\t\t\t} else {\n\t\t\t\tconst fallback = haversineDistanceKm(locations[i], locations[j])\n\t\t\t\tdistancesKm[i][j] = fallback\n\t\t\t\twarnings.push(\"Missing distance value in matrix response, used haversine estimate.\")\n\t\t\t}\n\t\t\tif (typeof durationSec === \"number\") {\n\t\t\t\tdurationsMin[i][j] = durationSec / SEC_PER_MIN\n\t\t\t} else {\n\t\t\t\tconst distanceKm = distancesKm[i][j]\n\t\t\t\tdurationsMin[i][j] = (distanceKm / averageSpeedKmh) * 60\n\t\t\t\twarnings.push(\"Missing duration value in matrix response, estimated from average speed.\")\n\t\t\t}\n\t\t}\n\t}\n\treturn { distancesKm, durationsMin, warnings }\n}\n\nconst computeNeighborCounts = (clients: StandardizedClient[], matrix: MatrixData, neighborRadiusKm: number): void => {\n\tfor (const client of clients) {\n\t\tlet neighbors = 0\n\t\tfor (const other of clients) {\n\t\t\tif (client.id === other.id) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst distanceKm = matrix.distancesKm[client.matrixIndex]?.[other.matrixIndex]\n\t\t\tif (typeof distanceKm === \"number\" && distanceKm <= neighborRadiusKm) {\n\t\t\t\tneighbors += 1\n\t\t\t}\n\t\t}\n\t\tclient.neighborCount = neighbors\n\t}\n}\n\nconst updateClientBaseMetrics = (clients: StandardizedClient[], matrix: MatrixData): void => {\n\tfor (const client of clients) {\n\t\tconst distanceKm = matrix.distancesKm[0]?.[client.matrixIndex]\n\t\tconst durationMin = matrix.durationsMin[0]?.[client.matrixIndex]\n\t\tif (typeof distanceKm === \"number\") {\n\t\t\tclient.distanceFromDepotKm = distanceKm\n\t\t}\n\t\tif (typeof durationMin === \"number\") {\n\t\t\tclient.durationFromDepotMin = durationMin\n\t\t}\n\t}\n}\n\nconst computeScoring = (clients: StandardizedClient[], weights: TourScoringWeights): void => {\n\tconst maxAge = Math.max(...clients.map((client) => client.ageDays), 0)\n\tconst maxDistance = Math.max(...clients.map((client) => client.distanceFromDepotKm), 0)\n\tconst maxNeighbors = Math.max(...clients.map((client) => client.neighborCount), 0)\n\tfor (const client of clients) {\n\t\tconst ageScore = maxAge > EPSILON ? client.ageDays / maxAge : 0\n\t\tconst distanceScore = maxDistance > EPSILON ? client.distanceFromDepotKm / maxDistance : 0\n\t\tconst clusterScore = maxNeighbors > 0 ? client.neighborCount / maxNeighbors : 0\n\t\tconst urgentScore = client.urgent ? 1 : 0\n\t\tclient.score =\n\t\t\tageScore * weights.age +\n\t\t\tdistanceScore * weights.distance +\n\t\t\tclusterScore * weights.cluster +\n\t\t\turgentScore * weights.urgent\n\t}\n}\n\nconst selectSeeds = (clients: StandardizedClient[], desiredCount: number): StandardizedClient[] => {\n\tconst sorted = [...clients].sort((a, b) => b.score - a.score || b.ageDays - a.ageDays)\n\tconst seeds: StandardizedClient[] = []\n\tfor (const client of sorted) {\n\t\tif (client.weightKg <= 0) {\n\t\t\tcontinue\n\t\t}\n\t\tif (!seeds.some((seed) => seed.id === client.id)) {\n\t\t\tclient.seed = true\n\t\t\tseeds.push(client)\n\t\t}\n\t\tif (seeds.length >= desiredCount) {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn seeds\n}\n\nconst buildIsochrones = async (\n\tors: ORS,\n\tprofile: DirectionsProfile,\n\tseeds: StandardizedClient[],\n\toptions: TourPlanningOptions,\n\tlimits: TourPlanningLimits\n): Promise<Record<string, FeatureCollection | Feature | GeoJsonObject | undefined>> => {\n\tconst isoRangeMinutes = options.isoRangeMinutes ?? DEFAULT_OPTIONS.isoRangeMinutes\n\tif (isoRangeMinutes <= 0 || seeds.length === 0) {\n\t\treturn {}\n\t}\n\tlet isoProfile: IsochroneProfile\n\ttry {\n\t\tisoProfile = ensureIsochroneProfile(profile)\n\t} catch {\n\t\treturn {}\n\t}\n\tconst effectiveLimit = limits.isochroneMaxLocations ?? DEFAULT_LIMITS.isochrones.maxLocations\n\tconst maxRequests = Math.min(options.maxIsoRequests ?? DEFAULT_OPTIONS.maxIsoRequests, effectiveLimit)\n\tconst results: Record<string, FeatureCollection | Feature | GeoJsonObject | undefined> = {}\n\tconst profileGroup = resolveProfileGroup(isoProfile)\n\tconst maxRangeMap = DEFAULT_LIMITS.isochrones.maxRangeTimeHoursByGroup\n\tconst groupKey =\n\t\tprofileGroup && profileGroup !== \"wheelchair\" && profileGroup in maxRangeMap\n\t\t\t? (profileGroup as keyof typeof maxRangeMap)\n\t\t\t: \"driving\"\n\tconst maxRangeMinutes = (maxRangeMap[groupKey] ?? 1) * 60\n\tconst rangeSeconds = Math.min(isoRangeMinutes, maxRangeMinutes) * SEC_PER_MIN\n\tfor (let i = 0; i < seeds.length && i < maxRequests; i += 1) {\n\t\tconst seed = seeds[i]\n\t\ttry {\n\t\t\tconst response = await ors.isochrones(\n\t\t\t\tisoProfile,\n\t\t\t\t{\n\t\t\t\t\tlocations: [seed.coordinate],\n\t\t\t\t\trange_type: \"time\",\n\t\t\t\t\trange: [rangeSeconds],\n\t\t\t\t},\n\t\t\t\toptions.isochroneRequestOptions\n\t\t\t)\n\t\t\tresults[seed.id] = response as FeatureCollection | Feature | GeoJsonObject\n\t\t} catch (error) {\n\t\t\tresults[seed.id] = undefined\n\t\t}\n\t}\n\treturn results\n}\n\nconst isPointInsideFeature = (\n\tgeometry: FeatureCollection | Feature | GeoJsonObject | undefined,\n\tcoordinate: LonLat\n): boolean => {\n\tif (!geometry) {\n\t\treturn false\n\t}\n\tswitch (geometry.type) {\n\t\tcase \"FeatureCollection\": {\n\t\t\tconst collection = geometry as FeatureCollection\n\t\t\treturn collection.features.some((feature) => isPointInsideFeature(feature, coordinate))\n\t\t}\n\t\tcase \"Feature\": {\n\t\t\tconst feature = geometry as Feature\n\t\t\tif (!feature.geometry) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn isPointInsideFeature(feature.geometry as GeoJsonObject, coordinate)\n\t\t}\n\t\tcase \"Polygon\": {\n\t\t\treturn isPointInsidePolygon(geometry as Polygon, coordinate)\n\t\t}\n\t\tcase \"MultiPolygon\": {\n\t\t\tconst multi = geometry as MultiPolygon\n\t\t\treturn multi.coordinates.some((polygon) =>\n\t\t\t\tisPointInsidePolygon(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"Polygon\",\n\t\t\t\t\t\tcoordinates: polygon,\n\t\t\t\t\t},\n\t\t\t\t\tcoordinate\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\tdefault:\n\t\t\treturn false\n\t}\n}\n\nconst isPointInsidePolygon = (polygon: Polygon, coordinate: LonLat): boolean => {\n\tconst [lon, lat] = coordinate\n\tconst [outerRing] = polygon.coordinates as Position[][]\n\tif (!outerRing) {\n\t\treturn false\n\t}\n\tlet inside = false\n\tfor (let i = 0, j = outerRing.length - 1; i < outerRing.length; j = i, i += 1) {\n\t\tconst xi = outerRing[i][0]\n\t\tconst yi = outerRing[i][1]\n\t\tconst xj = outerRing[j][0]\n\t\tconst yj = outerRing[j][1]\n\t\tconst intersect = yi > lat !== yj > lat && lon < ((xj - xi) * (lat - yi)) / (yj - yi + Number.EPSILON) + xi\n\t\tif (intersect) {\n\t\t\tinside = !inside\n\t\t}\n\t}\n\treturn inside\n}\n\nconst bestInsertionIndex = (\n\tsequence: StandardizedClient[],\n\tcandidate: StandardizedClient,\n\tmatrix: MatrixData,\n\tlockFirst = false\n): { index: number; costIncreaseKm: number } => {\n\tif (sequence.length === 0) {\n\t\treturn { index: 0, costIncreaseKm: matrix.distancesKm[0][candidate.matrixIndex] }\n\t}\n\tlet bestIndex = 0\n\tlet bestCost = Number.POSITIVE_INFINITY\n\tfor (let insertAt = 0; insertAt <= sequence.length; insertAt += 1) {\n\t\tif (lockFirst && insertAt === 0) {\n\t\t\tcontinue\n\t\t}\n\t\tconst prevIndex = insertAt === 0 ? 0 : sequence[insertAt - 1].matrixIndex\n\t\tconst nextIndex = insertAt === sequence.length ? 0 : sequence[insertAt]?.matrixIndex ?? 0\n\t\tconst costIncrease =\n\t\t\tmatrix.distancesKm[prevIndex][candidate.matrixIndex] +\n\t\t\tmatrix.distancesKm[candidate.matrixIndex][nextIndex] -\n\t\t\tmatrix.distancesKm[prevIndex][nextIndex]\n\t\tif (costIncrease < bestCost) {\n\t\t\tbestCost = costIncrease\n\t\t\tbestIndex = insertAt\n\t\t}\n\t}\n\treturn { index: bestIndex, costIncreaseKm: bestCost }\n}\n\nconst buildTour = (\n\tseed: StandardizedClient,\n\tcandidates: Map<string, StandardizedClient>,\n\tmatrix: MatrixData,\n\tcapacityKg: number,\n\toptions: Required<Pick<TourPlanningOptions, \"clusterRadiusKm\" | \"maxCandidatesPerTour\">>,\n\tisochrone?: FeatureCollection | Feature | GeoJsonObject\n): BuildTourContext => {\n\tconst stops: StandardizedClient[] = [seed]\n\tconst plannedStops: PlannedStop[] = [\n\t\t{\n\t\t\t...seed,\n\t\t\tposition: 1,\n\t\t\tinsertionCostKm: matrix.distancesKm[0][seed.matrixIndex],\n\t\t},\n\t]\n\tlet totalWeight = seed.weightKg\n\tconst warnings: string[] = []\n\tconst remaining = new Map(candidates)\n\tremaining.delete(seed.id)\n\n\twhile (remaining.size > 0) {\n\t\tconst feasible: Array<{\n\t\t\tclient: StandardizedClient\n\t\t\tinsertionIndex: number\n\t\t\tcostKm: number\n\t\t\tpriority: number\n\t\t}> = []\n\t\tfor (const candidate of remaining.values()) {\n\t\t\tif (candidate.weightKg + totalWeight > capacityKg + EPSILON) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (isochrone && !isPointInsideFeature(isochrone, candidate.coordinate)) {\n\t\t\t\tconst distanceToSeed =\n\t\t\t\t\tmatrix.distancesKm[seed.matrixIndex]?.[candidate.matrixIndex] ??\n\t\t\t\t\thaversineDistanceKm(seed.coordinate, candidate.coordinate)\n\t\t\t\tif (distanceToSeed > options.clusterRadiusKm) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst { index, costIncreaseKm } = bestInsertionIndex(stops, candidate, matrix, true)\n\t\t\tconst distanceToSeed =\n\t\t\t\tmatrix.distancesKm[seed.matrixIndex]?.[candidate.matrixIndex] ??\n\t\t\t\thaversineDistanceKm(seed.coordinate, candidate.coordinate)\n\t\t\tconst distanceScore =\n\t\t\t\tdistanceToSeed <= options.clusterRadiusKm ? 1 : options.clusterRadiusKm / (distanceToSeed + EPSILON)\n\t\t\tconst priority = candidate.score * distanceScore\n\t\t\tfeasible.push({\n\t\t\t\tclient: candidate,\n\t\t\t\tinsertionIndex: index,\n\t\t\t\tcostKm: costIncreaseKm,\n\t\t\t\tpriority,\n\t\t\t})\n\t\t}\n\t\tif (feasible.length === 0) {\n\t\t\tbreak\n\t\t}\n\t\tfeasible.sort((a, b) => {\n\t\t\tconst scoreDiff = b.priority - a.priority\n\t\t\tif (Math.abs(scoreDiff) > EPSILON) {\n\t\t\t\treturn scoreDiff\n\t\t\t}\n\t\t\treturn a.costKm - b.costKm\n\t\t})\n\t\tconst choice = feasible[0]\n\t\tif (!choice) {\n\t\t\tbreak\n\t\t}\n\t\tconst client = choice.client\n\t\tstops.splice(choice.insertionIndex, 0, client)\n\t\tplannedStops.splice(choice.insertionIndex, 0, {\n\t\t\t...client,\n\t\t\tposition: choice.insertionIndex + 1,\n\t\t\tinsertionCostKm: Math.max(choice.costKm, 0),\n\t\t})\n\t\ttotalWeight += client.weightKg\n\t\tremaining.delete(client.id)\n\t\tif (plannedStops.length >= options.maxCandidatesPerTour) {\n\t\t\twarnings.push(`Reached max candidates per tour constraint (${options.maxCandidatesPerTour}).`)\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn {\n\t\tseed,\n\t\tstops: plannedStops.map((stop, index) => ({\n\t\t\t...stop,\n\t\t\tposition: index + 1,\n\t\t})),\n\t\ttotalWeight,\n\t\twarnings,\n\t}\n}\n\nconst sumRouteMetrics = (tour: BuildTourContext, matrix: MatrixData): { distanceKm: number; durationMin: number } => {\n\tlet distanceKm = 0\n\tlet durationMin = 0\n\tlet previousIndex = 0\n\tfor (const stop of tour.stops) {\n\t\tconst index = stop.matrixIndex\n\t\tdistanceKm += matrix.distancesKm[previousIndex][index] ?? 0\n\t\tdurationMin += matrix.durationsMin[previousIndex][index] ?? 0\n\t\tpreviousIndex = index\n\t}\n\tdistanceKm += matrix.distancesKm[previousIndex][0] ?? 0\n\tdurationMin += matrix.durationsMin[previousIndex][0] ?? 0\n\treturn { distanceKm, durationMin }\n}\n\nconst enrichWithDirections = async (\n\tors: ORS,\n\tprofile: DirectionsProfile,\n\tdepot: LonLat,\n\ttour: BuildTourContext,\n\toptions: TourPlanningOptions,\n\tlimits: TourPlanningLimits\n): Promise<FeatureCollection | Feature | GeoJsonObject | undefined> => {\n\tconst directionsLimit = limits.directionsMaxWaypoints ?? DEFAULT_LIMITS.directions.maxWaypoints\n\tif (tour.stops.length + 2 > directionsLimit) {\n\t\treturn undefined\n\t}\n\tconst coordinates: LonLat[] = [depot, ...tour.stops.map((stop) => stop.coordinate), depot]\n\ttry {\n\t\tconst response = await ors.directions(\n\t\t\tprofile,\n\t\t\t{\n\t\t\t\tcoordinates,\n\t\t\t\tinstructions: false,\n\t\t\t\tgeometry: true,\n\t\t\t\tgeometry_simplify: false,\n\t\t\t\tformat: \"geojson\",\n\t\t\t},\n\t\t\toptions.directionsRequestOptions\n\t\t)\n\t\tif (response && typeof response === \"object\" && \"features\" in response) {\n\t\t\treturn response as FeatureCollection\n\t\t}\n\t\treturn response as FeatureCollection | Feature | GeoJsonObject | undefined\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nconst injectAlongRouteClients = (\n\ttour: BuildTourContext,\n\tmatrix: MatrixData,\n\tremaining: Map<string, StandardizedClient>,\n\ttoleranceKm: number,\n\tcapacityKg: number\n): boolean => {\n\tif (!tour.routeGeoJson) {\n\t\treturn false\n\t}\n\tconst nearby: StandardizedClient[] = []\n\tfor (const candidate of remaining.values()) {\n\t\tif (tour.stops.some((stop) => stop.id === candidate.id)) {\n\t\t\tcontinue\n\t\t}\n\t\tconst result = computeRouteProximity(tour.routeGeoJson, candidate.coordinate, { toleranceKm })\n\t\tif (result.isWithinTolerance) {\n\t\t\tnearby.push(candidate)\n\t\t}\n\t}\n\tnearby.sort((a, b) => b.score - a.score)\n\tconst stopsSequence = tour.stops.map((stop) => stop as StandardizedClient)\n\tlet inserted = false\n\tfor (const candidate of nearby) {\n\t\tif (candidate.weightKg + tour.totalWeight > capacityKg + EPSILON) {\n\t\t\tcontinue\n\t\t}\n\t\tconst { index, costIncreaseKm } = bestInsertionIndex(stopsSequence, candidate, matrix, true)\n\t\tstopsSequence.splice(index, 0, candidate)\n\t\ttour.stops.splice(index, 0, {\n\t\t\t...candidate,\n\t\t\tinsertionCostKm: Math.max(costIncreaseKm, 0),\n\t\t\tposition: index + 1,\n\t\t})\n\t\tremaining.delete(candidate.id)\n\t\ttour.totalWeight += candidate.weightKg\n\t\tinserted = true\n\t}\n\tfor (let i = 0; i < tour.stops.length; i += 1) {\n\t\ttour.stops[i].position = i + 1\n\t}\n\treturn inserted\n}\n\n/**\n * Builds clustered delivery tours by combining ORS matrix, isochrone, and directions services with heuristics.\n * Useful for medium fleets that need quick proposals before running full optimization.\n * @param ors - Initialized ORS client used for upstream API calls.\n * @param request - Core planning input including depot, clients, capacity, and desired tours. Expected keys:\n *   - `clients`: Array of deliveries with `name`, `[lon,lat]` `coordinate`, `weightKg`, and `orderDate`; optional `id` and `urgent`.\n *   - `truckCapacityKg`: Maximum payload the vehicle can carry; enforced against cumulative client weights per tour.\n *   - `desiredTourCount`: Number of tours the heuristic tries to seed before filling with nearby clients.\n *   - `depot`: `[lon,lat]` coordinate used as origin/terminus for every tour and routing request.\n * @param options - Optional tuning knobs controlling heuristics, limits, and upstream requests. Supported keys:\n *   - `profile` (default `'driving-hgv'`): ORS directions profile applied to every matrix/isochrone/directions call.\n *   - `isoRangeMinutes` (default `60`): Travel time window for each seed isochrone; values above ORS caps are clamped.\n *   - `maxIsoRequests` (default `5`): Ceiling on isochrone calls per run to keep API usage within account limits.\n *   - `clusterRadiusKm` (default `35`): Maximum straight-line distance from a seed for non-isochrone candidates.\n *   - `neighborRadiusKm` (default `25`): Radius used when counting neighboring clients for score weighting.\n *   - `alongRouteToleranceKm` (default `8`): Corridor width used when injecting extra clients along the final route.\n *   - `averageSpeedKmh` (default `55`): Speed assumption for fallback durations and initial depot distance metrics.\n *   - `scoringWeights` (defaults `{ age:0.5, distance:0.25, cluster:0.15, urgent:0.1 }`): Partial override for score weights.\n *   - `referenceDate` (default `new Date()`): Timestamp used to compute client aging when prioritizing older orders.\n *   - `maxCandidatesPerTour` (default `40`): Safety cap on stops considered per tour before aborting further insertions.\n *   - `limits.matrixMaxCells`: Hard stop for matrix cell count before falling back to haversine estimates.\n *   - `limits.directionsMaxWaypoints`: Maximum waypoints allowed when asking ORS for detailed directions geometry.\n *   - `limits.isochroneMaxLocations`: Upper bound on the number of locations included in isochrone requests.\n *   - `matrixRequestOptions`: Extra request metadata (AbortSignal/Axios config) forwarded to `ors.matrix`.\n *   - `isochroneRequestOptions`: Additional options forwarded to `ors.isochrones`.\n *   - `directionsRequestOptions`: Additional options forwarded to `ors.directions`.\n * @returns Planned tours, unassigned clients, warnings, and scoring metadata.\n * @example\n * ```ts\n * const result = await planDeliveryTours(ors, {\n *   clients: [\n *     { name: 'Client 1', coordinate: [8.68, 49.41], weightKg: 200, orderDate: new Date() },\n *     { name: 'Client 2', coordinate: [8.70, 49.42], weightKg: 150, orderDate: new Date() }\n *   ],\n *   truckCapacityKg: 2_000,\n *   desiredTourCount: 1,\n *   depot: [8.65, 49.40]\n * }, {\n *   alongRouteToleranceKm: 0.2,\n *   profile: 'driving-hgv'\n * });\n * console.log(result.tours[0].estimatedDistanceKm);\n * ```\n */\nexport const planDeliveryTours = async (\n\tors: ORS,\n\trequest: TourPlanningRequest,\n\toptions: TourPlanningOptions = {}\n): Promise<TourPlanningResult> => {\n\tif (!request || !Array.isArray(request.clients) || request.clients.length === 0) {\n\t\tthrow new Error(\"At least one client is required to plan tours.\")\n\t}\n\tif (!Number.isFinite(request.truckCapacityKg) || request.truckCapacityKg <= 0) {\n\t\tthrow new Error(\"Truck capacity must be a positive number.\")\n\t}\n\tif (!Number.isInteger(request.desiredTourCount) || request.desiredTourCount <= 0) {\n\t\tthrow new Error(\"desiredTourCount must be a positive integer.\")\n\t}\n\tconst depot = normalizeCoordinate(request.depot, \"Depot coordinate\")\n\tconst mergedOptions = { ...DEFAULT_OPTIONS, ...options }\n\tconst referenceDate = options.referenceDate ?? new Date()\n\tconst weights: TourScoringWeights = {\n\t\t...DEFAULT_SCORING_WEIGHTS,\n\t\t...options.scoringWeights,\n\t}\n\n\tconst normalizedClients = request.clients.map((client, index) =>\n\t\tnormalizeClient(client, index, depot, referenceDate, mergedOptions.averageSpeedKmh)\n\t)\n\n\tconst limits = options.limits ?? {}\n\n\tconst matrix = await buildMatrix(ors, mergedOptions.profile, depot, normalizedClients, mergedOptions, limits)\n\n\tupdateClientBaseMetrics(normalizedClients, matrix)\n\n\tcomputeNeighborCounts(normalizedClients, matrix, mergedOptions.neighborRadiusKm)\n\tcomputeScoring(normalizedClients, weights)\n\n\tconst seeds = selectSeeds(normalizedClients, request.desiredTourCount)\n\n\tconst isoGeometries = await buildIsochrones(ors, mergedOptions.profile, seeds, mergedOptions, limits)\n\n\tconst remaining = new Map(normalizedClients.map((client) => [client.id, client]))\n\tconst tours: PlannedTour[] = []\n\tconst globalWarnings = [...matrix.warnings]\n\n\tfor (const seed of seeds) {\n\t\tif (!remaining.has(seed.id)) {\n\t\t\tcontinue\n\t\t}\n\t\tconst context = buildTour(\n\t\t\tseed,\n\t\t\tremaining,\n\t\t\tmatrix,\n\t\t\trequest.truckCapacityKg,\n\t\t\t{\n\t\t\t\tclusterRadiusKm: mergedOptions.clusterRadiusKm,\n\t\t\t\tmaxCandidatesPerTour: mergedOptions.maxCandidatesPerTour,\n\t\t\t},\n\t\t\tisoGeometries[seed.id]\n\t\t)\n\t\tconst routeGeometry = await enrichWithDirections(ors, mergedOptions.profile, depot, context, mergedOptions, limits)\n\t\tif (routeGeometry) {\n\t\t\tcontext.routeGeoJson = routeGeometry\n\t\t}\n\t\tconst extended = injectAlongRouteClients(\n\t\t\tcontext,\n\t\t\tmatrix,\n\t\t\tremaining,\n\t\t\tmergedOptions.alongRouteToleranceKm,\n\t\t\trequest.truckCapacityKg\n\t\t)\n\t\tif (extended) {\n\t\t\tconst refreshedGeometry = await enrichWithDirections(\n\t\t\t\tors,\n\t\t\t\tmergedOptions.profile,\n\t\t\t\tdepot,\n\t\t\t\tcontext,\n\t\t\t\tmergedOptions,\n\t\t\t\tlimits\n\t\t\t)\n\t\t\tif (refreshedGeometry) {\n\t\t\t\tcontext.routeGeoJson = refreshedGeometry\n\t\t\t}\n\t\t}\n\t\tconst metrics = sumRouteMetrics(context, matrix)\n\t\ttours.push({\n\t\t\tid: `tour_${tours.length + 1}`,\n\t\t\tstops: context.stops,\n\t\t\ttotalWeightKg: context.totalWeight,\n\t\t\testimatedDistanceKm: metrics.distanceKm,\n\t\t\testimatedDurationMin: metrics.durationMin,\n\t\t\trouteGeoJson: context.routeGeoJson,\n\t\t\twarnings: context.warnings,\n\t\t})\n\t\tfor (const stop of context.stops) {\n\t\t\tremaining.delete(stop.id)\n\t\t}\n\t}\n\n\tif (remaining.size > 0) {\n\t\tfor (const client of remaining.values()) {\n\t\t\tif (client.weightKg > request.truckCapacityKg) {\n\t\t\t\tglobalWarnings.push(`Client \"${client.name}\" exceeds truck capacity and remains unassigned.`)\n\t\t\t}\n\t\t}\n\t\tglobalWarnings.push(`${remaining.size} client(s) remain unassigned after planning.`)\n\t}\n\n\tconst unassigned = [...remaining.values()].sort((a, b) => b.score - a.score)\n\n\treturn {\n\t\ttours,\n\t\tunassigned,\n\t\twarnings: globalWarnings,\n\t\tscoringWeights: weights,\n\t\tcreatedAt: referenceDate,\n\t}\n}\nconst ensureIsochroneProfile = (profile: DirectionsProfile): IsochroneProfile => {\n\tif (profile === \"wheelchair\") {\n\t\tthrow new Error(\"Wheelchair profile is not supported for isochrones.\")\n\t}\n\treturn profile as IsochroneProfile\n}\n","import type { FeatureCollection, LineString } from \"geojson\"\nimport { DEFAULT_LIMITS } from \"../constants.js\"\nimport type { DirectionsProfile, OptimizationRequest, RequestOptions } from \"../types.js\"\nimport type { LonLat } from \"../utils/geo.js\"\nimport { haversineDistanceKm } from \"../utils/geo.js\"\nimport { ORS } from \"../ors.js\"\nimport type {\n\tDeliveryClientInput,\n\tPlannedClient,\n\tPlannedStop,\n\tPlannedTour,\n\tTourPlanningRequest,\n} from \"./tourPlanner.js\"\n\nconst SECONDS_PER_MINUTE = 60\nconst SECONDS_PER_HOUR = 3600\nconst MS_PER_DAY = 86_400_000\nconst DEFAULT_SERVICE_MINUTES = 20\nconst DEFAULT_PRIORITY_BASE = 60\nconst DEFAULT_PRIORITY_AGE_SCALE = 2\nconst DEFAULT_URGENT_PRIORITY_BOOST = 25\nconst DEFAULT_AVERAGE_SPEED_KMH = 55\nconst DEFAULT_SHIFT_HOURS = 10\n\ninterface OptimizationStep {\n\ttype: \"start\" | \"end\" | \"job\" | \"break\"\n\tjob?: number\n\tid?: number\n\tlocation?: LonLat\n\tarrival?: number\n\tduration?: number\n\tservice?: number\n\twaiting_time?: number\n\tdistance?: number\n}\n\ninterface OptimizationRoute {\n\tvehicle: number\n\tdistance?: number\n\tduration?: number\n\tcost?: number\n\tsteps?: OptimizationStep[]\n}\n\ninterface OptimizationUnassigned {\n\tid?: number\n\tjob?: number\n}\n\ninterface OptimizationSummary {\n\tcost?: number\n\tdistance?: number\n\tduration?: number\n}\n\ninterface OptimizationResponseLike {\n\tcode?: number\n\tsummary?: OptimizationSummary\n\troutes?: OptimizationRoute[]\n\tunassigned?: OptimizationUnassigned[]\n\tsolution?: {\n\t\troutes?: OptimizationRoute[]\n\t\tunassigned?: OptimizationUnassigned[]\n\t\tsummary?: OptimizationSummary\n\t}\n}\n\ninterface NormalizedClient extends PlannedClient {\n\tjobId: number\n\tweightDemand: number\n\tpriority: number\n}\n\nexport interface VRPPlannerOptions {\n\tprofile?: DirectionsProfile\n\tserviceTimeMinutes?: number\n\tpriorityBase?: number\n\tpriorityAgeScale?: number\n\turgentPriorityBoost?: number\n\taverageSpeedKmh?: number\n\tshiftDurationHours?: number\n\tshiftStartSeconds?: number\n\toptimizationRequestOptions?: RequestOptions\n}\n\nexport interface VRPPlanningResult {\n\ttours: PlannedTour[]\n\tunassigned: PlannedClient[]\n\twarnings: string[]\n\tcreatedAt: Date\n\tsolver?: {\n\t\tvehiclesRequested: number\n\t\tvehiclesUsed: number\n\t\tcost?: number\n\t\tdistanceKm?: number\n\t\tdurationMin?: number\n\t\tcode?: number\n\t}\n}\n\nconst normalizeCoordinate = (coordinate: LonLat, label: string): LonLat => {\n\tif (!Array.isArray(coordinate) || coordinate.length < 2) {\n\t\tthrow new Error(`${label} must be a [lon, lat] pair.`)\n\t}\n\tconst lon = Number(coordinate[0])\n\tconst lat = Number(coordinate[1])\n\tif (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n\t\tthrow new Error(`${label} must contain finite coordinates.`)\n\t}\n\treturn [lon, lat]\n}\n\nconst normalizeClient = (\n\tclient: DeliveryClientInput,\n\tindex: number,\n\tdepot: LonLat,\n\treferenceDate: Date,\n\taverageSpeedKmh: number,\n\toptions: Pick<VRPPlannerOptions, \"priorityBase\" | \"priorityAgeScale\" | \"urgentPriorityBoost\">\n): NormalizedClient => {\n\tconst id = client.id ?? `client_${index + 1}`\n\tconst coordinate = normalizeCoordinate(client.coordinate, `Client ${id} coordinate`)\n\tconst orderDate = new Date(client.orderDate)\n\tif (Number.isNaN(orderDate.getTime())) {\n\t\tthrow new Error(`Invalid orderDate for client \"${id}\".`)\n\t}\n\tconst ageMs = Math.max(0, referenceDate.getTime() - orderDate.getTime())\n\tconst ageDays = ageMs / MS_PER_DAY\n\tconst distanceFromDepotKm = haversineDistanceKm(depot, coordinate)\n\tconst durationFromDepotMin = (distanceFromDepotKm / averageSpeedKmh) * 60\n\tconst weightKg = Number(client.weightKg)\n\tif (!Number.isFinite(weightKg) || weightKg <= 0) {\n\t\tthrow new Error(`Client \"${id}\" must have a positive weightKg.`)\n\t}\n\tconst weightDemand = Math.max(1, Math.round(weightKg))\n\tconst base = options.priorityBase ?? DEFAULT_PRIORITY_BASE\n\tconst scale = options.priorityAgeScale ?? DEFAULT_PRIORITY_AGE_SCALE\n\tconst urgentBoost = options.urgentPriorityBoost ?? DEFAULT_URGENT_PRIORITY_BOOST\n\tconst ageAdjustment = Math.min(45, Math.round(ageDays * scale))\n\tlet priority = base - ageAdjustment\n\tif (client.urgent) {\n\t\tpriority -= urgentBoost\n\t}\n\tpriority = Math.max(1, Math.min(100, priority))\n\n\treturn {\n\t\t...client,\n\t\tid,\n\t\torderDate,\n\t\turgent: Boolean(client.urgent),\n\t\tcoordinate,\n\t\tageDays,\n\t\tdistanceFromDepotKm,\n\t\tdurationFromDepotMin,\n\t\tneighborCount: 0,\n\t\tscore: ageDays,\n\t\tseed: false,\n\t\tmatrixIndex: index + 1,\n\t\tjobId: index + 1,\n\t\tweightDemand,\n\t\tpriority,\n\t}\n}\n\nconst toServiceSeconds = (serviceMinutes?: number): number => {\n\tconst minutes = Number.isFinite(serviceMinutes) ? (serviceMinutes as number) : DEFAULT_SERVICE_MINUTES\n\treturn Math.max(0, Math.round(minutes * SECONDS_PER_MINUTE))\n}\n\nconst createVehicleDescriptors = (\n\tcount: number,\n\tdepot: LonLat,\n\tcapacityKg: number,\n\tprofile: DirectionsProfile,\n\tshiftStartSeconds: number,\n\tshiftDurationSeconds: number\n): Record<string, unknown>[] => {\n\tconst capacityDemand = Math.max(1, Math.round(capacityKg))\n\tconst vehicles: Record<string, unknown>[] = []\n\tfor (let i = 0; i < count; i += 1) {\n\t\tvehicles.push({\n\t\t\tid: i + 1,\n\t\t\tprofile,\n\t\t\tstart: depot,\n\t\t\tend: depot,\n\t\t\tcapacity: [capacityDemand],\n\t\t\ttime_window: [shiftStartSeconds, shiftStartSeconds + shiftDurationSeconds],\n\t\t\tspeed_factor: 1,\n\t\t})\n\t}\n\treturn vehicles\n}\n\nconst buildOptimizationRequest = (\n\tnormalizedClients: NormalizedClient[],\n\tvehicles: Record<string, unknown>[],\n\tserviceSeconds: number\n): OptimizationRequest => {\n\tconst jobs = normalizedClients.map((client) => {\n\t\tconst job: Record<string, unknown> = {\n\t\t\tid: client.jobId,\n\t\t\tname: client.name ?? client.id,\n\t\t\tlocation: client.coordinate,\n\t\t\tservice: serviceSeconds,\n\t\t\tamount: [client.weightDemand],\n\t\t\tpriority: client.priority,\n\t\t}\n\t\tif (client.urgent) {\n\t\t\tjob.skills = [1]\n\t\t}\n\t\treturn job\n\t})\n\treturn {\n\t\tjobs,\n\t\tvehicles,\n\t}\n}\n\nconst selectRoutes = (response: OptimizationResponseLike): OptimizationRoute[] => {\n\tif (Array.isArray(response.routes) && response.routes.length > 0) {\n\t\treturn response.routes\n\t}\n\tif (response.solution?.routes && response.solution.routes.length > 0) {\n\t\treturn response.solution.routes\n\t}\n\treturn []\n}\n\nconst selectUnassigned = (response: OptimizationResponseLike): OptimizationUnassigned[] => {\n\tif (Array.isArray(response.unassigned) && response.unassigned.length > 0) {\n\t\treturn response.unassigned\n\t}\n\tif (response.solution?.unassigned && response.solution.unassigned.length > 0) {\n\t\treturn response.solution.unassigned\n\t}\n\treturn []\n}\n\nconst metersToKm = (value?: number): number => (typeof value === \"number\" ? value / 1000 : 0)\n\nconst secondsToMinutes = (value?: number): number => (typeof value === \"number\" ? value / SECONDS_PER_MINUTE : 0)\n\nconst deriveRouteGeometry = (steps: OptimizationStep[]): LonLat[] => {\n\tconst coordinates: LonLat[] = []\n\tfor (const step of steps) {\n\t\tif (Array.isArray(step.location) && step.location.length >= 2) {\n\t\t\tcoordinates.push([Number(step.location[0]), Number(step.location[1])])\n\t\t}\n\t}\n\treturn coordinates\n}\n\nconst buildStopsFromRoute = (\n\troute: OptimizationRoute,\n\tclientByJobId: Map<number, NormalizedClient>\n): { stops: PlannedStop[]; totalWeight: number; jobIds: number[] } => {\n\tconst steps = Array.isArray(route.steps) ? route.steps : []\n\tconst stops: PlannedStop[] = []\n\tlet totalWeight = 0\n\tlet previousDistance = 0\n\tconst jobIds: number[] = []\n\n\tfor (const step of steps) {\n\t\tconst jobId = step.job ?? step.id\n\t\tif (!jobId || !clientByJobId.has(jobId)) {\n\t\t\tpreviousDistance = step.distance ?? previousDistance\n\t\t\tcontinue\n\t\t}\n\t\tconst client = clientByJobId.get(jobId) as NormalizedClient\n\t\tconst insertionCostMeters =\n\t\t\ttypeof step.distance === \"number\" && typeof previousDistance === \"number\"\n\t\t\t\t? Math.max(0, step.distance - previousDistance)\n\t\t\t\t: 0\n\t\tpreviousDistance = step.distance ?? previousDistance\n\t\ttotalWeight += client.weightKg\n\t\tstops.push({\n\t\t\t...client,\n\t\t\tposition: stops.length + 1,\n\t\t\tinsertionCostKm: metersToKm(insertionCostMeters),\n\t\t})\n\t\tjobIds.push(jobId)\n\t}\n\n\treturn { stops, totalWeight, jobIds }\n}\n\nconst buildRouteGeoJson = (coordinates: LonLat[]) => {\n\tif (coordinates.length < 2) {\n\t\treturn undefined\n\t}\n\tconst geometry: LineString = {\n\t\ttype: \"LineString\",\n\t\tcoordinates,\n\t}\n\tconst featureCollection: FeatureCollection<LineString> = {\n\t\ttype: \"FeatureCollection\",\n\t\tfeatures: [\n\t\t\t{\n\t\t\t\ttype: \"Feature\",\n\t\t\t\tproperties: {},\n\t\t\t\tgeometry,\n\t\t\t},\n\t\t],\n\t}\n\treturn featureCollection\n}\n\n/**\n * Delegates delivery tour construction to the ORS optimization endpoint (VRP solver) with sensible defaults.\n * Ideal when you want solver-backed routes but still need structured application output.\n * @param ors - Initialized ORS client used to call the optimization endpoint.\n * @param request - Planning input including depot, clients, truck capacity, and requested vehicle count.\n * @param options - Optional solver tuning such as profile, service times, and shift configuration.\n * @returns Planned tours, unassigned clients, solver metadata, and warnings.\n * @example\n * ```ts\n * const vrpResult = await planDeliveryToursVRP(ors, {\n *   clients: [\n *     { name: 'Client 1', coordinate: [8.68, 49.41], weightKg: 200, orderDate: new Date() },\n *     { name: 'Client 2', coordinate: [8.70, 49.42], weightKg: 150, orderDate: new Date() }\n *   ],\n *   truckCapacityKg: 2_000,\n *   desiredTourCount: 2,\n *   depot: [8.65, 49.40]\n * }, {\n *   serviceTimeMinutes: 15,\n *   profile: 'driving-hgv'\n * });\n * console.log(vrpResult.tours.map((tour) => tour.stops.length));\n * ```\n */\nexport const planDeliveryToursVRP = async (\n\tors: ORS,\n\trequest: TourPlanningRequest,\n\toptions: VRPPlannerOptions = {}\n): Promise<VRPPlanningResult> => {\n\tif (!request || !Array.isArray(request.clients) || request.clients.length === 0) {\n\t\tthrow new Error(\"At least one client is required to plan VRP tours.\")\n\t}\n\tif (!Number.isFinite(request.truckCapacityKg) || request.truckCapacityKg <= 0) {\n\t\tthrow new Error(\"Truck capacity must be a positive number.\")\n\t}\n\tif (!Number.isInteger(request.desiredTourCount) || request.desiredTourCount <= 0) {\n\t\tthrow new Error(\"desiredTourCount must be a positive integer.\")\n\t}\n\n\tconst depot = normalizeCoordinate(request.depot, \"Depot coordinate\")\n\tconst referenceDate = new Date()\n\tconst profile = options.profile ?? \"driving-hgv\"\n\tconst averageSpeedKmh = options.averageSpeedKmh ?? DEFAULT_AVERAGE_SPEED_KMH\n\tconst serviceSeconds = toServiceSeconds(options.serviceTimeMinutes)\n\tconst shiftDurationHours = options.shiftDurationHours ?? DEFAULT_SHIFT_HOURS\n\tconst shiftDurationSeconds = Math.max(SECONDS_PER_HOUR, Math.round(shiftDurationHours * SECONDS_PER_HOUR))\n\tconst shiftStartSeconds = Math.max(0, options.shiftStartSeconds ?? 0)\n\n\tconst normalizedClients = request.clients.map((client, index) =>\n\t\tnormalizeClient(client, index, depot, referenceDate, averageSpeedKmh, options)\n\t)\n\tconst clientByJobId = new Map<number, NormalizedClient>(normalizedClients.map((client) => [client.jobId, client]))\n\n\tconst requestedVehicleCount = request.desiredTourCount\n\tconst maxVehicles = DEFAULT_LIMITS.optimization.maxVehicles\n\tconst vehicleCount = Math.min(requestedVehicleCount, maxVehicles)\n\tconst warnings: string[] = []\n\tif (requestedVehicleCount > maxVehicles) {\n\t\twarnings.push(\n\t\t\t`Requested ${requestedVehicleCount} vehicles but optimization limit is ${maxVehicles}. Using ${vehicleCount} vehicle(s).`\n\t\t)\n\t}\n\n\tconst vehicles = createVehicleDescriptors(\n\t\tvehicleCount,\n\t\tdepot,\n\t\trequest.truckCapacityKg,\n\t\tprofile,\n\t\tshiftStartSeconds,\n\t\tshiftDurationSeconds\n\t)\n\n\tconst optimizationRequest = buildOptimizationRequest(normalizedClients, vehicles, serviceSeconds)\n\n\tlet response: OptimizationResponseLike\n\ttry {\n\t\tresponse = await ors.optimization<OptimizationResponseLike>(optimizationRequest, options.optimizationRequestOptions)\n\t} catch (error) {\n\t\tthrow new Error(`ORS optimization failed: ${(error as Error).message ?? \"Unknown error\"}`)\n\t}\n\n\tconst routes = selectRoutes(response)\n\tconst optimizationSummary = response.summary ?? response.solution?.summary\n\tconst tours: PlannedTour[] = []\n\tconst assignedJobIds = new Set<number>()\n\n\tfor (const route of routes) {\n\t\tconst { stops, totalWeight, jobIds } = buildStopsFromRoute(route, clientByJobId)\n\t\tfor (const jobId of jobIds) {\n\t\t\tassignedJobIds.add(jobId)\n\t\t}\n\t\tconst coordinates = deriveRouteGeometry(route.steps ?? [])\n\t\tconst geometry = buildRouteGeoJson(coordinates)\n\t\ttours.push({\n\t\t\tid: `vrp_tour_${tours.length + 1}`,\n\t\t\tstops,\n\t\t\ttotalWeightKg: totalWeight,\n\t\t\testimatedDistanceKm: metersToKm(route.distance),\n\t\t\testimatedDurationMin: secondsToMinutes(route.duration),\n\t\t\trouteGeoJson: geometry,\n\t\t\twarnings: [],\n\t\t})\n\t}\n\n\tconst unassignedEntries = selectUnassigned(response)\n\tconst unassignedClients: PlannedClient[] = []\n\tfor (const entry of unassignedEntries) {\n\t\tconst jobId = entry.job ?? entry.id\n\t\tif (!jobId) {\n\t\t\tcontinue\n\t\t}\n\t\tconst client = clientByJobId.get(jobId)\n\t\tif (client) {\n\t\t\tunassignedClients.push(client)\n\t\t\twarnings.push(`Client \"${client.name ?? client.id}\" remains unassigned by the solver.`)\n\t\t}\n\t}\n\n\tfor (const client of normalizedClients) {\n\t\tif (!assignedJobIds.has(client.jobId) && !unassignedClients.includes(client)) {\n\t\t\tunassignedClients.push(client)\n\t\t\twarnings.push(`Client \"${client.name ?? client.id}\" has no assigned route in the solver response.`)\n\t\t}\n\t}\n\n\treturn {\n\t\ttours,\n\t\tunassigned: unassignedClients,\n\t\twarnings,\n\t\tcreatedAt: referenceDate,\n\t\tsolver: {\n\t\t\tvehiclesRequested: requestedVehicleCount,\n\t\t\tvehiclesUsed: routes.length,\n\t\t\tcost: optimizationSummary?.cost,\n\t\t\tdistanceKm: metersToKm(optimizationSummary?.distance),\n\t\t\tdurationMin: secondsToMinutes(optimizationSummary?.duration),\n\t\t\tcode: response.code,\n\t\t},\n\t}\n}\n"]}