{"version":3,"file":"get-service-region-config.mjs","sources":["../../src/region-config/countries.ts","../../src/region-config/regions.ts","../../src/region-config/stage.ts","../../src/region-config/get-service-region-config.ts"],"sourcesContent":["/**\n * Country codes routed to the EU regional API.\n *\n * Source: https://confluence.mercedes-benz.io/x/tAeZIw\n */\n// source https://confluence.mercedes-benz.io/x/tAeZIw\nexport const COUNTRIES_EU = new Set([\n  'DE',\n  'SE',\n  'AT',\n  'BE',\n  'CH',\n  'CZ',\n  'DK',\n  'SK',\n  'ES',\n  'FR',\n  'HU',\n  'IT',\n  'LU',\n  'NL',\n  'PL',\n  'PT',\n  'RO',\n]);\n\n/**\n * Country codes routed to the AP regional API.\n *\n * Source: https://confluence.mercedes-benz.io/x/tAeZIw\n */\n// source https://confluence.mercedes-benz.io/x/tAeZIw\nexport const COUNTRIES_AP = new Set([\n  'SG',\n  'AU',\n  'ID',\n  'IN',\n  'JP',\n  'KR',\n  'MY',\n  'NZ',\n  'TH',\n  'TR',\n  'VN',\n  'EG',\n  'ZA',\n  'BR',\n]);\n\n/**\n * Country codes routed to the NA regional API.\n *\n * Source: https://confluence.mercedes-benz.io/x/tAeZIw\n */\n// source https://confluence.mercedes-benz.io/x/tAeZIw\nexport const COUNTRIES_NA = new Set(['US', 'CA', 'MX']);\n","/**\n * Supported service regions used for country-based routing.\n */\nexport const REGION = {\n  EU: 'EU',\n  AP: 'AP',\n  NA: 'NA',\n} as const;\n\n/**\n * Region identifiers used by the routing lookup map.\n */\nexport type Region = (typeof REGION)[keyof typeof REGION];\n\n/**\n * Returns the first region whose configured country set contains the provided\n * country code.\n */\nexport function findRegionForCountry(country: string, regionCountryMap: Map<Region, Set<string>>): Region | undefined {\n  for (const [region, countries] of regionCountryMap.entries()) {\n    if (countries.has(country)) {\n      return region;\n    }\n  }\n  return undefined;\n}\n","/**\n * Canonical OneWeb stage identifiers used by region-config helpers.\n */\nexport const STAGE = {\n  LOCAL: 'local',\n  DEVELOP: 'dev',\n  TEST: 'test',\n  INT: 'int',\n  PPROD: 'pprod',\n  PROD: 'prod',\n} as const;\n\n/**\n * Supported normalized deployment stage values.\n */\nexport type Stage = (typeof STAGE)[keyof typeof STAGE];\n\n/**\n * Default OneWeb API base URLs keyed by normalized stage family.\n */\nexport const BASE_API_URLS = {\n  DEV: 'https://dev.api.oneweb.mercedes-benz.com',\n  INT: 'https://int.api.oneweb.mercedes-benz.com',\n  PROD: 'https://api.oneweb.mercedes-benz.com',\n} as const;\n\n/**\n * Checks whether a string is one of the supported normalized stage values.\n */\nexport function isStage(value: string): value is Stage {\n  return Object.values(STAGE).includes(value as Stage);\n}\n\n/**\n * Normalizes a stage string to lowercase and validates it against the supported\n * stage set.\n *\n * @param value Stage value from AEM or other runtime configuration.\n * @returns The normalized stage.\n * @throws When the provided stage is not supported.\n */\nexport function normalizeStage(value: string): Stage {\n  const normalized = value.toLowerCase();\n  if (!isStage(normalized)) {\n    throw new Error(`Invalid stage: \"${value}\". Expected one of: ${Object.values(STAGE).join(', ')}`);\n  }\n  return normalized;\n}\n","import { getEnvironmentData } from '@/utilities';\n\nimport { COUNTRIES_AP, COUNTRIES_EU, COUNTRIES_NA } from './countries';\nimport { REGION, type Region, findRegionForCountry } from './regions';\nimport { BASE_API_URLS, STAGE, type Stage, normalizeStage } from './stage';\n\ntype ServiceRoutingMap = {\n  stageUrls: Record<Stage, string>;\n  regionCountryMap: Map<Region, Set<string>>;\n};\n\nconst REGION_COUNTRY_MAP = new Map<Region, Set<string>>([\n  [REGION.EU, COUNTRIES_EU],\n  [REGION.AP, COUNTRIES_AP],\n  [REGION.NA, COUNTRIES_NA],\n]);\n\n/**\n * Resolved service endpoint together with the normalized environment context\n * used to produce it.\n */\nexport type ServiceRegionConfig = {\n  serviceUrl: string;\n  country: string;\n  stage: string;\n};\n\n/**\n * Resolves the most appropriate service base URL for the current AEM country\n * and stage.\n *\n * Resolution order:\n * 1. Stage-based OneWeb base URL when the current stage is explicitly unsupported\n * 2. Region-specific AEM API URL such as `apiUrlEU`\n * 3. Generic AEM `apiUrl`\n *\n * The returned `stage` value is normalized to the canonical lowercase stage.\n *\n * @param serviceName Service path segment appended to the resolved base URL.\n * @param unsupportedStages Stages that should bypass AEM API URLs and use the built-in stage routing.\n * @throws When the required AEM config is missing or no service URL can be resolved.\n */\nexport async function getServiceRegionConfig(\n  serviceName: string,\n  unsupportedStages: Stage[] = [],\n): Promise<ServiceRegionConfig> {\n  const { pageEnvironmentVariables, environmentVariables } = await getEnvironmentData(COMPONENT_NAME);\n  const { country, stage } = pageEnvironmentVariables;\n  const { apiUrl } = environmentVariables;\n\n  if (!isNonEmptyString(country) || !isNonEmptyString(stage)) {\n    throw new Error('Missing required AEM config: country and stage are required to resolve a service URL');\n  }\n\n  const normalizedCountry = normalizeCountry(country);\n  const currentStage = normalizeStage(stage);\n  const { stageUrls, regionCountryMap } = getServiceRoutingMap(serviceName);\n\n  const serviceUrl = stageUrls[currentStage];\n\n  if (unsupportedStages.includes(currentStage)) {\n    return createServiceConfig(serviceUrl, country, currentStage);\n  }\n\n  const region = findRegionForCountry(normalizedCountry, regionCountryMap);\n  if (region) {\n    // Dynamically access region-specific API URL like `apiUrlEU`, `apiUrlAP`, etc.\n    const regionalApiUrl = environmentVariables[`apiUrl${region}` as keyof typeof environmentVariables];\n    if (regionalApiUrl) {\n      return createServiceConfig(`${regionalApiUrl}/${serviceName}`, country, currentStage);\n    }\n  }\n\n  if (apiUrl) {\n    return createServiceConfig(`${apiUrl}/${serviceName}`, country, currentStage);\n  }\n\n  throw new Error(`Unable to resolve service URL for country \"${country}\" and stage \"${stage}\"`);\n}\n\nfunction createServiceConfig(serviceUrl: string, country: string, stage: Stage): ServiceRegionConfig {\n  return { serviceUrl, country, stage };\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n  return typeof value === 'string' && value.length > 0;\n}\n\nfunction normalizeCountry(value: string): string {\n  return value.trim().toUpperCase();\n}\n\n/**\n * Creates the stage and country lookup tables used during service URL resolution.\n */\nfunction getServiceRoutingMap(serviceName: string): ServiceRoutingMap {\n  const devUrl = `${BASE_API_URLS.DEV}/${serviceName}`;\n  const intUrl = `${BASE_API_URLS.INT}/${serviceName}`;\n  const prodUrl = `${BASE_API_URLS.PROD}/${serviceName}`;\n\n  const stageUrls: Record<Stage, string> = {\n    [STAGE.LOCAL]: devUrl,\n    [STAGE.DEVELOP]: devUrl,\n    [STAGE.TEST]: intUrl,\n    [STAGE.INT]: intUrl,\n    [STAGE.PPROD]: intUrl,\n    [STAGE.PROD]: prodUrl,\n  };\n\n  return {\n    stageUrls,\n    regionCountryMap: REGION_COUNTRY_MAP,\n  };\n}\n"],"names":["COUNTRIES_EU","COUNTRIES_AP","COUNTRIES_NA","REGION","findRegionForCountry","country","regionCountryMap","region","countries","STAGE","BASE_API_URLS","isStage","value","normalizeStage","normalized","REGION_COUNTRY_MAP","getServiceRegionConfig","serviceName","unsupportedStages","pageEnvironmentVariables","environmentVariables","getEnvironmentData","stage","apiUrl","isNonEmptyString","normalizedCountry","normalizeCountry","currentStage","stageUrls","getServiceRoutingMap","serviceUrl","createServiceConfig","regionalApiUrl","devUrl","intUrl","prodUrl"],"mappings":"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"}