{"version":3,"file":"domain-transformer.mjs","sources":["../../../../../../lib/utils/domain-transformer.ts"],"sourcesContent":["import {ConfigInterface} from '../base-types';\nimport {logger} from '../logger';\n\n/**\n * Applies configured domain transformations to a shop URL.\n * Returns transformed domain or original if no transformation matches.\n *\n * @param shopUrl - The shop URL to transform\n * @param config - Configuration object containing domain transformations\n * @returns Transformed shop URL or original if no transformation matches\n *\n * @example\n * const config = {\n *   domainTransformations: [{\n *     match: /^([a-zA-Z0-9-_]+)\\.my\\.shop\\.dev$/,\n *     transform: '$1.dev-api.shop.dev'\n *   }]\n * };\n * applyDomainTransformations('shop1.my.shop.dev', config);\n * // Returns: 'shop1.dev-api.shop.dev'\n */\nexport function applyDomainTransformations(\n  shopUrl: string,\n  config: ConfigInterface,\n): string | null {\n  if (\n    !config.domainTransformations ||\n    config.domainTransformations.length === 0\n  ) {\n    return shopUrl;\n  }\n\n  for (const transformation of config.domainTransformations) {\n    const regex =\n      typeof transformation.match === 'string'\n        ? new RegExp(transformation.match)\n        : transformation.match;\n\n    const matches = shopUrl.match(regex);\n\n    if (!matches) {\n      continue;\n    }\n\n    if (typeof transformation.transform === 'function') {\n      return transformation.transform(matches);\n    }\n\n    let result = transformation.transform;\n    matches.forEach((match, index) => {\n      result = result.replace(new RegExp(`\\\\$${index}`, 'g'), match || '');\n    });\n\n    return result;\n  }\n\n  return shopUrl;\n}\n\n/**\n * Extracts all domains (source and target) from transformations for validation.\n * Uses heuristics to extract domain patterns from regex source.\n *\n * **Supported regex patterns:**\n * - Simple literal domains with escaped dots: `\\.example\\.com`\n * - Patterns with anchors: `^([a-zA-Z0-9-_]+)\\.example\\.com$`\n * - Character classes in subdomains: `^[a-z0-9-]+\\.example\\.com$`\n *\n * **Unsupported regex patterns:**\n * - Optional groups: `(\\.staging)?\\.example\\.com$` - May not extract correctly\n * - Character classes in domain part: `\\.api[0-9]\\.example\\.com$` - May not extract correctly\n * - Complex alternations: `\\.(dev|staging)\\.example\\.com$` - May not extract correctly\n * - Nested groups in domain part - May not extract correctly\n *\n * When using unsupported patterns, domain extraction will fail and be logged at debug level.\n *\n * @param config - Configuration object containing domain transformations\n * @returns Array of domain regex patterns\n *\n * @example\n * const config = {\n *   domainTransformations: [{\n *     match: /^([a-zA-Z0-9-_]+)\\.my\\.shop\\.dev$/,\n *     transform: '$1.dev-api.shop.dev'\n *   }]\n * };\n * getTransformationDomains(config);\n * // Returns: ['my\\\\.shop\\\\.dev', 'dev-api\\\\.shop\\\\.dev']\n */\nexport function getTransformationDomains(config: ConfigInterface): string[] {\n  const domains: string[] = [];\n  const log = logger(config);\n\n  if (!config.domainTransformations) {\n    return domains;\n  }\n\n  const transformations = config.domainTransformations;\n\n  for (const transformation of transformations) {\n    const regex =\n      typeof transformation.match === 'string'\n        ? new RegExp(transformation.match)\n        : transformation.match;\n\n    const domainPattern = regex.source.match(/\\\\\\.([\\\\.\\w-]+)\\$?$/);\n\n    if (domainPattern) {\n      domains.push(domainPattern[1]);\n    } else {\n      log.debug(\n        `Failed to extract domain pattern from regex: ${regex.source}. This may indicate an unsupported regex pattern (e.g., optional groups, character classes in domain part, complex alternations).`,\n      );\n    }\n\n    if (typeof transformation.transform !== 'string') {\n      continue;\n    }\n\n    const templateDomainMatch =\n      transformation.transform.match(/\\$\\d+\\.([.\\w-]+)$/);\n\n    if (templateDomainMatch) {\n      const escapedDomain = templateDomainMatch[1].replace(/\\./g, '\\\\.');\n      domains.push(escapedDomain);\n    }\n  }\n\n  return domains;\n}\n"],"names":[],"mappings":";;AAGA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,0BAA0B,CACxC,OAAe,EACf,MAAuB,EAAA;IAEvB,IACE,CAAC,MAAM,CAAC,qBAAqB;AAC7B,QAAA,MAAM,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EACzC;AACA,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,qBAAqB,EAAE;AACzD,QAAA,MAAM,KAAK,GACT,OAAO,cAAc,CAAC,KAAK,KAAK;AAC9B,cAAE,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK;AACjC,cAAE,cAAc,CAAC,KAAK;QAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAEpC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,IAAI,OAAO,cAAc,CAAC,SAAS,KAAK,UAAU,EAAE;AAClD,YAAA,OAAO,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC;QAC1C;AAEA,QAAA,IAAI,MAAM,GAAG,cAAc,CAAC,SAAS;QACrC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;AAC/B,YAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AACtE,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,OAAO,OAAO;AAChB;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACG,SAAU,wBAAwB,CAAC,MAAuB,EAAA;IAC9D,MAAM,OAAO,GAAa,EAAE;AAC5B,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;AAE1B,IAAA,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE;AACjC,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,qBAAqB;AAEpD,IAAA,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;AAC5C,QAAA,MAAM,KAAK,GACT,OAAO,cAAc,CAAC,KAAK,KAAK;AAC9B,cAAE,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK;AACjC,cAAE,cAAc,CAAC,KAAK;QAE1B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC;QAE/D,IAAI,aAAa,EAAE;YACjB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAChC;aAAO;YACL,GAAG,CAAC,KAAK,CACP,CAAA,6CAAA,EAAgD,KAAK,CAAC,MAAM,CAAA,iIAAA,CAAmI,CAChM;QACH;AAEA,QAAA,IAAI,OAAO,cAAc,CAAC,SAAS,KAAK,QAAQ,EAAE;YAChD;QACF;QAEA,MAAM,mBAAmB,GACvB,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAErD,IAAI,mBAAmB,EAAE;AACvB,YAAA,MAAM,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AAClE,YAAA,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;QAC7B;IACF;AAEA,IAAA,OAAO,OAAO;AAChB;;;;"}