{"version":3,"file":"parseSnsDomain.mjs","sources":["../../../src/utils/parseSnsDomain.ts"],"sourcesContent":["import { InvalidDomainError, InvalidSubdomainError } from \"../errors\";\r\nimport { parseSnsTld } from \"./tld\";\r\n\r\nconst isCanonicalLowercase = (domain: string) =>\r\n  domain.trim().toLowerCase() === domain;\r\n\r\n/**\r\n * Parses a top-level `.sns` domain and returns the raw domain label.\r\n *\r\n * @param domain Full lowercase top-level `.sns` domain name\r\n * @returns Raw domain label without the `.sns` suffix.\r\n * @throws InvalidDomainError If the domain is malformed.\r\n */\r\nexport const _parseSnsTopLevelDomain = (domain: string): string => {\r\n  const [trimmedDomain] = parseSnsTld(domain);\r\n\r\n  if (\r\n    !trimmedDomain ||\r\n    trimmedDomain.includes(\".\") ||\r\n    !isCanonicalLowercase(trimmedDomain)\r\n  ) {\r\n    throw new InvalidDomainError(\"The domain name is malformed\");\r\n  }\r\n\r\n  return trimmedDomain;\r\n};\r\n\r\n/**\r\n * Parses a `.sns` subdomain and returns `[subdomainLabel, parentLabel]`.\r\n *\r\n * @param subdomain Full lowercase `.sns` subdomain name in `sub.parent.sns` form\r\n * @returns Subdomain label and parent label.\r\n * @throws InvalidSubdomainError If the subdomain is malformed.\r\n */\r\nexport const _parseSnsSubdomain = (subdomain: string): [string, string] => {\r\n  const [trimmedSubdomain] = parseSnsTld(subdomain);\r\n  const labels = trimmedSubdomain.split(\".\");\r\n  const [sub, parent] = labels;\r\n\r\n  if (\r\n    labels.length !== 2 ||\r\n    !sub ||\r\n    !parent ||\r\n    !isCanonicalLowercase(trimmedSubdomain)\r\n  ) {\r\n    throw new InvalidSubdomainError(\"The subdomain name is malformed\");\r\n  }\r\n\r\n  return [sub, parent];\r\n};\r\n\r\n/**\r\n * Parses a writable `.sns` domain and allows either `name.sns` or\r\n * `sub.parent.sns`.\r\n *\r\n * @param domain Full lowercase `.sns` domain or subdomain name\r\n * @returns Domain name without the `.sns` suffix.\r\n * @throws InvalidDomainError If the domain is malformed.\r\n */\r\nexport const _parseSnsDomain = (domain: string): string => {\r\n  const [trimmedDomain] = parseSnsTld(domain);\r\n  const labels = trimmedDomain.split(\".\");\r\n\r\n  if (\r\n    labels.length > 2 ||\r\n    labels.some((label) => !label) ||\r\n    !isCanonicalLowercase(trimmedDomain)\r\n  ) {\r\n    throw new InvalidDomainError(\"The domain name is malformed\");\r\n  }\r\n\r\n  return trimmedDomain;\r\n};\r\n"],"names":[],"mappings":";;;AAGA,MAAM,oBAAoB,GAAG,CAAC,MAAc,KAC1C,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM;AAExC;;;;;;AAMG;AACU,MAAA,uBAAuB,GAAG,CAAC,MAAc,KAAY;IAChE,MAAM,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;AAE3C,IAAA,IACE,CAAC,aAAa;AACd,QAAA,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC3B,QAAA,CAAC,oBAAoB,CAAC,aAAa,CAAC,EACpC;AACA,QAAA,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC;;AAG9D,IAAA,OAAO,aAAa;AACtB;AAEA;;;;;;AAMG;AACU,MAAA,kBAAkB,GAAG,CAAC,SAAiB,KAAsB;IACxE,MAAM,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC;IACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;AAC1C,IAAA,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,MAAM;AAE5B,IAAA,IACE,MAAM,CAAC,MAAM,KAAK,CAAC;AACnB,QAAA,CAAC,GAAG;AACJ,QAAA,CAAC,MAAM;AACP,QAAA,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,EACvC;AACA,QAAA,MAAM,IAAI,qBAAqB,CAAC,iCAAiC,CAAC;;AAGpE,IAAA,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;AACtB;AAEA;;;;;;;AAOG;AACU,MAAA,eAAe,GAAG,CAAC,MAAc,KAAY;IACxD,MAAM,CAAC,aAAa,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;IAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;AAEvC,IAAA,IACE,MAAM,CAAC,MAAM,GAAG,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;AAC9B,QAAA,CAAC,oBAAoB,CAAC,aAAa,CAAC,EACpC;AACA,QAAA,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC;;AAG9D,IAAA,OAAO,aAAa;AACtB;;;;"}