From a77b2987bc90879af30a39ba274df9061cc7fbae Mon Sep 17 00:00:00 2001 From: Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com> Date: Mon, 11 Mar 2024 15:49:43 -0700 Subject: fix(ext/node): Match punycode module behavior to node (#22847) Fixes #19214. We were using the `idna` crate to implement our polyfill for `punycode.toASCII` and `punycode.toUnicode`. The `idna` crate is correct, and adheres to the IDNA2003/2008 spec, but it turns out `node`'s implementations don't really follow any spec! Instead, node splits the domain by `'.'` and punycode encodes/decodes each part. This means that node's implementations will happily work on codepoints that are disallowed by the IDNA specs, causing the error in #19214. While fixing this, I went ahead and matched the node behavior on all of the punycode functions and enabled node's punycode test in our `node_compat` suite. --- ext/node/polyfills/internal/idna.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'ext/node/polyfills/internal') diff --git a/ext/node/polyfills/internal/idna.ts b/ext/node/polyfills/internal/idna.ts index 6484fe951..93ed065cc 100644 --- a/ext/node/polyfills/internal/idna.ts +++ b/ext/node/polyfills/internal/idna.ts @@ -51,6 +51,11 @@ "use strict"; +import { + op_node_idna_domain_to_ascii, + op_node_idna_domain_to_unicode, +} from "ext:core/ops"; + /** * Creates an array containing the numeric code points of each Unicode * character in the string. While JavaScript uses UCS-2 internally, @@ -105,3 +110,17 @@ export const ucs2 = { decode: ucs2decode, encode: ucs2encode, }; + +/** + * Converts a domain to ASCII as per the IDNA spec + */ +export function domainToASCII(domain: string) { + return op_node_idna_domain_to_ascii(domain); +} + +/** + * Converts a domain to Unicode as per the IDNA spec + */ +export function domainToUnicode(domain: string) { + return op_node_idna_domain_to_unicode(domain); +} -- cgit v1.2.3