1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-27 16:10:57 -05:00
denoland-deno/ext/node/polyfills/punycode.ts
Nathan Whitaker a77b2987bc
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.
2024-03-11 15:49:43 -07:00

48 lines
1 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import {
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 punyDeprecated(op_node_idna_punycode_to_ascii)(domain);
}
function toUnicode(domain) {
return punyDeprecated(op_node_idna_punycode_to_unicode)(domain);
}
function decode(domain) {
return punyDeprecated(op_node_idna_punycode_decode)(domain);
}
function encode(domain) {
return punyDeprecated(op_node_idna_punycode_encode)(domain);
}
export { decode, encode, toASCII, toUnicode, ucs2 };
export default {
decode,
encode,
toASCII,
toUnicode,
ucs2,
};