{"version":3,"sources":["../../src/services/mapSearch.service.ts","../../../../node_modules/@azure/core-auth/src/azureKeyCredential.ts","../../../../node_modules/@azure/core-util/src/uuidUtils.ts","../../../../node_modules/@azure/core-util/src/checkEnvironment.ts","../../src/services/connectors/azure/azureConnector.ts","../../src/helpers/getMapConnector.ts","../../src/helpers/constants.ts","../../src/services/connectors/amazon/amazonConnector.ts"],"names":["v4RandomUUID","_a","_b","_c","_d","backOff"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAqB,mBAArB,MAAsC;AAAA;AAAA;AAAA;AAAA,EAMlC,YAAY,SAA+C,EAAA;AACvD,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAAA;AACrB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,MAAiD,EAAA;AAClE,IAAM,MAAA,EAAE,KAAO,EAAA,YAAA,EAAiB,GAAA,MAAA;AAChC,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,SAAU,CAAA,cAAA;AAAA,MACjC,KAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,SAAU,CAAA,OAAA,EAAS,YAAY,CAAA;AAAA;AAE7D;;;ACpBM,IAAO,qBAAP,MAAyB;;;;AAM7B,EAAA,IAAW,GAAG,GAAA;AACZ,IAAA,OAAO,IAAK,CAAA,IAAA;AACd;;;;;;;AAQA,EAAA,WAAA,CAAY,GAAW,EAAA;AACrB,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,gCAAgC,CAAA;AAClD;AAEA,IAAA,IAAA,CAAK,IAAO,GAAA,GAAA;AACd;;;;;;;;;AAUO,EAAA,MAAA,CAAO,MAAc,EAAA;AAC1B,IAAA,IAAA,CAAK,IAAO,GAAA,MAAA;AACd;;;AC5BA,SAAO,EAAA,GAAA,UAAA,KAAU,QAAV,UAAU,KAAA,MAAA,GAAA,MAAV,GAAA,UAAA,CAAY,MAAM,MAAA,IAAA,IAAA,OAAA,MAAA,GAAA,MAAA,GAAA,EAAE,CAAA,UAAA,CAAA,KAAe,UACtC,GAAA,UAAA,CAAW,OAAO,UAAW,CAAA,IAAA,CAAK,UAAW,CAAA,MAAM,CACnD,GAAAA;;;;;;;AC6BJ,OAAO,IAAA,KAAS,YAChB,QAAO,IAAA,KAAI,QAAJ,IAAI,KAAA,MAAA,GAAA,MAAJ,GAAA,IAAA,CAAM,mBAAkB,UAC9BC,KAAAA,CAAAA,CAAAA,GAAAA,GAAA,KAAK,WAAW,MAAA,IAAA,IAAAA,QAAA,MAAA,GAAA,MAAA,GAAAA,GAAE,CAAA,IAAA,MAAS,kCAC1B,EAAA,GAAA,IAAA,CAAK,iBAAW,IAAA,IAAA,EAAA,KAAA,SAAA,MAAA,GAAA,EAAA,CAAE,UAAS,0BAC3B,IAAA,CAAA,CAAA,EAAA,GAAA,KAAK,WAAW,MAAA,IAAA,IAAA,OAAA,MAAA,GAAA,MAAA,GAAA,GAAE,IAAS,MAAA,yBAAA;AAM7B,OAAO,IAAA,KAAS,WAChB,IAAA,OAAO,IAAK,CAAA,OAAA,KAAY,WACxB,IAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,IAAS,KAAA;AAKV,OAAO,GAAA,KAAQ,WAAe,IAAA,OAAO,IAAI,OAAY,KAAA;AAMxE,OAAO,UAAW,CAAA,OAAA,KAAY,eAC9B,OAAQ,CAAA,UAAA,CAAW,QAAQ,OAAO,CAAA,IAClC,SAAQ,EAAA,GAAA,UAAA,CAAW,QAAQ,QAAQ,MAAA,IAAA,IAAA,OAAA,MAAA,GAAA,MAAA,GAAA,GAAE,IAAI;AC1DpC,IAAM,iBAAN,MAAuE;AAAA,EAG1E,YAAY,iBAAuC,EAAA;AAhBvD,IAAA,IAAAA,GAAAC,EAAAA,GAAAA;AAiBQ,IAAM,MAAA,MAAA,GAAA,CACFA,GAAAD,GAAAA,CAAAA,GAAAA,GAAA,iBAAmB,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAA,MAAA,KAAnB,IAAAA,GAAAA,GAAAA,GAA6B,OAAQ,CAAA,GAAA,CAAI,mBAAzC,KAAA,IAAA,GAAAC,GAAgE,GAAA,EAAA;AACpE,IAAM,MAAA,UAAA,GAAa,IAAI,kBAAA,CAAmB,MAAM,CAAA;AAChD,IAAK,IAAA,CAAA,MAAA,GAAS,mBAAmB,UAAU,CAAA;AAAA;AAC/C;AAAA;AAAA;AAAA,EAKA,MAAM,cACF,CAAA,KAAA,EACA,YACgC,EAAA;AAChC,IAAO,OAAA,MAAM,QAAQ,YAAY;AAC7B,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,IAAK,CAAA,UAAU,EAAE,GAAI,CAAA;AAAA,QACpD,eAAiB,EAAA;AAAA,UACb,KAAO,EAAA,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAA;AAAA,UAChC,GAAK,EAAA,CAAA;AAAA,UACL,IAAM,EAAA;AAAA;AACV,OACH,CAAA;AAED,MAAI,IAAA,YAAA,CAAa,QAAQ,CAAG,EAAA;AACxB,QAAM,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAAA;AAGzD,MAAA,OAAO,QAAS,CAAA,IAAA;AAAA,KACnB,CAAA;AAAA;AACL;AAAA;AAAA;AAAA,EAKA,SAAA,CACI,SACA,YACa,EAAA;AArDrB,IAAAD,IAAAA,GAAAA,EAAAC,GAAAC,EAAAA,GAAAA,EAAAC,GAAA,EAAA,EAAA,EAAA,EAAA;AAsDQ,IAAA,MAAM,KAAQH,GAAAA,CAAAA,GAAAA,GAAA,OAAQ,CAAA,QAAA,KAAR,gBAAAA,GAAmB,CAAA,CAAA,CAAA;AACjC,IAAI,IAAA,CAAC,KAAO,EAAA,OAAO,EAAC;AACpB,IAAM,MAAA,EAAE,QAAU,EAAA,UAAA,EAAe,GAAA,KAAA;AACjC,IAAA,MAAM,UAAU,UAAY,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,OAAA;AAE5B,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,YAAA;AAAA,MACN,OAASC,EAAAA,CAAAA,GAAAA,GAAA,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,aAAA,KAAT,gBAAAA,GAAwB,CAAA,GAAA;AAAA,MACjC,QAAU,EAAA;AAAA,QACN,IAAM,EAAA,OAAA;AAAA,QACN,WAAA,EAAA,CAAa,QAAU,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,WAAA,KAAe;AAAC,OAC3C;AAAA,MACA,OAAO,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,gBAAA;AAAA,MAChB,cAAc,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,QAAA;AAAA,MACvB,YAAY,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,UAAA;AAAA,MACrB,MAAA,EAAA,CAAQE,OAAAD,GAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,mBAAT,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAA0B,CAA1B,CAAA,KAAA,IAAA,GAAA,MAAA,GAAAC,GAA8B,CAAA,SAAA;AAAA,MACtC,QAAQ,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,WAAA;AAAA,MACjB,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,cAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAA0B,OAA1B,IAA8B,GAAA,MAAA,GAAA,EAAA,CAAA,SAAA;AAAA,MACzC,UAAA,EAAA,CAAY,KAAO,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,IAAA,KAAQ;AAAC,KAChC;AAAA;AAER;;;ACjEO,SAAS,eAAsD,GAAA;AAClE,EAAM,MAAA,QAAA,GAAW,QAAQ,GAAI,CAAA,cAAA;AAE7B,EAAA,QAAQ,QAAU;AAAA,IACd,KAAK,eAAgB,CAAA,MAAA;AACjB,MAAA,OAAO,IAAI,eAAgB,EAAA;AAAA,IAC/B,KAAK,eAAgB,CAAA,KAAA;AACjB,MAAA,OAAO,IAAI,cAAe,EAAA;AAAA,IAC9B;AACI,MAAM,MAAA,IAAI,MAAM,sBAAsB,CAAA;AAAA;AAElD;;;ACpBO,IAAM,mBAAsB,GAAA;AAE5B,IAAM,eAAkB,GAAA;AAAA,EAC3B,MAAQ,EAAA,KAAA;AAAA,EACR,KAAO,EAAA,OAAA;AAAA,EACP,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACZ;AAEO,IAAM,qBAAwB,GAAA;AAAA,EACjC,MAAQ,EAAA;AAAA,IACJ,OAAS,EAAA,aAAA;AAAA,IACT,KAAO,EAAA,YAAA;AAAA,IACP,MAAQ,EAAA,eAAA;AAAA,IACR,IAAM,EAAA,kBAAA;AAAA,IACN,WAAa,EAAA,gBAAA;AAAA,IACb,MAAQ,EAAA;AAAA,MACJ,aAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA;AACJ,GACJ;AAAA,EACA,MAAQ,EAAA;AAAA,IACJ,OAAS,EAAA,SAAA;AAAA,IACT,KAAO,EAAA,QAAA;AAAA,IACP,MAAQ,EAAA,UAAA;AAAA,IACR,IAAM,EAAA,OAAA;AAAA,IACN,WAAa,EAAA,UAAA;AAAA,IACb,MAAQ,EAAA;AAAA;AAEhB;ACrBO,IAAM,kBAAN,MAEP;AAAA,EAGI,YAAY,iBAAmD,EAAA;AAhBnE,IAAAH,IAAAA,GAAAA;AAiBQ,IAAA,MAAM,UACFA,GAAA,GAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAmB,WAAnB,IAAAA,GAAAA,GAAAA,GAA6B,QAAQ,GAAI,CAAA,sBAAA;AAC7C,IAAK,IAAA,CAAA,MAAA,GAAS,IAAI,QAAS,CAAA,cAAA,CAAA;AAAA,MACvB,MAAA;AAAA,MACA,aAAa,eAAgB;AAAA,KACzB,EAAA,iBAAA,IAAA,IAAA,GAAA,iBAAA,GAAqB,EAC5B,CAAA,CAAA;AAAA;AACL;AAAA;AAAA;AAAA,EAKA,MAAM,cACF,CAAA,KAAA,EACA,YAC6C,EAAA;AAC7C,IAAA,YAAA,GAAe,YAAgB,IAAA,IAAA,GAAA,YAAA,GAAA,SAAA;AAC/B,IAAI,IAAA,SAAA,GAAY,qBAAsB,CAAA,MAAA,CAAO,YAAY,CAAA;AACzD,IAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,SAAS,CAAG,EAAA;AAC3B,MAAA,SAAA,GAAY,CAAC,SAAS,CAAA;AAAA;AAG1B,IAAA,OAAO,MAAMI,OAAAA;AAAA,MAAQ,MACjB,IAAK,CAAA,MAAA,CAAO,uBAAwB,CAAA;AAAA,QAChC,SAAW,EAAA,mBAAA;AAAA,QACX,IAAM,EAAA,KAAA;AAAA,QACN,gBAAA,EACI,YAAiB,KAAA,aAAA,GAAgB,MAAY,GAAA,SAAA;AAAA,QACjD,UAAY,EAAA;AAAA,OACf;AAAA,KACL;AAAA;AACJ;AAAA;AAAA;AAAA,EAKA,SAAA,CACI,SACA,YACa,EAAA;AAxDrB,IAAA,IAAAJ,GAAAC,EAAAA,GAAAA;AAyDQ,IAAA,MAAM,UAAU,OAAQ,CAAA,OAAA;AACxB,IAAA,MAAM,UAAU,OAAQ,CAAA,OAAA;AACxB,IAAA,MAAM,KAAQD,GAAAA,CAAAA,GAAAA,GAAA,OAAU,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA,CAAA,CAAA,KAAV,gBAAAA,GAAc,CAAA,KAAA;AAC5B,IAAI,IAAA,CAAC,KAAO,EAAA,OAAO,EAAC;AAEpB,IAAO,OAAA;AAAA,MACH,IAAM,EAAA,YAAA;AAAA,MACN,SAAS,KAAM,CAAA,OAAA;AAAA,MACf,QAAU,EAAA;AAAA,QACN,IAAM,EAAA,OAAA;AAAA,QACN,eAAaC,GAAA,GAAA,KAAA,CAAM,aAAN,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAgB,UAAS;AAAC,OAC3C;AAAA,MACA,OAAO,KAAM,CAAA,KAAA;AAAA,MACb,cAAc,KAAM,CAAA,YAAA;AAAA,MACpB,YAAY,KAAM,CAAA,UAAA;AAAA,MAClB,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,QAAQ,CAAG,EAAA,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,MAAM,aAAa,CAAA,CAAA;AAAA,MAC9C,WAAW,KAAM,CAAA,SAAA;AAAA,MACjB,YAAY,OAAS,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAA;AAAA,KACzB;AAAA;AAER","file":"index.mjs","sourcesContent":["import { IMapConnector } from '@map/interfaces';\nimport {\n    GeocodeResult,\n    IMapConnectorTInput,\n    MapSearchParams,\n} from '@map/types';\n\nexport default class MapSearchService {\n    private readonly connector: IMapConnector<IMapConnectorTInput>;\n\n    /**\n     * @param connector - A connector that implements the MapConnector interface.\n     */\n    constructor(connector: IMapConnector<IMapConnectorTInput>) {\n        this.connector = connector;\n    }\n\n    /**\n     * Forward geocode using the injected connector.\n     * Note: It returns the best match according to params.\n     */\n    async forwardGeocode(params: MapSearchParams): Promise<GeocodeResult> {\n        const { query, locationType } = params;\n        const rawData = await this.connector.forwardGeocode(\n            query,\n            locationType,\n        );\n        return this.connector.transform(rawData, locationType);\n    }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { KeyCredential } from \"./keyCredential.js\";\n\n/**\n * A static-key-based credential that supports updating\n * the underlying key value.\n */\nexport class AzureKeyCredential implements KeyCredential {\n  private _key: string;\n\n  /**\n   * The value of the key to be used in authentication\n   */\n  public get key(): string {\n    return this._key;\n  }\n\n  /**\n   * Create an instance of an AzureKeyCredential for use\n   * with a service client.\n   *\n   * @param key - The initial value of the key to use in authentication\n   */\n  constructor(key: string) {\n    if (!key) {\n      throw new Error(\"key must be a non-empty string\");\n    }\n\n    this._key = key;\n  }\n\n  /**\n   * Change the value of the key.\n   *\n   * Updates will take effect upon the next request after\n   * updating the key value.\n   *\n   * @param newKey - The new key value to be used\n   */\n  public update(newKey: string): void {\n    this._key = newKey;\n  }\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { randomUUID as v4RandomUUID } from \"crypto\";\n\ninterface Crypto {\n  randomUUID(): string;\n}\n\ndeclare const globalThis: {\n  crypto: Crypto;\n};\n\n// NOTE: This is a workaround until we can use `globalThis.crypto.randomUUID` in Node.js 19+.\nconst uuidFunction =\n  typeof globalThis?.crypto?.randomUUID === \"function\"\n    ? globalThis.crypto.randomUUID.bind(globalThis.crypto)\n    : v4RandomUUID;\n\n/**\n * Generated Universally Unique Identifier\n *\n * @returns RFC4122 v4 UUID.\n */\nexport function randomUUID(): string {\n  return uuidFunction();\n}\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\ninterface Window {\n  document: unknown;\n}\n\ninterface DedicatedWorkerGlobalScope {\n  constructor: {\n    name: string;\n  };\n\n  importScripts: (...paths: string[]) => void;\n}\n\ninterface Navigator {\n  product: string;\n}\n\ninterface DenoGlobal {\n  version: {\n    deno: string;\n  };\n}\n\ninterface BunGlobal {\n  version: string;\n}\n\n// eslint-disable-next-line @azure/azure-sdk/ts-no-window\ndeclare const window: Window;\ndeclare const self: DedicatedWorkerGlobalScope;\ndeclare const Deno: DenoGlobal;\ndeclare const Bun: BunGlobal;\ndeclare const navigator: Navigator;\n\n/**\n * A constant that indicates whether the environment the code is running is a Web Browser.\n */\n// eslint-disable-next-line @azure/azure-sdk/ts-no-window\nexport const isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n\n/**\n * A constant that indicates whether the environment the code is running is a Web Worker.\n */\nexport const isWebWorker =\n  typeof self === \"object\" &&\n  typeof self?.importScripts === \"function\" &&\n  (self.constructor?.name === \"DedicatedWorkerGlobalScope\" ||\n    self.constructor?.name === \"ServiceWorkerGlobalScope\" ||\n    self.constructor?.name === \"SharedWorkerGlobalScope\");\n\n/**\n * A constant that indicates whether the environment the code is running is Deno.\n */\nexport const isDeno =\n  typeof Deno !== \"undefined\" &&\n  typeof Deno.version !== \"undefined\" &&\n  typeof Deno.version.deno !== \"undefined\";\n\n/**\n * A constant that indicates whether the environment the code is running is Bun.sh.\n */\nexport const isBun = typeof Bun !== \"undefined\" && typeof Bun.version !== \"undefined\";\n\n/**\n * A constant that indicates whether the environment the code is running is a Node.js compatible environment.\n */\nexport const isNodeLike =\n  typeof globalThis.process !== \"undefined\" &&\n  Boolean(globalThis.process.version) &&\n  Boolean(globalThis.process.versions?.node);\n\n/**\n * A constant that indicates whether the environment the code is running is a Node.js compatible environment.\n * @deprecated Use `isNodeLike` instead.\n */\nexport const isNode = isNodeLike;\n\n/**\n * A constant that indicates whether the environment the code is running is Node.JS.\n */\nexport const isNodeRuntime = isNodeLike && !isBun && !isDeno;\n\n/**\n * A constant that indicates whether the environment the code is running is in React-Native.\n */\n// https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js\nexport const isReactNative =\n  typeof navigator !== \"undefined\" && navigator?.product === \"ReactNative\";\n","import createSearchClient, {\n    isUnexpected,\n    GeocodingResponseOutput,\n} from '@azure-rest/maps-search';\nimport { AzureKeyCredential } from '@azure/core-auth';\nimport { backOff } from 'exponential-backoff';\nimport { IMapConnector } from '@map/interfaces';\nimport { GeocodeResult, LocationMap } from '@map/types';\n\ntype AuthConfiguration = {\n    apiKey?: string;\n};\n\nexport class AzureConnector implements IMapConnector<GeocodingResponseOutput> {\n    private readonly client: ReturnType<typeof createSearchClient>;\n\n    constructor(authConfiguration?: AuthConfiguration) {\n        const apiKey =\n            authConfiguration?.apiKey ?? process.env.MAP_SERVICE_API_KEY ?? '';\n        const credential = new AzureKeyCredential(apiKey);\n        this.client = createSearchClient(credential);\n    }\n\n    /**\n     * Azure Location forward geocode method\n     */\n    async forwardGeocode(\n        query: string,\n        locationType?: keyof LocationMap,\n    ): Promise<GeocodingResponseOutput> {\n        return await backOff(async () => {\n            const response = await this.client.path('/geocode').get({\n                queryParameters: {\n                    query: `${query} (${locationType})`,\n                    top: 1,\n                    view: 'Unified',\n                },\n            });\n\n            if (isUnexpected(response)) {\n                throw new Error('Failed to fetch Azure geocode data.');\n            }\n\n            return response.body;\n        });\n    }\n\n    /**\n     * Transform Azure Location response to map search response\n     */\n    transform(\n        rawData: GeocodingResponseOutput,\n        locationType: keyof LocationMap,\n    ): GeocodeResult {\n        const place = rawData.features?.[0];\n        if (!place) return {};\n        const { geometry, properties } = place;\n        const address = properties?.address;\n\n        return {\n            type: locationType,\n            country: address?.countryRegion?.ISO,\n            geometry: {\n                type: 'Point',\n                coordinates: geometry?.coordinates || [],\n            },\n            label: address?.formattedAddress,\n            municipality: address?.locality,\n            postalcode: address?.postalCode,\n            region: address?.adminDistricts?.[0]?.shortName,\n            street: address?.addressLine,\n            subregion: address?.adminDistricts?.[1]?.shortName,\n            resultbbox: place?.bbox || [],\n        };\n    }\n}\n","import { CLOUD_PROVIDERS } from '@map/helpers';\nimport { IMapConnector } from '@map/interfaces';\nimport { AmazonConnector } from '@map/services/connectors/amazon';\nimport { AzureConnector } from '@map/services/connectors/azure';\nimport { IMapConnectorTInput } from '@map/types';\n\n/**\n * Get map connector instance from environment variables.\n * @returns IMapConnector\n */\nexport function getMapConnector(): IMapConnector<IMapConnectorTInput> {\n    const provider = process.env.PLATFORM_CLOUD;\n\n    switch (provider) {\n        case CLOUD_PROVIDERS.AMAZON:\n            return new AmazonConnector();\n        case CLOUD_PROVIDERS.AZURE:\n            return new AzureConnector();\n        default:\n            throw new Error('Unsupported provider');\n    }\n}\n","// Amazon Location's place index\nexport const LOCATION_INDEX_NAME = 'Qrvey_LocationIndex';\n// Map services providers\nexport const CLOUD_PROVIDERS = {\n    AMAZON: 'AWS',\n    AZURE: 'AZURE',\n    GOOGLE: 'GOOGLE',\n    MAPBOX: 'MAPBOX',\n};\n// Mapping between UI's geo-properties and provider's\nexport const GEOPROPERTIES_MAPPING = {\n    AMAZON: {\n        country: 'CountryType',\n        state: 'RegionType',\n        county: 'SubRegionType',\n        city: 'MunicipalityType',\n        postal_code: 'PostalCodeType',\n        street: [\n            'AddressType',\n            'StreetType',\n            'IntersectionType',\n            'PointOfInterestType',\n        ],\n    },\n    MAPBOX: {\n        country: 'country',\n        state: 'region',\n        county: 'district',\n        city: 'place',\n        postal_code: 'postcode',\n        street: 'address',\n    },\n};\n","import {\n    Location,\n    LocationClientConfig,\n    SearchPlaceIndexForTextCommandOutput,\n} from '@aws-sdk/client-location';\nimport { backOff } from 'exponential-backoff';\nimport { LOCATION_INDEX_NAME, GEOPROPERTIES_MAPPING } from '@map/helpers';\nimport { IMapConnector } from '@map/interfaces';\nimport { LocationMap, GeocodeResult } from '@map/types';\nimport { defaultProvider } from '@aws-sdk/credential-provider-node';\n\nexport class AmazonConnector\n    implements IMapConnector<SearchPlaceIndexForTextCommandOutput>\n{\n    private readonly client: Location;\n\n    constructor(authConfiguration?: Partial<LocationClientConfig>) {\n        const region =\n            authConfiguration?.region ?? process.env.AMAZON_LOCATION_REGION;\n        this.client = new Location({\n            region,\n            credentials: defaultProvider(),\n            ...(authConfiguration ?? {}),\n        });\n    }\n\n    /**\n     * Amazon Location forward geocode method\n     */\n    async forwardGeocode(\n        query: string,\n        locationType?: keyof LocationMap,\n    ): Promise<SearchPlaceIndexForTextCommandOutput> {\n        locationType = locationType ?? 'country';\n        let placeType = GEOPROPERTIES_MAPPING.AMAZON[locationType];\n        if (!Array.isArray(placeType)) {\n            placeType = [placeType];\n        }\n\n        return await backOff(() =>\n            this.client.searchPlaceIndexForText({\n                IndexName: LOCATION_INDEX_NAME,\n                Text: query,\n                FilterCategories:\n                    locationType === 'postal_code' ? undefined : placeType,\n                MaxResults: 1,\n            }),\n        );\n    }\n\n    /**\n     * Transform Amazon Location response to map search response\n     */\n    transform(\n        rawData: SearchPlaceIndexForTextCommandOutput,\n        locationType: keyof LocationMap,\n    ): GeocodeResult {\n        const results = rawData.Results;\n        const Summary = rawData.Summary;\n        const place = results?.[0]?.Place;\n        if (!place) return {};\n\n        return {\n            type: locationType,\n            country: place.Country,\n            geometry: {\n                type: 'Point',\n                coordinates: place.Geometry?.Point || [],\n            },\n            label: place.Label,\n            municipality: place.Municipality,\n            postalcode: place.PostalCode,\n            region: place.Region,\n            street: `${place.Street} ${place.AddressNumber}`,\n            subregion: place.SubRegion,\n            resultbbox: Summary?.ResultBBox,\n        };\n    }\n}\n"]}