{"version":3,"sources":["../../src/utils/geolocation.ts"],"sourcesContent":["export type Geolocation = {\n  ip_address?: string;\n  city?: string;\n  country?: string; // ISO 3166-1 alpha-2\n  continent?: string;\n  longitude?: number;\n  latitude?: number;\n  region?: string; //  ISO 3166-2\n  metro_code?: string;\n  postal_code?: string;\n  time_zone?: string;\n};\n\nfunction toNumber(value: string | null): number | undefined {\n  return value ? Number(value) : undefined;\n}\n\n/** reference: https://developers.cloudflare.com/rules/transform/managed-transforms/reference/#add-visitor-location-headers */\nexport function getGeolocationFromCloudflare(r: Request): Geolocation {\n  return {\n    ip_address: r.headers.get('true-client-ip') ?? r.headers.get('cf-connecting-ip') ?? undefined,\n    city: r.headers.get('cf-ipcity') ?? undefined,\n    country: r.headers.get('cf-ipcountry') ?? undefined,\n    continent: r.headers.get('cf-ipcontinent') ?? undefined,\n    longitude: toNumber(r.headers.get('cf-iplongitude')),\n    latitude: toNumber(r.headers.get('cf-iplatitude')),\n    region: r.headers.get('cf-region-code') ?? undefined,\n    metro_code: r.headers.get('cf-metro-code') ?? undefined,\n    postal_code: r.headers.get('cf-postal-code') ?? undefined,\n    time_zone: r.headers.get('cf-timezone') ?? undefined,\n  };\n}\n\n/** reference: https://github.com/vercel/vercel/blob/main/packages/functions/src/headers.ts */\nexport function getGeolocationFromVercel(r: Request): Geolocation {\n  return {\n    ip_address: r.headers.get('x-real-ip') ?? undefined,\n    city: r.headers.get('x-vercel-ip-city') ?? undefined,\n    country: r.headers.get('x-vercel-ip-country') ?? undefined,\n    continent: r.headers.get('x-vercel-ip-continent') ?? undefined,\n    longitude: toNumber(r.headers.get('x-vercel-ip-longitude')),\n    latitude: toNumber(r.headers.get('x-vercel-ip-latitude')),\n    region: r.headers.get('x-vercel-ip-country-region') ?? undefined,\n    postal_code: r.headers.get('x-vercel-ip-postal-code') ?? undefined,\n  };\n}\n\nfunction stripPort(value: string | null): string | null {\n  if (!value) return null;\n  const i = value.lastIndexOf(':');\n  return i !== -1 && /^\\d+$/.test(value.slice(i + 1)) ? value.slice(0, i) : value;\n}\n\n/** reference: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-cloudfront-headers.html#cloudfront-headers-viewer-location */\nexport function getGeolocationFromCloudfront(r: Request): Geolocation {\n  return {\n    ip_address: stripPort(r.headers.get('CloudFront-Viewer-Address')) ?? undefined,\n    city: r.headers.get('CloudFront-Viewer-City') ?? undefined,\n    country: r.headers.get('CloudFront-Viewer-Country') ?? undefined,\n    longitude: toNumber(r.headers.get('CloudFront-Viewer-Longitude')),\n    latitude: toNumber(r.headers.get('CloudFront-Viewer-Latitude')),\n    region: r.headers.get('CloudFront-Viewer-Country-Region') ?? undefined,\n    metro_code: r.headers.get('CloudFront-Viewer-Metro-Code') ?? undefined,\n    postal_code: r.headers.get('CloudFront-Viewer-Postal-Code') ?? undefined,\n    time_zone: r.headers.get('CloudFront-Viewer-Time-Zone') ?? undefined,\n  };\n}\n\nexport function getGeolocation(r: Request): Geolocation {\n  if (r.headers.get('x-vercel-id')) return getGeolocationFromVercel(r);\n  if (r.headers.get('cf-ray')) return getGeolocationFromCloudflare(r);\n  return getGeolocationFromCloudfront(r);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,SAAS,SAAS,OAA0C;AAC1D,SAAO,QAAQ,OAAO,KAAK,IAAI;AACjC;AAGO,SAAS,6BAA6B,GAAyB;AACpE,SAAO;AAAA,IACL,YAAY,EAAE,QAAQ,IAAI,gBAAgB,KAAK,EAAE,QAAQ,IAAI,kBAAkB,KAAK;AAAA,IACpF,MAAM,EAAE,QAAQ,IAAI,WAAW,KAAK;AAAA,IACpC,SAAS,EAAE,QAAQ,IAAI,cAAc,KAAK;AAAA,IAC1C,WAAW,EAAE,QAAQ,IAAI,gBAAgB,KAAK;AAAA,IAC9C,WAAW,SAAS,EAAE,QAAQ,IAAI,gBAAgB,CAAC;AAAA,IACnD,UAAU,SAAS,EAAE,QAAQ,IAAI,eAAe,CAAC;AAAA,IACjD,QAAQ,EAAE,QAAQ,IAAI,gBAAgB,KAAK;AAAA,IAC3C,YAAY,EAAE,QAAQ,IAAI,eAAe,KAAK;AAAA,IAC9C,aAAa,EAAE,QAAQ,IAAI,gBAAgB,KAAK;AAAA,IAChD,WAAW,EAAE,QAAQ,IAAI,aAAa,KAAK;AAAA,EAC7C;AACF;AAGO,SAAS,yBAAyB,GAAyB;AAChE,SAAO;AAAA,IACL,YAAY,EAAE,QAAQ,IAAI,WAAW,KAAK;AAAA,IAC1C,MAAM,EAAE,QAAQ,IAAI,kBAAkB,KAAK;AAAA,IAC3C,SAAS,EAAE,QAAQ,IAAI,qBAAqB,KAAK;AAAA,IACjD,WAAW,EAAE,QAAQ,IAAI,uBAAuB,KAAK;AAAA,IACrD,WAAW,SAAS,EAAE,QAAQ,IAAI,uBAAuB,CAAC;AAAA,IAC1D,UAAU,SAAS,EAAE,QAAQ,IAAI,sBAAsB,CAAC;AAAA,IACxD,QAAQ,EAAE,QAAQ,IAAI,4BAA4B,KAAK;AAAA,IACvD,aAAa,EAAE,QAAQ,IAAI,yBAAyB,KAAK;AAAA,EAC3D;AACF;AAEA,SAAS,UAAU,OAAqC;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,YAAY,GAAG;AAC/B,SAAO,MAAM,MAAM,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI;AAC5E;AAGO,SAAS,6BAA6B,GAAyB;AACpE,SAAO;AAAA,IACL,YAAY,UAAU,EAAE,QAAQ,IAAI,2BAA2B,CAAC,KAAK;AAAA,IACrE,MAAM,EAAE,QAAQ,IAAI,wBAAwB,KAAK;AAAA,IACjD,SAAS,EAAE,QAAQ,IAAI,2BAA2B,KAAK;AAAA,IACvD,WAAW,SAAS,EAAE,QAAQ,IAAI,6BAA6B,CAAC;AAAA,IAChE,UAAU,SAAS,EAAE,QAAQ,IAAI,4BAA4B,CAAC;AAAA,IAC9D,QAAQ,EAAE,QAAQ,IAAI,kCAAkC,KAAK;AAAA,IAC7D,YAAY,EAAE,QAAQ,IAAI,8BAA8B,KAAK;AAAA,IAC7D,aAAa,EAAE,QAAQ,IAAI,+BAA+B,KAAK;AAAA,IAC/D,WAAW,EAAE,QAAQ,IAAI,6BAA6B,KAAK;AAAA,EAC7D;AACF;AAEO,SAAS,eAAe,GAAyB;AACtD,MAAI,EAAE,QAAQ,IAAI,aAAa,EAAG,QAAO,yBAAyB,CAAC;AACnE,MAAI,EAAE,QAAQ,IAAI,QAAQ,EAAG,QAAO,6BAA6B,CAAC;AAClE,SAAO,6BAA6B,CAAC;AACvC;","names":[]}