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. --- tests/unit_node/punycode_test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 tests/unit_node/punycode_test.ts (limited to 'tests/unit_node/punycode_test.ts') diff --git a/tests/unit_node/punycode_test.ts b/tests/unit_node/punycode_test.ts new file mode 100644 index 000000000..f5f8c4f97 --- /dev/null +++ b/tests/unit_node/punycode_test.ts @@ -0,0 +1,16 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. + +import * as punycode from "node:punycode"; +import { assertEquals } from "@std/assert/mod.ts"; + +Deno.test("regression #19214", () => { + const input = "个��.hk"; + + assertEquals(punycode.toASCII(input), "xn--ciq6844ba.hk"); + + assertEquals(punycode.toUnicode("xn--ciq6844ba.hk"), input); +}); + +Deno.test("Decode empty input", () => { + assertEquals(punycode.decode(""), ""); +}); -- cgit v1.2.3