diff options
| author | Nathan Whitaker <17734409+nathanwhit@users.noreply.github.com> | 2024-03-11 15:49:43 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-11 15:49:43 -0700 |
| commit | a77b2987bc90879af30a39ba274df9061cc7fbae (patch) | |
| tree | ad7463374e66eb3aa61e41d96c512e67e717e349 /ext/node/polyfills/punycode.ts | |
| parent | d69aab62b0789dd54b8c09b54af022a38f060b5b (diff) | |
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.
Diffstat (limited to 'ext/node/polyfills/punycode.ts')
| -rw-r--r-- | ext/node/polyfills/punycode.ts | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/ext/node/polyfills/punycode.ts b/ext/node/polyfills/punycode.ts index 6f137d31f..e89be15a2 100644 --- a/ext/node/polyfills/punycode.ts +++ b/ext/node/polyfills/punycode.ts @@ -1,28 +1,40 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. import { - op_node_idna_domain_to_ascii, - op_node_idna_domain_to_unicode, op_node_idna_punycode_decode, op_node_idna_punycode_encode, + op_node_idna_punycode_to_ascii, + op_node_idna_punycode_to_unicode, } from "ext:core/ops"; +import { deprecate } from "node:util"; + import { ucs2 } from "ext:deno_node/internal/idna.ts"; +// deno-lint-ignore no-explicit-any +function punyDeprecated(fn: any) { + return deprecate( + fn, + "The `punycode` module is deprecated. Please use a userland " + + "alternative instead.", + "DEP0040", + ); +} + function toASCII(domain) { - return op_node_idna_domain_to_ascii(domain); + return punyDeprecated(op_node_idna_punycode_to_ascii)(domain); } function toUnicode(domain) { - return op_node_idna_domain_to_unicode(domain); + return punyDeprecated(op_node_idna_punycode_to_unicode)(domain); } function decode(domain) { - return op_node_idna_punycode_decode(domain); + return punyDeprecated(op_node_idna_punycode_decode)(domain); } function encode(domain) { - return op_node_idna_punycode_encode(domain); + return punyDeprecated(op_node_idna_punycode_encode)(domain); } export { decode, encode, toASCII, toUnicode, ucs2 }; |
