summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/node_compat/config.jsonc1
-rw-r--r--cli/tests/node_compat/test/parallel/test-url-format-whatwg.js149
-rw-r--r--ext/node/polyfills/url.ts16
-rw-r--r--tools/node_compat/TODO.md3
4 files changed, 157 insertions, 12 deletions
diff --git a/cli/tests/node_compat/config.jsonc b/cli/tests/node_compat/config.jsonc
index 28f10eaa1..a3b97b510 100644
--- a/cli/tests/node_compat/config.jsonc
+++ b/cli/tests/node_compat/config.jsonc
@@ -615,6 +615,7 @@
"test-url-domain-ascii-unicode.js",
"test-url-fileurltopath.js",
"test-url-format-invalid-input.js",
+ "test-url-format-whatwg.js",
"test-url-format.js",
"test-url-parse-invalid-input.js",
"test-url-parse-query.js",
diff --git a/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js b/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js
new file mode 100644
index 000000000..ea099f494
--- /dev/null
+++ b/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js
@@ -0,0 +1,149 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+
+// Copyright Joyent and Node contributors. All rights reserved. MIT license.
+// Taken from Node 18.12.1
+// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
+
+'use strict';
+
+const common = require('../common');
+if (!common.hasIntl)
+ common.skip('missing Intl');
+
+const assert = require('assert');
+const url = require('url');
+
+const myURL = new URL('http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c');
+
+assert.strictEqual(
+ url.format(myURL),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, {}),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+{
+ [true, 1, 'test', Infinity].forEach((value) => {
+ assert.throws(
+ () => url.format(myURL, value),
+ {
+ code: 'ERR_INVALID_ARG_TYPE',
+ name: 'TypeError',
+ message: 'The "options" argument must be of type object.' +
+ common.invalidArgTypeHelper(value)
+ }
+ );
+ });
+}
+
+// Any falsy value other than undefined will be treated as false.
+// Any truthy value will be treated as true.
+
+assert.strictEqual(
+ url.format(myURL, { auth: false }),
+ 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { auth: '' }),
+ 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { auth: 0 }),
+ 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { auth: 1 }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { auth: {} }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { fragment: false }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b'
+);
+
+assert.strictEqual(
+ url.format(myURL, { fragment: '' }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b'
+);
+
+assert.strictEqual(
+ url.format(myURL, { fragment: 0 }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b'
+);
+
+assert.strictEqual(
+ url.format(myURL, { fragment: 1 }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { fragment: {} }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { search: false }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { search: '' }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { search: 0 }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { search: 1 }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { search: {} }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { unicode: true }),
+ 'http://user:pass@理容ナカムラ.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { unicode: 1 }),
+ 'http://user:pass@理容ナカムラ.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { unicode: {} }),
+ 'http://user:pass@理容ナカムラ.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { unicode: false }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(myURL, { unicode: 0 }),
+ 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'
+);
+
+assert.strictEqual(
+ url.format(new URL('http://user:pass@xn--0zwm56d.com:8080/path'), { unicode: true }),
+ 'http://user:pass@测试.com:8080/path'
+);
diff --git a/ext/node/polyfills/url.ts b/ext/node/polyfills/url.ts
index 4beebe844..28b6060bc 100644
--- a/ext/node/polyfills/url.ts
+++ b/ext/node/polyfills/url.ts
@@ -939,14 +939,11 @@ export function format(
["Object", "string"],
urlObject,
);
- } else if (!(urlObject instanceof Url)) {
- if (urlObject instanceof URL) {
- return formatWhatwg(urlObject, options);
- }
- return Url.prototype.format.call(urlObject);
+ } else if (urlObject instanceof URL) {
+ return formatWhatwg(urlObject, options);
}
- return (urlObject as Url).format();
+ return Url.prototype.format.call(urlObject);
}
/**
@@ -1002,10 +999,9 @@ function formatWhatwg(
}
ret += "@";
}
- // TODO(wafuwfu13): Support unicode option
- // ret += options.unicode ?
- // domainToUnicode(urlObject.host) : urlObject.host;
- ret += urlObject.host;
+ ret += options.unicode
+ ? domainToUnicode(urlObject.hostname)
+ : urlObject.hostname;
if (urlObject.port) {
ret += `:${urlObject.port}`;
}
diff --git a/tools/node_compat/TODO.md b/tools/node_compat/TODO.md
index 9b1206777..d29fe8f9f 100644
--- a/tools/node_compat/TODO.md
+++ b/tools/node_compat/TODO.md
@@ -3,7 +3,7 @@
NOTE: This file should not be manually edited. Please edit 'cli/tests/node_compat/config.json' and run 'tools/node_compat/setup.ts' instead.
-Total: 2935
+Total: 2934
- [abort/test-abort-backtrace.js](https://github.com/nodejs/node/tree/v18.12.1/test/abort/test-abort-backtrace.js)
- [abort/test-abort-fatal-error.js](https://github.com/nodejs/node/tree/v18.12.1/test/abort/test-abort-fatal-error.js)
@@ -2372,7 +2372,6 @@ Total: 2935
- [parallel/test-ttywrap-stack.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-ttywrap-stack.js)
- [parallel/test-unhandled-exception-rethrow-error.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-unhandled-exception-rethrow-error.js)
- [parallel/test-unicode-node-options.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-unicode-node-options.js)
-- [parallel/test-url-format-whatwg.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-url-format-whatwg.js)
- [parallel/test-url-null-char.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-url-null-char.js)
- [parallel/test-url-parse-format.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-url-parse-format.js)
- [parallel/test-utf8-scripts.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-utf8-scripts.js)