{"version":3,"file":"geolocation.cjs","names":[],"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,SAAS,SAAS,OAA0C;CAC1D,OAAO,QAAQ,OAAO,KAAK,IAAI,KAAA;AACjC;;AAGA,SAAgB,6BAA6B,GAAyB;CACpE,OAAO;EACL,YAAY,EAAE,QAAQ,IAAI,gBAAgB,KAAK,EAAE,QAAQ,IAAI,kBAAkB,KAAK,KAAA;EACpF,MAAM,EAAE,QAAQ,IAAI,WAAW,KAAK,KAAA;EACpC,SAAS,EAAE,QAAQ,IAAI,cAAc,KAAK,KAAA;EAC1C,WAAW,EAAE,QAAQ,IAAI,gBAAgB,KAAK,KAAA;EAC9C,WAAW,SAAS,EAAE,QAAQ,IAAI,gBAAgB,CAAC;EACnD,UAAU,SAAS,EAAE,QAAQ,IAAI,eAAe,CAAC;EACjD,QAAQ,EAAE,QAAQ,IAAI,gBAAgB,KAAK,KAAA;EAC3C,YAAY,EAAE,QAAQ,IAAI,eAAe,KAAK,KAAA;EAC9C,aAAa,EAAE,QAAQ,IAAI,gBAAgB,KAAK,KAAA;EAChD,WAAW,EAAE,QAAQ,IAAI,aAAa,KAAK,KAAA;CAC7C;AACF;;AAGA,SAAgB,yBAAyB,GAAyB;CAChE,OAAO;EACL,YAAY,EAAE,QAAQ,IAAI,WAAW,KAAK,KAAA;EAC1C,MAAM,EAAE,QAAQ,IAAI,kBAAkB,KAAK,KAAA;EAC3C,SAAS,EAAE,QAAQ,IAAI,qBAAqB,KAAK,KAAA;EACjD,WAAW,EAAE,QAAQ,IAAI,uBAAuB,KAAK,KAAA;EACrD,WAAW,SAAS,EAAE,QAAQ,IAAI,uBAAuB,CAAC;EAC1D,UAAU,SAAS,EAAE,QAAQ,IAAI,sBAAsB,CAAC;EACxD,QAAQ,EAAE,QAAQ,IAAI,4BAA4B,KAAK,KAAA;EACvD,aAAa,EAAE,QAAQ,IAAI,yBAAyB,KAAK,KAAA;CAC3D;AACF;AAEA,SAAS,UAAU,OAAqC;CACtD,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,IAAI,MAAM,YAAY,GAAG;CAC/B,OAAO,MAAM,MAAM,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI;AAC5E;;AAGA,SAAgB,6BAA6B,GAAyB;CACpE,OAAO;EACL,YAAY,UAAU,EAAE,QAAQ,IAAI,2BAA2B,CAAC,KAAK,KAAA;EACrE,MAAM,EAAE,QAAQ,IAAI,wBAAwB,KAAK,KAAA;EACjD,SAAS,EAAE,QAAQ,IAAI,2BAA2B,KAAK,KAAA;EACvD,WAAW,SAAS,EAAE,QAAQ,IAAI,6BAA6B,CAAC;EAChE,UAAU,SAAS,EAAE,QAAQ,IAAI,4BAA4B,CAAC;EAC9D,QAAQ,EAAE,QAAQ,IAAI,kCAAkC,KAAK,KAAA;EAC7D,YAAY,EAAE,QAAQ,IAAI,8BAA8B,KAAK,KAAA;EAC7D,aAAa,EAAE,QAAQ,IAAI,+BAA+B,KAAK,KAAA;EAC/D,WAAW,EAAE,QAAQ,IAAI,6BAA6B,KAAK,KAAA;CAC7D;AACF;AAEA,SAAgB,eAAe,GAAyB;CACtD,IAAI,EAAE,QAAQ,IAAI,aAAa,GAAG,OAAO,yBAAyB,CAAC;CACnE,IAAI,EAAE,QAAQ,IAAI,QAAQ,GAAG,OAAO,6BAA6B,CAAC;CAClE,OAAO,6BAA6B,CAAC;AACvC"}