normalize-domain.ts 964 B

1234567891011121314151617181920212223242526272829303132
  1. // https://github.com/remusao/tldts/issues/2121
  2. // import tldts from 'tldts-experimental';
  3. import tldts from 'tldts';
  4. import { normalizeTldtsOpt } from '../constants/loose-tldts-opt';
  5. type TldTsParsed = ReturnType<typeof tldts.parse>;
  6. export function normalizeDomain(domain: string, parsed: TldTsParsed | null = null) {
  7. if (domain.length === 0) return null;
  8. parsed ??= tldts.parse(domain, normalizeTldtsOpt);
  9. if (parsed.isIp) return null;
  10. let h = parsed.hostname;
  11. if (h === null) return null;
  12. // Private invalid domain (things like .tor, .dn42, etc)
  13. if (!parsed.isIcann && !parsed.isPrivate) return null;
  14. let sliceStart = 0;
  15. let sliceEnd = 0;
  16. if (h[0] === '.') sliceStart = 1;
  17. // eslint-disable-next-line sukka/string/prefer-string-starts-ends-with -- performance
  18. if (h[h.length - 1] === '.') sliceEnd = -1;
  19. if (sliceStart !== 0 || sliceEnd !== 0) {
  20. h = h.slice(sliceStart, sliceEnd);
  21. }
  22. return h.length > 0 ? h : null;
  23. }