UNPKG

idna-uts46-hx

Version:

Convert Domain Names correctly from IDN to Punycode and vice-versa and offer TR46 processing.

64 lines (57 loc) 1.59 kB
import tr46 from 'tr46'; function getDefaultOptions(domainName) { return { transitionalProcessing: !domainName.match( /\.(?:art|be|ca|de|swiss|fr|pm|re|tf|wf|yt)\.?$/, ), }; } function toAscii(domainName, options = {}) { const pc = tr46.toASCII(domainName, { ...getDefaultOptions(domainName), ...options, }); if (pc !== null) { return pc; } throw new Error(`Unable to translate ${domainName} to ASCII.`); } function toUnicode(domainName, options = {}) { const idn = tr46.toUnicode(domainName, { ...getDefaultOptions(domainName), ...options, }); if (idn !== null && !idn.error) { return idn.domain.toLocaleLowerCase(); } if (idn !== null && /(^|\.)xn--/i.test(domainName)) { const lowercaseDomainName = idn.domain.toLocaleLowerCase(); if (lowercaseDomainName !== idn.domain) { return lowercaseDomainName; } } throw new Error(`Unable to translate ${domainName} to Unicode.`); } function convert(domainNames, options = {}) { const isArrayInput = Array.isArray(domainNames); if (!isArrayInput) { domainNames = [domainNames]; } const results = { IDN: [], PC: [] }; domainNames.forEach((domainName) => { try { const uc = toUnicode(domainName, options); const pc = toAscii(uc, options); results.IDN.push(uc); results.PC.push(pc); } catch { results.PC.push(domainName); results.IDN.push(domainName); } }); if (isArrayInput) { return results; } return { IDN: results.IDN[0], PC: results.PC[0] }; } export { toUnicode, toAscii, convert };