Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

url: file URL path normalization #35477

Closed
wants to merge 1 commit into from

Conversation

watilde
Copy link
Member

@watilde watilde commented Oct 3, 2020

Refs: whatwg/url#544
Refs: web-platform-tests/wpt#25716
Fixes: #35429

Checklist

@watilde watilde added semver-major PRs that contain breaking changes and should be released in the next major version. whatwg-url Issues and PRs related to the WHATWG URL implementation. labels Oct 3, 2020
@nodejs-github-bot nodejs-github-bot added the c++ Issues and PRs that require attention from people who are familiar with C++. label Oct 3, 2020
@watilde watilde added the wip Issues and PRs that are still a work in progress. label Oct 3, 2020
@watilde watilde force-pushed the url/file-path-normalization branch 2 times, most recently from 1de4ef4 to b6e0aa2 Compare October 4, 2020 14:33
@CYBAI
Copy link

CYBAI commented Oct 4, 2020

This might fix #35429 👀?

@watilde watilde force-pushed the url/file-path-normalization branch from fea5da9 to a843655 Compare October 5, 2020 10:23
@watilde watilde added inspector Issues and PRs related to the V8 inspector protocol policy Issues and PRs related to the policy subsystem. author ready PRs that have at least one approval, no pending requests for changes, and a CI started. and removed wip Issues and PRs that are still a work in progress. labels Oct 5, 2020
@watilde
Copy link
Member Author

watilde commented Oct 5, 2020

/cc @nodejs/tsc because semver-major.

Copy link
Contributor

@guybedford guybedford left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One pattern for a cross platform URL construction is:

new URL('//' + path.resolve('path'), 'file:')

where that works in both Windows and Posix because the // in the Posix case is deduped.

Under this PR it would resolve to file:////path/to/path and the four /'s will lead to some module system issues.

Ideally this should be corrected specifically for file: URLs in the WhatWG spec, but otherwise we should be renormalizing these in the module system otherwise at least now to avoid these cases I think.

We should also have tests for fileURLToPath(new URL('file:////path')) and pathToFileURL('//path') to verify these new cases too.

"protocol": "file:",
"username": "",
"password": "",
"host": "spider",
"hostname": "spider",
"port": "",
"pathname": "/",
"pathname": "///",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a little confusing to me. Why are the / in paths no longer being deduped? I am concerned this will be breaking for modules users who make this mistake.

@watilde watilde added the request-ci Add this label to start a Jenkins CI on a PR. label Oct 5, 2020
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Oct 5, 2020
@nodejs-github-bot
Copy link
Collaborator

@Trott
Copy link
Member

Trott commented Oct 5, 2020

@guybedford You've approved this PR but left a lengthy comment expressing some concerns. Are the concerns things that need to be addressed by the modules team before this makes it into a release? Or is resolution of those issues a prerequisite before landing this change?

@guybedford
Copy link
Contributor

@Trott unfortunately I think this has some problems for the modules system as there is the potential of file:////path and file:///path being separate entries in the registry with the knock-on effects of that. So I do think we need to come up with a solution to these cases before landing yes.

One simple approach could be to have the module resolver throw for file://// URLs being returned to avoid these identity issues. That is sort of breaking though although we might get away with it given the experimental status. Verifying some common modules resolution cases in the tests also seems important.

Copy link
Contributor

@guybedford guybedford left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a concern that file://// URLs in the module registry lead to duplicate loads. We should likely throw in the resolver or dig into the spec differences here.

@guybedford guybedford added the modules-agenda Issues and PRs to discuss during the meetings of the Modules team. label Oct 5, 2020
@guybedford
Copy link
Contributor

@watilde do you have any further background on why new URL('file:///////') is no longer deduping the leading slashes?

@jasnell
Copy link
Member

jasnell commented Oct 7, 2020

I think we should absolutely follow the standard and make this change. Any possible impact to the modules subsystem should be dealt with there. That said, there's nothing saying that we cannot inject a flag that forces a revert back to original behavior if it is absolutely needed.

e.g.

// Implements the new behavior

$ node -pe "new URL('////path/to/resolve', 'file:')"

// Implements the old behavior

$ node --original-url-path-normalization "new URL('////path/to/resolve', 'file:')" 

Yes, this would allow some inconsistency in behavior (similar to --preserve-symlinks) but it gives a usable escape hatch if the new behavior definitely breaks someone.

@bmeck
Copy link
Member

bmeck commented Oct 7, 2020

@jasnell I agree we should update to w/e the standard is but there is some lack of clarity on what to do w/ comparison of these URLs with multiple adjacent / in the pathname (we actually have some divergence already due to normalizing joiners of // in the loader due to #35507 ). I think we just need to iron that out before landing this actual PR so that we know expectations. My concern in particular is that we need to document what these overlaps mean so that across the project we have a stable set of interpretations; the URLs are different, but are the resources/files they point to compared or the URLs etc. To my knowledge this is the first known example of handling these cases, which on most FS do treat multiple / as a single / but that is not true on flat filesystems. If we want to tie this PR to the modules impl giving it a check, that seems fine. We have a meeting today with this on the agenda.

Copy link
Contributor

@guybedford guybedford left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We disussed this in the meeting but weren't able to come to any conclusions there unfortunately.

Discussing further with @bmeck it appears the major module resolution cases already do handle normalization fine, and it is only when using --preserve-symlinks that these resolutions can creep into the module registry. A follow-up patch to apply a path.resolve normalization in the --preserve-symlinks case can fix any of these issues up, but is not on the critical path to landing on this PR as it is a much wider edge case.

In addition I have posted a proposal at whatwg/url#552 for handling deduplication.

This PR likely will still cause breaks for URL consumers in the ecosystem, but it seems moving forward with landing would be best at this point.

@watilde
Copy link
Member Author

watilde commented Oct 8, 2020

@guybedford Thank you for your effort to carefully clarify the impact with the team and sharing back the result! That is very helpful feedback and I agreed on that we should follow up for --preserve-symlinks case.

@bmeck Thank you for your participation as well. I'd appreciate if you can update the review status based on the discussion.

Let me cc @nodejs/tsc again for one more review and approval before landing, because this is semver-major as same as #33770. It would be great if we can ship this to v15.

@watilde watilde removed needs-citgm PRs that need a CITGM CI run. modules-agenda Issues and PRs to discuss during the meetings of the Modules team. labels Oct 9, 2020
@bmeck
Copy link
Member

bmeck commented Oct 9, 2020

I think if we deduplicate // in --preserve-symlinks it would be fine. That would mean that URLs for file://host//a would never be sent through policies so it would be a non-issue. That plan seems fine as a follow on. If we ever support covering these URLs through the loading pipeline we will have to re-discuss.

watilde added a commit that referenced this pull request Oct 12, 2020
Refs: whatwg/url#544
Refs: web-platform-tests/wpt#25716

PR-URL: #35477
Fixes: #35429
Reviewed-By: Guy Bedford <guybedford@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Bradley Farias <bradley.meck@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
@watilde
Copy link
Member Author

watilde commented Oct 12, 2020

Landed in bb62f4a

@watilde watilde closed this Oct 12, 2020
@Flarna
Copy link
Member

Flarna commented Oct 12, 2020

On master some tests fail which look related to this PR. see e.g. https://ci.nodejs.org/job/node-test-binary-windows-native-suites/5470/#showFailuresLink

@Flarna
Copy link
Member

Flarna commented Oct 12, 2020

test/cctest/test_url.cc has a #ifdef _WIN32 section which was not adapted. CI above #35477 (comment) shows the same fails as on master now.

@Flarna Flarna mentioned this pull request Oct 12, 2020
@watilde
Copy link
Member Author

watilde commented Oct 12, 2020

@Flarna Thank you for catching that. I'll open PR for tests shortly

@watilde watilde mentioned this pull request Oct 12, 2020
3 tasks
@watilde watilde deleted the url/file-path-normalization branch October 14, 2020 08:19
BethGriggs added a commit that referenced this pull request Oct 19, 2020
Notable changes:

Deprecations and Removals:

- **build**: remove --build-v8-with-gn configure option (Yang Guo)
(#27576)
- **build**: drop support for VS2017 (Michaël Zasso)
(#33694)
- **doc**: move DEP0018 to End-of-Life (Rich Trott)
(#35316)
- **fs**: deprecation warning on recursive rmdir (Ian Sutherland)
(#35562)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **net**: remove long deprecated server.connections property (James M
Snell) (#33647)
- **repl**: remove deprecated repl.memory function (Ruben Bridgewater)
(#33286)
- **repl**: remove deprecated repl.turnOffEditorMode() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated repl.parseREPLKeyword() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated bufferedCommand property (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated .rli (Ruben Bridgewater)
(#33286)
- **src**: remove deprecated node debug command (James M Snell)
(#33648)
- **timers**: introduce timers/promises (James M Snell)
(#33950)
- **util**: change default value of `maxStringLength` to 10000
(unknown) (#32744)
- **wasi**: drop --experimental-wasm-bigint requirement (Colin Ihrig)
(#35415)

npm 7 (#35631):

Node.js 15 comes with a new major release of npm, npm 7. npm 7 comes
with many new features - including npm workspaces and a new
package-lock.json format. npm 7 also includes yarn.lock file support.
One of the big changes in npm 7 is that peer dependencies are now
installed by default.

Throw On Unhandled Rejections
(#33021):

As of Node.js 15, the default mode for `unhandledRejection` is changed
to `throw` (from `warn`). In `throw` mode, if an `unhandledRejection`
hook is not set, the `unhandledRejection` is raised as an uncaught
exception. Users that have an `unhandledRejection` hook should see no
change in behavior, and it’s still possible to switch modes using the
`--unhandled-rejections=mode` process flag.

QUIC (#32379):

Node.js 15 comes with experimental support QUIC, which can be enabled
by compiling Node.js with the `--experimental-quic` configuration flag.
The Node.js QUIC implementation is exposed by the core `net` module.

V8 8.6 (#35415):

The V8 JavaScript engine has been updated to V8 8.6 (V8 8.4 is the
latest available in Node.js 14). Along with performance tweaks and
improvements the V8 update also brings the following language features:
* `Promise.any()` (from V8 8.5)
* `AggregateError` (from V8 8.5)
* `String.prototype.replaceAll()` (from V8 8.5)
* Logical assignment operators `&&=`, `||=`, and `??=` (from V8 8.5)

Other Notable Changes:

- **assert**: add `assert/strict` alias module (ExE Boss)
(#34001)
- **dns**: add dns/promises alias (shisama)
(#32953)
- **fs**: reimplement read and write streams using stream.construct
(Robert Nagy) (#29656)
- **http2**: allow Host in HTTP/2 requests (Alba Mendez)
(#34664)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **lib**: unflag AbortController (James M Snell)
(#33527)
- **lib**: initial experimental AbortController implementation (James M
Snell) (#33527)
- **net**: autoDestroy Socket (Robert Nagy)
(#31806)
- **src**: disallow JS execution inside FreeEnvironment (Anna
Henningsen) (#33874)
- **stream**: construct (Robert Nagy)
(#29656)
- **worker**: make MessageEvent class more Web-compatible (Anna
Henningsen) (#35496)

Semver-Major Commits:

- **assert**: add `assert/strict` alias module (ExE Boss)
(#34001)
- **build**: reset embedder string to "-node.0" (Michaël Zasso)
(#35415)
- **build**: remove --build-v8-with-gn configure option (Yang Guo)
(#27576)
- **build**: drop support for VS2017 (Michaël Zasso)
(#33694)
- **crypto**: refactoring internals, add WebCrypto (James M Snell)
(#35093)
- **crypto**: move node\_crypto files to src/crypto (James M Snell)
(#35093)
- **deps**: V8: cherry-pick d76abfed3512 (Michaël Zasso)
(#35415)
- **deps**: V8: cherry-pick 717543bbf0ef (Michaël Zasso)
(#35415)
- **deps**: V8: cherry-pick 6be2f6e26e8d (Michaël Zasso)
(#35415)
- **deps**: fix V8 build issue with inline methods (Jiawen Geng)
(#35415)
- **deps**: fix platform-embedded-file-writer-win for ARM64 (Michaël
Zasso) (#35415)
- **deps**: update V8 postmortem metadata script (Colin Ihrig)
(#35415)
- **deps**: update V8 to 8.6.395 (Michaël Zasso)
(#35415)
- **deps**: upgrade npm to 7.0.0 (Myles Borins)
(#35631)
- **deps**: update npm to 7.0.0-rc.3 (Myles Borins)
(#35474)
- **deps**: V8: cherry-pick 0d6debcc5f08 (Gus Caplan)
(#33600)
- **dns**: add dns/promises alias (shisama)
(#32953)
- **doc**: move DEP0018 to End-of-Life (Rich Trott)
(#35316)
- **doc**: update support macos version for 15.x (Ash Cripps)
(#35022)
- **fs**: deprecation warning on recursive rmdir (Ian Sutherland)
(#35562)
- **fs**: reimplement read and write streams using stream.construct
(Robert Nagy) (#29656)
- **http**: fixed socket.setEncoding fatal error (iskore)
(#33405)
- **http**: emit 'error' on aborted server request (Robert Nagy)
(#33172)
- **http**: cleanup end argument handling (Robert Nagy)
(#31818)
- **http2**: allow Host in HTTP/2 requests (Alba Mendez)
(#34664)
- **http2**: add `invalidheaders` test (Pranshu Srivastava)
(#33161)
- **http2**: refactor state code validation for the http2Stream class
(rickyes) (#33535)
- **http2**: header field valid checks (Pranshu Srivastava)
(#33193)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **lib**: remove ERR\_INVALID\_OPT\_VALUE and
ERR\_INVALID\_OPT\_VALUE\_ENCODING (Denys Otrishko)
(#34682)
- **lib**: handle one of args case in ERR\_MISSING\_ARGS (Denys
Otrishko) (#34022)
- **lib**: remove NodeError from the prototype of errors with code
(Michaël Zasso) (#33857)
- **lib**: unflag AbortController (James M Snell)
(#33527)
- **lib**: initial experimental AbortController implementation (James M
Snell) (#33527)
- **net**: check args in net.connect() and socket.connect() calls
(Denys Otrishko) (#34022)
- **net**: remove long deprecated server.connections property (James M
Snell) (#33647)
- **net**: autoDestroy Socket (Robert Nagy)
(#31806)
- **process**: update v8 fast api calls usage (Maya Lekova)
(#35415)
- **process**: change default --unhandled-rejections=throw (Dan
Fabulich) (#33021)
- **process**: use v8 fast api calls for hrtime (Gus Caplan)
(#33600)
- **process**: delay throwing an error using `throwDeprecation` (Ruben
Bridgewater) (#32312)
- **repl**: remove deprecated repl.memory function (Ruben Bridgewater)
(#33286)
- **repl**: remove deprecated repl.turnOffEditorMode() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated repl.parseREPLKeyword() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated bufferedCommand property (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated .rli (Ruben Bridgewater)
(#33286)
- **src**: implement NodePlatform::PostJob (Clemens Backes)
(#35415)
- **src**: update NODE\_MODULE\_VERSION to 88 (Michaël Zasso)
(#35415)
- **src**: error reporting on CPUUsage (Yash Ladha)
(#34762)
- **src**: use node:moduleName as builtin module filename (Michaël
Zasso) (#35498)
- **src**: enable wasm trap handler on windows (Gus Caplan)
(#35033)
- **src**: update NODE\_MODULE\_VERSION to 86 (Michaël Zasso)
(#33579)
- **src**: disallow JS execution inside FreeEnvironment (Anna
Henningsen) (#33874)
- **src**: remove \_third\_party\_main support (Anna Henningsen)
(#33971)
- **src**: remove deprecated node debug command (James M Snell)
(#33648)
- **src**: remove unused CancelPendingDelayedTasks (Anna Henningsen)
(#32859)
- **stream**: try to wait for flush to complete before 'finish' (Robert
Nagy) (#34314)
- **stream**: cleanup and fix Readable.wrap (Robert Nagy)
(#34204)
- **stream**: add promises version to utility functions (rickyes)
(#33991)
- **stream**: fix writable.end callback behavior (Robert Nagy)
(#34101)
- **stream**: construct (Robert Nagy)
(#29656)
- **stream**: write should throw on unknown encoding (Robert Nagy)
(#33075)
- **stream**: fix \_final and 'prefinish' timing (Robert Nagy)
(#32780)
- **stream**: simplify Transform stream implementation (Robert Nagy)
(#32763)
- **stream**: use callback to properly propagate error (Robert Nagy)
(#29179)
- **test**: update tests after increasing typed array size to 4GB
(Kim-Anh Tran) (#35415)
- **test**: fix tests for npm 7.0.0 (Myles Borins)
(#35631)
- **test**: fix test suite to work with npm 7 (Myles Borins)
(#35474)
- **test**: update WPT harness and tests (Michaël Zasso)
(#33770)
- **timers**: introduce timers/promises (James M Snell)
(#33950)
- **tools**: disable x86 safe exception handlers in V8 (Michaël Zasso)
(#35415)
- **tools**: update V8 gypfiles for 8.6 (Ujjwal Sharma)
(#35415)
- **tools**: update V8 gypfiles for 8.5 (Ujjwal Sharma)
(#35415)
- **url**: file URL path normalization (Daijiro Wachi)
(#35477)
- **url**: verify domain is not empty after "ToASCII" (Michaël Zasso)
(#33770)
- **url**: remove U+0000 case in the fragment state (Michaël Zasso)
(#33770)
- **url**: remove gopher from special schemes (Michaël Zasso)
(#33325)
- **url**: forbid lt and gt in url host code point (Yash Ladha)
(#33328)
- **util**: change default value of `maxStringLength` to 10000
(unknown) (#32744)
- **wasi**: drop --experimental-wasm-bigint requirement (Colin Ihrig)
(#35415)
- **win, child_process**: sanitize env variables (Bartosz Sosnowski)
(#35210)
- **worker**: make MessageEvent class more Web-compatible (Anna
Henningsen) (#35496)
- **worker**: set trackUnmanagedFds to true by default (Anna
Henningsen) (#34394)
- **worker**: rename error code to be more accurate (Anna Henningsen)
(#33872)

PR-URL: #35014
BethGriggs added a commit that referenced this pull request Oct 20, 2020
Notable changes:

Deprecations and Removals:

- **build**: remove --build-v8-with-gn configure option (Yang Guo)
(#27576)
- **build**: drop support for VS2017 (Michaël Zasso)
(#33694)
- **doc**: move DEP0018 to End-of-Life (Rich Trott)
(#35316)
- **fs**: deprecation warning on recursive rmdir (Ian Sutherland)
(#35562)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **net**: remove long deprecated server.connections property (James M
Snell) (#33647)
- **repl**: remove deprecated repl.memory function (Ruben Bridgewater)
(#33286)
- **repl**: remove deprecated repl.turnOffEditorMode() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated repl.parseREPLKeyword() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated bufferedCommand property (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated .rli (Ruben Bridgewater)
(#33286)
- **src**: remove deprecated node debug command (James M Snell)
(#33648)
- **timers**: introduce timers/promises (James M Snell)
(#33950)
- **util**: change default value of `maxStringLength` to 10000
(unknown) (#32744)
- **wasi**: drop --experimental-wasm-bigint requirement (Colin Ihrig)
(#35415)

npm 7 (#35631):

Node.js 15 comes with a new major release of npm, npm 7. npm 7 comes
with many new features - including npm workspaces and a new
package-lock.json format. npm 7 also includes yarn.lock file support.
One of the big changes in npm 7 is that peer dependencies are now
installed by default.

Throw On Unhandled Rejections
(#33021):

As of Node.js 15, the default mode for `unhandledRejection` is changed
to `throw` (from `warn`). In `throw` mode, if an `unhandledRejection`
hook is not set, the `unhandledRejection` is raised as an uncaught
exception. Users that have an `unhandledRejection` hook should see no
change in behavior, and it’s still possible to switch modes using the
`--unhandled-rejections=mode` process flag.

QUIC (#32379):

Node.js 15 comes with experimental support QUIC, which can be enabled
by compiling Node.js with the `--experimental-quic` configuration flag.
The Node.js QUIC implementation is exposed by the core `net` module.

V8 8.6 (#35415):

The V8 JavaScript engine has been updated to V8 8.6 (V8 8.4 is the
latest available in Node.js 14). Along with performance tweaks and
improvements the V8 update also brings the following language features:
* `Promise.any()` (from V8 8.5)
* `AggregateError` (from V8 8.5)
* `String.prototype.replaceAll()` (from V8 8.5)
* Logical assignment operators `&&=`, `||=`, and `??=` (from V8 8.5)

Other Notable Changes:

- **assert**: add `assert/strict` alias module (ExE Boss)
(#34001)
- **dns**: add dns/promises alias (shisama)
(#32953)
- **fs**: reimplement read and write streams using stream.construct
(Robert Nagy) (#29656)
- **http2**: allow Host in HTTP/2 requests (Alba Mendez)
(#34664)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **lib**: unflag AbortController (James M Snell)
(#33527)
- **lib**: initial experimental AbortController implementation (James M
Snell) (#33527)
- **net**: autoDestroy Socket (Robert Nagy)
(#31806)
- **src**: disallow JS execution inside FreeEnvironment (Anna
Henningsen) (#33874)
- **stream**: construct (Robert Nagy)
(#29656)
- **worker**: make MessageEvent class more Web-compatible (Anna
Henningsen) (#35496)

Semver-Major Commits:

- **assert**: add `assert/strict` alias module (ExE Boss)
(#34001)
- **build**: reset embedder string to "-node.0" (Michaël Zasso)
(#35415)
- **build**: remove --build-v8-with-gn configure option (Yang Guo)
(#27576)
- **build**: drop support for VS2017 (Michaël Zasso)
(#33694)
- **crypto**: refactoring internals, add WebCrypto (James M Snell)
(#35093)
- **crypto**: move node\_crypto files to src/crypto (James M Snell)
(#35093)
- **deps**: V8: cherry-pick d76abfed3512 (Michaël Zasso)
(#35415)
- **deps**: V8: cherry-pick 717543bbf0ef (Michaël Zasso)
(#35415)
- **deps**: V8: cherry-pick 6be2f6e26e8d (Michaël Zasso)
(#35415)
- **deps**: fix V8 build issue with inline methods (Jiawen Geng)
(#35415)
- **deps**: fix platform-embedded-file-writer-win for ARM64 (Michaël
Zasso) (#35415)
- **deps**: update V8 postmortem metadata script (Colin Ihrig)
(#35415)
- **deps**: update V8 to 8.6.395 (Michaël Zasso)
(#35415)
- **deps**: upgrade npm to 7.0.0 (Myles Borins)
(#35631)
- **deps**: update npm to 7.0.0-rc.3 (Myles Borins)
(#35474)
- **deps**: V8: cherry-pick 0d6debcc5f08 (Gus Caplan)
(#33600)
- **dns**: add dns/promises alias (shisama)
(#32953)
- **doc**: move DEP0018 to End-of-Life (Rich Trott)
(#35316)
- **doc**: update support macos version for 15.x (Ash Cripps)
(#35022)
- **fs**: deprecation warning on recursive rmdir (Ian Sutherland)
(#35562)
- **fs**: reimplement read and write streams using stream.construct
(Robert Nagy) (#29656)
- **http**: fixed socket.setEncoding fatal error (iskore)
(#33405)
- **http**: emit 'error' on aborted server request (Robert Nagy)
(#33172)
- **http**: cleanup end argument handling (Robert Nagy)
(#31818)
- **http2**: allow Host in HTTP/2 requests (Alba Mendez)
(#34664)
- **http2**: add `invalidheaders` test (Pranshu Srivastava)
(#33161)
- **http2**: refactor state code validation for the http2Stream class
(rickyes) (#33535)
- **http2**: header field valid checks (Pranshu Srivastava)
(#33193)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **lib**: remove ERR\_INVALID\_OPT\_VALUE and
ERR\_INVALID\_OPT\_VALUE\_ENCODING (Denys Otrishko)
(#34682)
- **lib**: handle one of args case in ERR\_MISSING\_ARGS (Denys
Otrishko) (#34022)
- **lib**: remove NodeError from the prototype of errors with code
(Michaël Zasso) (#33857)
- **lib**: unflag AbortController (James M Snell)
(#33527)
- **lib**: initial experimental AbortController implementation (James M
Snell) (#33527)
- **net**: check args in net.connect() and socket.connect() calls
(Denys Otrishko) (#34022)
- **net**: remove long deprecated server.connections property (James M
Snell) (#33647)
- **net**: autoDestroy Socket (Robert Nagy)
(#31806)
- **process**: update v8 fast api calls usage (Maya Lekova)
(#35415)
- **process**: change default --unhandled-rejections=throw (Dan
Fabulich) (#33021)
- **process**: use v8 fast api calls for hrtime (Gus Caplan)
(#33600)
- **process**: delay throwing an error using `throwDeprecation` (Ruben
Bridgewater) (#32312)
- **repl**: remove deprecated repl.memory function (Ruben Bridgewater)
(#33286)
- **repl**: remove deprecated repl.turnOffEditorMode() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated repl.parseREPLKeyword() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated bufferedCommand property (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated .rli (Ruben Bridgewater)
(#33286)
- **src**: implement NodePlatform::PostJob (Clemens Backes)
(#35415)
- **src**: update NODE\_MODULE\_VERSION to 88 (Michaël Zasso)
(#35415)
- **src**: error reporting on CPUUsage (Yash Ladha)
(#34762)
- **src**: use node:moduleName as builtin module filename (Michaël
Zasso) (#35498)
- **src**: enable wasm trap handler on windows (Gus Caplan)
(#35033)
- **src**: update NODE\_MODULE\_VERSION to 86 (Michaël Zasso)
(#33579)
- **src**: disallow JS execution inside FreeEnvironment (Anna
Henningsen) (#33874)
- **src**: remove \_third\_party\_main support (Anna Henningsen)
(#33971)
- **src**: remove deprecated node debug command (James M Snell)
(#33648)
- **src**: remove unused CancelPendingDelayedTasks (Anna Henningsen)
(#32859)
- **stream**: try to wait for flush to complete before 'finish' (Robert
Nagy) (#34314)
- **stream**: cleanup and fix Readable.wrap (Robert Nagy)
(#34204)
- **stream**: add promises version to utility functions (rickyes)
(#33991)
- **stream**: fix writable.end callback behavior (Robert Nagy)
(#34101)
- **stream**: construct (Robert Nagy)
(#29656)
- **stream**: write should throw on unknown encoding (Robert Nagy)
(#33075)
- **stream**: fix \_final and 'prefinish' timing (Robert Nagy)
(#32780)
- **stream**: simplify Transform stream implementation (Robert Nagy)
(#32763)
- **stream**: use callback to properly propagate error (Robert Nagy)
(#29179)
- **test**: update tests after increasing typed array size to 4GB
(Kim-Anh Tran) (#35415)
- **test**: fix tests for npm 7.0.0 (Myles Borins)
(#35631)
- **test**: fix test suite to work with npm 7 (Myles Borins)
(#35474)
- **test**: update WPT harness and tests (Michaël Zasso)
(#33770)
- **timers**: introduce timers/promises (James M Snell)
(#33950)
- **tools**: disable x86 safe exception handlers in V8 (Michaël Zasso)
(#35415)
- **tools**: update V8 gypfiles for 8.6 (Ujjwal Sharma)
(#35415)
- **tools**: update V8 gypfiles for 8.5 (Ujjwal Sharma)
(#35415)
- **url**: file URL path normalization (Daijiro Wachi)
(#35477)
- **url**: verify domain is not empty after "ToASCII" (Michaël Zasso)
(#33770)
- **url**: remove U+0000 case in the fragment state (Michaël Zasso)
(#33770)
- **url**: remove gopher from special schemes (Michaël Zasso)
(#33325)
- **url**: forbid lt and gt in url host code point (Yash Ladha)
(#33328)
- **util**: change default value of `maxStringLength` to 10000
(unknown) (#32744)
- **wasi**: drop --experimental-wasm-bigint requirement (Colin Ihrig)
(#35415)
- **win, child_process**: sanitize env variables (Bartosz Sosnowski)
(#35210)
- **worker**: make MessageEvent class more Web-compatible (Anna
Henningsen) (#35496)
- **worker**: set trackUnmanagedFds to true by default (Anna
Henningsen) (#34394)
- **worker**: rename error code to be more accurate (Anna Henningsen)
(#33872)

PR-URL: #35014
BethGriggs added a commit that referenced this pull request Oct 20, 2020
Notable changes:

Deprecations and Removals:

- **build**: remove --build-v8-with-gn configure option (Yang Guo)
(#27576)
- **build**: drop support for VS2017 (Michaël Zasso)
(#33694)
- **doc**: move DEP0018 to End-of-Life (Rich Trott)
(#35316)
- **fs**: deprecation warning on recursive rmdir (Ian Sutherland)
(#35562)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **net**: remove long deprecated server.connections property (James M
Snell) (#33647)
- **repl**: remove deprecated repl.memory function (Ruben Bridgewater)
(#33286)
- **repl**: remove deprecated repl.turnOffEditorMode() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated repl.parseREPLKeyword() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated bufferedCommand property (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated .rli (Ruben Bridgewater)
(#33286)
- **src**: remove deprecated node debug command (James M Snell)
(#33648)
- **timers**: introduce timers/promises (James M Snell)
(#33950)
- **util**: change default value of `maxStringLength` to 10000
(unknown) (#32744)
- **wasi**: drop --experimental-wasm-bigint requirement (Colin Ihrig)
(#35415)

npm 7 (#35631):

Node.js 15 comes with a new major release of npm, npm 7. npm 7 comes
with many new features - including npm workspaces and a new
package-lock.json format. npm 7 also includes yarn.lock file support.
One of the big changes in npm 7 is that peer dependencies are now
installed by default.

Throw On Unhandled Rejections
(#33021):

As of Node.js 15, the default mode for `unhandledRejection` is changed
to `throw` (from `warn`). In `throw` mode, if an `unhandledRejection`
hook is not set, the `unhandledRejection` is raised as an uncaught
exception. Users that have an `unhandledRejection` hook should see no
change in behavior, and it’s still possible to switch modes using the
`--unhandled-rejections=mode` process flag.

QUIC (#32379):

Node.js 15 comes with experimental support QUIC, which can be enabled
by compiling Node.js with the `--experimental-quic` configuration flag.
The Node.js QUIC implementation is exposed by the core `net` module.

V8 8.6 (#35415):

The V8 JavaScript engine has been updated to V8 8.6 (V8 8.4 is the
latest available in Node.js 14). Along with performance tweaks and
improvements the V8 update also brings the following language features:
* `Promise.any()` (from V8 8.5)
* `AggregateError` (from V8 8.5)
* `String.prototype.replaceAll()` (from V8 8.5)
* Logical assignment operators `&&=`, `||=`, and `??=` (from V8 8.5)

Other Notable Changes:

- **assert**: add `assert/strict` alias module (ExE Boss)
(#34001)
- **dns**: add dns/promises alias (shisama)
(#32953)
- **fs**: reimplement read and write streams using stream.construct
(Robert Nagy) (#29656)
- **http2**: allow Host in HTTP/2 requests (Alba Mendez)
(#34664)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **lib**: unflag AbortController (James M Snell)
(#33527)
- **lib**: initial experimental AbortController implementation (James M
Snell) (#33527)
- **net**: autoDestroy Socket (Robert Nagy)
(#31806)
- **src**: disallow JS execution inside FreeEnvironment (Anna
Henningsen) (#33874)
- **stream**: construct (Robert Nagy)
(#29656)
- **worker**: make MessageEvent class more Web-compatible (Anna
Henningsen) (#35496)

Semver-Major Commits:

- **assert**: add `assert/strict` alias module (ExE Boss)
(#34001)
- **build**: reset embedder string to "-node.0" (Michaël Zasso)
(#35415)
- **build**: remove --build-v8-with-gn configure option (Yang Guo)
(#27576)
- **build**: drop support for VS2017 (Michaël Zasso)
(#33694)
- **crypto**: refactoring internals, add WebCrypto (James M Snell)
(#35093)
- **crypto**: move node\_crypto files to src/crypto (James M Snell)
(#35093)
- **deps**: V8: cherry-pick d76abfed3512 (Michaël Zasso)
(#35415)
- **deps**: V8: cherry-pick 717543bbf0ef (Michaël Zasso)
(#35415)
- **deps**: V8: cherry-pick 6be2f6e26e8d (Michaël Zasso)
(#35415)
- **deps**: fix V8 build issue with inline methods (Jiawen Geng)
(#35415)
- **deps**: fix platform-embedded-file-writer-win for ARM64 (Michaël
Zasso) (#35415)
- **deps**: update V8 postmortem metadata script (Colin Ihrig)
(#35415)
- **deps**: update V8 to 8.6.395 (Michaël Zasso)
(#35415)
- **deps**: upgrade npm to 7.0.0 (Myles Borins)
(#35631)
- **deps**: update npm to 7.0.0-rc.3 (Myles Borins)
(#35474)
- **deps**: V8: cherry-pick 0d6debcc5f08 (Gus Caplan)
(#33600)
- **dns**: add dns/promises alias (shisama)
(#32953)
- **doc**: move DEP0018 to End-of-Life (Rich Trott)
(#35316)
- **doc**: update support macos version for 15.x (Ash Cripps)
(#35022)
- **fs**: deprecation warning on recursive rmdir (Ian Sutherland)
(#35562)
- **fs**: reimplement read and write streams using stream.construct
(Robert Nagy) (#29656)
- **http**: fixed socket.setEncoding fatal error (iskore)
(#33405)
- **http**: emit 'error' on aborted server request (Robert Nagy)
(#33172)
- **http**: cleanup end argument handling (Robert Nagy)
(#31818)
- **http2**: allow Host in HTTP/2 requests (Alba Mendez)
(#34664)
- **http2**: add `invalidheaders` test (Pranshu Srivastava)
(#33161)
- **http2**: refactor state code validation for the http2Stream class
(rickyes) (#33535)
- **http2**: header field valid checks (Pranshu Srivastava)
(#33193)
- **lib**: add EventTarget-related browser globals (Anna Henningsen)
(#35496)
- **lib**: remove ERR\_INVALID\_OPT\_VALUE and
ERR\_INVALID\_OPT\_VALUE\_ENCODING (Denys Otrishko)
(#34682)
- **lib**: handle one of args case in ERR\_MISSING\_ARGS (Denys
Otrishko) (#34022)
- **lib**: remove NodeError from the prototype of errors with code
(Michaël Zasso) (#33857)
- **lib**: unflag AbortController (James M Snell)
(#33527)
- **lib**: initial experimental AbortController implementation (James M
Snell) (#33527)
- **net**: check args in net.connect() and socket.connect() calls
(Denys Otrishko) (#34022)
- **net**: remove long deprecated server.connections property (James M
Snell) (#33647)
- **net**: autoDestroy Socket (Robert Nagy)
(#31806)
- **process**: update v8 fast api calls usage (Maya Lekova)
(#35415)
- **process**: change default --unhandled-rejections=throw (Dan
Fabulich) (#33021)
- **process**: use v8 fast api calls for hrtime (Gus Caplan)
(#33600)
- **process**: delay throwing an error using `throwDeprecation` (Ruben
Bridgewater) (#32312)
- **repl**: remove deprecated repl.memory function (Ruben Bridgewater)
(#33286)
- **repl**: remove deprecated repl.turnOffEditorMode() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated repl.parseREPLKeyword() function (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated bufferedCommand property (Ruben
Bridgewater) (#33286)
- **repl**: remove deprecated .rli (Ruben Bridgewater)
(#33286)
- **src**: implement NodePlatform::PostJob (Clemens Backes)
(#35415)
- **src**: update NODE\_MODULE\_VERSION to 88 (Michaël Zasso)
(#35415)
- **src**: error reporting on CPUUsage (Yash Ladha)
(#34762)
- **src**: use node:moduleName as builtin module filename (Michaël
Zasso) (#35498)
- **src**: enable wasm trap handler on windows (Gus Caplan)
(#35033)
- **src**: update NODE\_MODULE\_VERSION to 86 (Michaël Zasso)
(#33579)
- **src**: disallow JS execution inside FreeEnvironment (Anna
Henningsen) (#33874)
- **src**: remove \_third\_party\_main support (Anna Henningsen)
(#33971)
- **src**: remove deprecated node debug command (James M Snell)
(#33648)
- **src**: remove unused CancelPendingDelayedTasks (Anna Henningsen)
(#32859)
- **stream**: try to wait for flush to complete before 'finish' (Robert
Nagy) (#34314)
- **stream**: cleanup and fix Readable.wrap (Robert Nagy)
(#34204)
- **stream**: add promises version to utility functions (rickyes)
(#33991)
- **stream**: fix writable.end callback behavior (Robert Nagy)
(#34101)
- **stream**: construct (Robert Nagy)
(#29656)
- **stream**: write should throw on unknown encoding (Robert Nagy)
(#33075)
- **stream**: fix \_final and 'prefinish' timing (Robert Nagy)
(#32780)
- **stream**: simplify Transform stream implementation (Robert Nagy)
(#32763)
- **stream**: use callback to properly propagate error (Robert Nagy)
(#29179)
- **test**: update tests after increasing typed array size to 4GB
(Kim-Anh Tran) (#35415)
- **test**: fix tests for npm 7.0.0 (Myles Borins)
(#35631)
- **test**: fix test suite to work with npm 7 (Myles Borins)
(#35474)
- **test**: update WPT harness and tests (Michaël Zasso)
(#33770)
- **timers**: introduce timers/promises (James M Snell)
(#33950)
- **tools**: disable x86 safe exception handlers in V8 (Michaël Zasso)
(#35415)
- **tools**: update V8 gypfiles for 8.6 (Ujjwal Sharma)
(#35415)
- **tools**: update V8 gypfiles for 8.5 (Ujjwal Sharma)
(#35415)
- **url**: file URL path normalization (Daijiro Wachi)
(#35477)
- **url**: verify domain is not empty after "ToASCII" (Michaël Zasso)
(#33770)
- **url**: remove U+0000 case in the fragment state (Michaël Zasso)
(#33770)
- **url**: remove gopher from special schemes (Michaël Zasso)
(#33325)
- **url**: forbid lt and gt in url host code point (Yash Ladha)
(#33328)
- **util**: change default value of `maxStringLength` to 10000
(unknown) (#32744)
- **wasi**: drop --experimental-wasm-bigint requirement (Colin Ihrig)
(#35415)
- **win, child_process**: sanitize env variables (Bartosz Sosnowski)
(#35210)
- **worker**: make MessageEvent class more Web-compatible (Anna
Henningsen) (#35496)
- **worker**: set trackUnmanagedFds to true by default (Anna
Henningsen) (#34394)
- **worker**: rename error code to be more accurate (Anna Henningsen)
(#33872)

PR-URL: #35014
joesepi pushed a commit to joesepi/node that referenced this pull request Jan 8, 2021
Refs: whatwg/url#544
Refs: web-platform-tests/wpt#25716

PR-URL: nodejs#35477
Fixes: nodejs#35429
Reviewed-By: Guy Bedford <guybedford@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Bradley Farias <bradley.meck@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
author ready PRs that have at least one approval, no pending requests for changes, and a CI started. c++ Issues and PRs that require attention from people who are familiar with C++. inspector Issues and PRs related to the V8 inspector protocol policy Issues and PRs related to the policy subsystem. semver-major PRs that contain breaking changes and should be released in the next major version. whatwg-url Issues and PRs related to the WHATWG URL implementation.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

URL: changes to file URL path normalization