module: add support for node:‑prefixed require(…) calls
#37246
Conversation
8615225
to
4f61960
|
You read my mind, I was precisely working on this. I noticed it produces an arguably better error when trying to load internal modules: $ node -p "require('internal/test/binding')"
Error: Cannot find module 'internal/test/binding'
$ node -p "require('node:internal/test/binding')"
Error: Should not compile internal/test/binding for public useCan you add tests in |
e740b61
to
320ef5e
| ); | ||
| } | ||
|
|
||
| // `node:`-prefixed `require(...)` calls bypass the require cache: |
bmeck
Feb 6, 2021
Member
this differs from other builtins, I love it, but want to be sure it is intentional.
ljharb
Feb 6, 2021
Member
this actually seems like an issue - it means someone who replaces a builtin intentionally can’t replace one of these (altho presumably mutating a builtin would be visible in both). That could cause an issue where someone wants to use a package to instrument or lock down fs (and thus, policies are not an ergonomic option, unless I’m misunderstanding how policies work), but accidentally leaves a gaping security hole when an attacker requires node:fs.
bmeck
Feb 6, 2021
Member
policies should intercept before any of the resolution helpers even get called
node/lib/internal/modules/cjs/helpers.js
Line 52 in 36cc0ee
module.require and get here without some kind of opt-in to the behavior (like dependencies:true).
benjamingr
Feb 6, 2021
Member
At the very least this needs documentation and probably a strong indication people using policies + instrumenting fs now need to update the policy.
ljharb
Feb 6, 2021
Member
My point was that policies aren’t currently required to ensure this for CJS - a package (not the app itself) can do it. Forcing policies to be the mechanism means packages are no longer capable of abstracting this for users.
ljharb
Feb 6, 2021
Member
Totally understood. Given that policies are the superior mechanism for app developers to lock things down, what's the benefit of adding special, inconsistent, cache-bypassing behavior for require with a node: prefix?
bmeck
Feb 7, 2021
Member
@ljharb i have no strong opinion on if we should diverge, but cache first behavior of CJS isn't shared by ESM and isn't robust against things like core destructuring the original impls. My like is just that it isn't a confusing situation like with fs/.
ExE-Boss
Feb 8, 2021
•
Author
Contributor
but cache first behavior of CJS isn't shared by ESM and isn't robust against things like core destructuring the original impls.
This is demonstrated by:
const fs = require('fs');
const fakeModule = {};
require.cache.fs = { exports: fakeModule };
assert.strictEqual((await import('fs')).default, fs);
ljharb
Feb 8, 2021
Member
indeed, but that doesn’t mean it’s a good idea to make CJS inconsistent with itself.
bmeck
Mar 5, 2021
Member
I don't think CJS is able to be claimed as consistent with itself since in general the natives don't normally populate the cache. I think it was just ad-hoc written together and the cache behavior is evolutionary not intentional or well understood (even by me).
3634cd4
to
d196d45
| @@ -837,7 +850,8 @@ Module._load = function(request, parent, isMain) { | |||
| }; | |||
|
|
|||
| Module._resolveFilename = function(request, parent, isMain, options) { | |||
| if (NativeModule.canBeRequiredByUsers(request)) { | |||
| if (StringPrototypeStartsWith(request, 'node:') || | |||
| NativeModule.canBeRequiredByUsers(request)) { | |||
guybedford
Feb 8, 2021
Contributor
This bifurcation will have implications for mocking, but I can appreciate the benefit too.
I'd still prefer a more convergent path here eg, to return node:fs for both node:fs and fs inputs, and then to still populate a cache['fs'] entry in the node:fs case as the same object for backwards compatibility. Such a change would hopefully be mostly compatible but would probably need to be a separate major nontheless. Worth thinking about at least.
ExE-Boss
Feb 8, 2021
Author
Contributor
Existing mocking tools (such as Jest) provide their own require(…) implementation, since they need to be able to bypass the mocked module using jest.requireActual(…).
10b08bf
to
8564814
| if (StringPrototypeStartsWith(filename, 'node:')) { | ||
| // Slice 'node:' prefix | ||
| const id = StringPrototypeSlice(filename, 5); | ||
|
|
||
| const module = loadNativeModule(id, request); | ||
| if (!module?.canBeRequiredByUsers) { | ||
| throw new ERR_UNKNOWN_BUILTIN_MODULE(filename); | ||
| } | ||
|
|
||
| return module.exports; | ||
| } |
guybedford
Feb 8, 2021
Contributor
What is the motivation for short-circuiting the cache here, something that has never been done previously for native modules?
I don't see why this scheme should be any different to any other in this regard.
8564814
to
b0fbc91
|
LGTM |
|
Just making sure #37246 (comment) is addressed before landing :) (namely the caveat) - I'm appreciative of the work put in, thanks! Also would like more @nodejs/modules and @nodejs/tsc eyes on this. (The actual changes LGTM) |
|
I've gone ahead and changed the label from I think that this satisfied the concerns folks have about rolling this out into the ecosystem too quickly while also ensuring that it accurately reflects the semveriness of the change. |
Fixes: #36098 Co-authored-by: Antoine du Hamel <duhamelantoine1995@gmail.com> Co-authored-by: Guy Bedford <guybedford@gmail.com> Co-authored-by: Darshan Sen <raisinten@gmail.com> PR-URL: #37246 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
b0fbc91
to
95391fe
|
Landed in b079960...95391fe |
95391fe
into
nodejs:master
|
A lint error was introduced in modules.md with these commits. Please fast-track the PR to fix this: #37811 (Not sure if they were in the regular PR or in a last-minute rebase or caused by some weird ships-crossing-in-the-night interaction with another PR that landed. Not terribly concerned. These things happen. But would like it fixed for an onboarding in a few hours!) |
Notable Changes: Deprecations and Removals - **(SEMVER-MAJOR)** **fs**: remove permissive rmdir recursive (Antoine du Hamel) [#37216] - **(SEMVER-MAJOR)** **fs**: runtime deprecate rmdir recursive option (Antoine du Hamel) [#37302] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('http_parser') (James M Snell) [#37813] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('url') (James M Snell) [#37799] - **(SEMVER-MAJOR)** **lib**: make process.binding('util') return only type checkers (Anna Henningsen) [#37819] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('crypto') (James M Snell) [#37790] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('signal_wrap') (James M Snell) [#37800] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('v8') (James M Snell) [#37789] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('async_wrap') (James M Snell) [#37576] - **(SEMVER-MAJOR)** **module**: remove module.createRequireFromPath (Antoine du Hamel) [#37201] - **(SEMVER-MAJOR)** **module**: runtime deprecate subpath folder mappings (Antoine du Hamel) [#37215] - **(SEMVER-MAJOR)** **module**: runtime deprecate "main" index and extension lookups (Antoine du Hamel) [#37206] - **(SEMVER-MAJOR)** **module**: runtime deprecate invalid package.json main entries (Antoine du Hamel) [#37204] - **(SEMVER-MAJOR)** **process**: runtime deprecate changing process.config (James M Snell) [#36902] Stable Timers Promises API: The Timers Promises API provides an alternative set of timer functions that return Promise objects. Added in Node.js v15.0.0, in this release they graduate from experimental status to stable. Contributed by James Snell - [#38112] Toolchain and Compiler Upgrades: Node.js v16.0.0 will be the first release where we ship prebuilt binaries for Apple Silicon. While we’ll be providing separate tarballs for the Intel (`darwin-x64`) and ARM (`darwin-arm64`) architectures the macOS installer (`.pkg`) will be shipped as a ‘fat’ (multi-architecture) binary. - **(SEMVER-MAJOR)** **build**: remove support for Python 2 (Christian Clauss) [#36691] - **(SEMVER-MAJOR)** **build**: default PYTHON to python3 in Makefile (Michaël Zasso) [#37764] - **build**: update Makefile to support fat binary (Ash Cripps) [#37861] - **(SEMVER-MAJOR)** **build**: enable ASLR (PIE) on OS X (woodfairy) [#35704] - **build**: warn for gcc versions earlier than 8.3.0 (Richard Lau) [#37935] - **(SEMVER-MAJOR)** **doc**: update minimum supported Xcode to 11 (Michaël Zasso) [#37872] - **(SEMVER-MAJOR)** **doc**: update minimum supported GCC to 8.3 (Michaël Zasso) [#37871] - **(SEMVER-MAJOR)** **doc**: update AIX to GCC8 for v16.x (Ash Cripps) [#37677] - **tools**: set arch in Distribution.xml (Ash Cripps) [#38261] V8 9.0: The V8 JavaScript engine is updated to V8 9.0, including performance tweaks and improvements. This update also brings the ECMAScript RegExp Match Indices, which provide the start and end indices of the captured string. The indices array is available via the `.indices` property on match objects when the regular expression has the `/d` flag. Contributed by Michaël Zasso - [#37587] Other Notable Changes: - **(SEMVER-MINOR)** **assert**: graduate assert.match and assert.doesNotMatch (James M Snell) [#38111] - **(SEMVER-MAJOR)** **buffer**: expose btoa and atob as globals (James M Snell) [#37786] - **deps**: update llhttp to 6.0.0 (Fedor Indutny) [#38277] - **deps**: upgrade npm to 7.10.0 (Ruy Adorno) [#38254] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 68 (Michaël Zasso) [#37330] - **(SEMVER-MINOR)** **http**: add http.ClientRequest.getRawHeaderNames() (simov) [#37660] - **(SEMVER-MAJOR)** **lib,src**: update cluster to use Parent (Michael Dawson) [#36478] - **(SEMVER-MINOR)** **module**: add support for `node:`‑prefixed `require(…)` calls (ExE Boss) [#37246] - **(SEMVER-MINOR)** **perf_hooks**: add histogram option to timerify (James M Snell) [#37475] - **(SEMVER-MINOR)** **repl**: add auto‑completion for `node:`‑prefixed `require(…)` calls (ExE Boss) [#37246] - **(SEMVER-MINOR)** **util**: add getSystemErrorMap() impl (eladkeyshawn) [#38101] Semver-Major Commits: - **async_hooks**: add thisArg to AsyncResource.bind (James M Snell) [#36782] - **buffer**: expose btoa and atob as globals (James M Snell) [#37786] - **build**: remove support for Python 2 (Christian Clauss) [#36691] - **build**: default PYTHON to python3 in Makefile (Michaël Zasso) [#37764] - **build**: update Makefile to support fat binary (Ash Cripps) [#37861] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#37587] - **build**: include minimal V8 headers in distribution (Michaël Zasso) [#37570] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#37330] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#36139] - **build**: use C++11 ABI with libstdc++ (Anna Henningsen) [#36634] - **build**: enable ASLR (PIE) on OS X (woodfairy) [#35704] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#35700] - **deps**: V8: cherry-pick 1648e050cade (Michaël Zasso) [#37587] - **deps**: silence irrelevant V8 warnings (Michaël Zasso) [#37587] - **deps**: fix V8 build issue with inline methods (Jiawen Geng) [#35415] - **deps**: make v8.h compatible with VS2015 (Joao Reis) [#32116] - **deps**: V8: forward declaration of `Rtl\*FunctionTable` (Refael Ackermann) [#32116] - **deps**: V8: patch register-arm64.h (Refael Ackermann) [#32116] - **deps**: V8: un-cherry-pick bd019bd (Refael Ackermann) [#32116] - **deps**: update V8 to 9.0.257.11 (Michaël Zasso) [#37587] - **deps**: bump minimum ICU version to 68 (Michaël Zasso) [#37330] - **deps**: V8: cherry-pick 8957d4677aa7 (Michaël Zasso) [#37330] - **deps**: V8: backport a11395433dbd (Michaël Zasso) [#37330] - **deps**: V8: cherry-pick deb0813166f3 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 9a6a22874c81 (Michaël Zasso) [#36139] - **deps**: silence irrelevant V8 warning (Michaël Zasso) [#37330] - **deps**: workaround stod() limitations on SmartOS (Colin Ihrig) [#37330] - **deps**: fix V8 build issue with inline methods (Jiawen Geng) [#35415] - **deps**: patch V8 to run on Xcode 8 (Mary Marchini) [#32116] - **deps**: make v8.h compatible with VS2015 (Joao Reis) [#32116] - **deps**: V8: forward declaration of `Rtl\*FunctionTable` (Refael Ackermann) [#32116] - **deps**: V8: patch register-arm64.h (Refael Ackermann) [#32116] - **deps**: patch V8 to run on older XCode versions (Ujjwal Sharma) [#32116] - **deps**: V8: un-cherry-pick bd019bd (Refael Ackermann) [#32116] - **deps**: update V8 to 8.9.255.19 (Michaël Zasso) [#37330] - **deps**: V8: cherry-pick deb0813166f3 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 9a6a22874c81 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 2059ee813359 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick bde7ee5473d6 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 9a712984025e (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 0b96e5b0bfb2 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick fbb28902e049 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 821fb3883a8e (Michaël Zasso) [#35700] - **deps**: workaround stod() limitations on SmartOS (Colin Ihrig) [#36139] - **deps**: fix V8 build issue with inline methods (Jiawen Geng) [#35415] - **deps**: patch V8 to run on Xcode 8 (Mary Marchini) [#32116] - **deps**: V8: silence irrelevant warnings (Michaël Zasso) [#32116] - **deps**: make v8.h compatible with VS2015 (Joao Reis) [#32116] - **deps**: V8: forward declaration of `Rtl\*FunctionTable` (Refael Ackermann) [#32116] - **deps**: V8: patch register-arm64.h (Refael Ackermann) [#32116] - **deps**: patch V8 to run on older XCode versions (Ujjwal Sharma) [#32116] - **deps**: V8: un-cherry-pick bd019bd (Refael Ackermann) [#32116] - **deps**: update V8 to 8.8.278.17 (Michaël Zasso) [#36139] - **deps**: V8: cherry-pick 821fb3883a8e (Michaël Zasso) [#35700] - **deps**: V8: cherry-pick 45e49775f5a3 (Michaël Zasso) [#35700] - **deps**: V8: cherry-pick 7b3a27b7ae65 (Michaël Zasso) [#35700] - **deps**: V8: cherry-pick d76abfed3512 (Michaël Zasso) [#35415] - **deps**: fix V8 build issue with inline methods (Jiawen Geng) [#35415] - **deps**: update V8 postmortem metadata script (Colin Ihrig) [#35415] - **deps**: update V8 postmortem metadata script (Colin Ihrig) [#33579] - **deps**: patch V8 to run on Xcode 8 (Mary Marchini) [#32116] - **deps**: V8: silence irrelevant warnings (Michaël Zasso) [#32116] - **deps**: make v8.h compatible with VS2015 (Joao Reis) [#32116] - **deps**: V8: forward declaration of `Rtl\*FunctionTable` (Refael Ackermann) [#32116] - **deps**: V8: patch register-arm64.h (Refael Ackermann) [#32116] - **deps**: patch V8 to run on older XCode versions (Ujjwal Sharma) [#32116] - **deps**: V8: un-cherry-pick bd019bd (Refael Ackermann) [#32116] - **deps**: update V8 to 8.7.220 (Michaël Zasso) [#35700] - **dns**: use url module instead of punycode for IDNA (Antoine du Hamel) [#35091] - **doc**: update minimum supported Xcode to 11 (Michaël Zasso) [#37872] - **doc**: update minimum supported GCC to 8.3 (Michaël Zasso) [#37871] - **doc**: update AIX to GCC8 for v16.x (Ash Cripps) [#37677] - **doc**: fixup http.IncomingMessage deprecation code (Guy Bedford) [#36917] - **doc**: add http.IncomingMessage#connection (Pranshu Srivastava) [#33768] - **events**: change EventTarget handler exception behavior (Nitzan Uziely) [#37237] - **fs**: remove permissive rmdir recursive (Antoine du Hamel) [#37216] - **fs**: add validation for fd and path (Dylan Elliott) [#35187] - **fs**: runtime deprecate rmdir recursive option (Antoine du Hamel) [#37302] - **fs**: fix flag and mode validation (James M Snell) [#37480] - **http**: use objects with null prototype in Agent (Michaël Zasso) [#36409] - **lib**: runtime deprecate access to process.binding('http_parser') (James M Snell) [#37813] - **lib**: runtime deprecate access to process.binding('url') (James M Snell) [#37799] - **lib**: make process.binding('util') return only type checkers (Anna Henningsen) [#37819] - **lib**: runtime deprecate access to process.binding('crypto') (James M Snell) [#37790] - **lib**: runtime deprecate access to process.binding('signal_wrap') (James M Snell) [#37800] - **lib**: runtime deprecate access to process.binding('v8') (James M Snell) [#37789] - **lib**: aggregate errors to avoid error swallowing (Antoine du Hamel) [#37460] - **lib**: load v8_prof_processor dependencies as ESM (Michaël Zasso) [#37587] - **lib**: runtime deprecate access to process.binding('async_wrap') (James M Snell) [#37576] - **lib**: remove usage of url.parse (raisinten) [#36853] - **lib**: add error handling for input stream (rexagod) [#31603] - **lib,src**: update cluster to use Parent (Michael Dawson) [#36478] - **module**: runtime deprecate subpath folder mappings (Antoine du Hamel) [#37215] - **module**: runtime deprecate "main" index and extension lookups (Antoine du Hamel) [#37206] - **module**: runtime deprecate invalid package.json main entries (Antoine du Hamel) [#37204] - **module**: remove module.createRequireFromPath (Antoine du Hamel) [#37201] - **module**: only set cache when finding module succeeds (Yongsheng Zhang) [#36642] - **perf_hooks**: make performance a global (James M Snell) [#37970] - **perf_hooks**: complete overhaul of the implementation (James M Snell) [#37136] - **process**: disallow adding options to process.allowedNodeEnvironmentFlags (Antoine du Hamel) [#36660] - **process**: runtime deprecate changing process.config (James M Snell) [#36902] - **readline**: cursorTo throw error on NaN (Zijian Liu) [#36379] - **src**: use non-deprecated GetCreationContext from V8 (Michaël Zasso) [#37587] - **src**: remove V8_FT_ADAPTOR for V8 update (Colin Ihrig) [#37587] - **src**: use non-deprecated V8 module APIs (Michaël Zasso) [#37587] - **src**: update NODE_MODULE_VERSION to 93 (Michaël Zasso) [#37587] - **src**: use non-deprecated V8 module and script APIs (Michaël Zasso) [#37330] - **src**: update NODE_MODULE_VERSION to 92 (Michaël Zasso) [#37330] - **src**: update NODE_MODULE_VERSION to 91 (Michaël Zasso) [#36139] - **src**: mark internally exported functions as explicitly internal (Tyler Ang-Wanek) [#37000] - **src**: inline AsyncCleanupHookHandle in headers (Tyler Ang-Wanek) [#37000] - **src**: fix v8 api deprecation (Jiawen Geng) [#35700] - **src**: update NODE_MODULE_VERSION to 90 (Michaël Zasso) [#35700] - **src**: clean up embedder API (Anna Henningsen) [#35897] - **test**: mark test-return-on-exit as flaky (Michaël Zasso) [#36139] - **test**: mark WASI's test-return-on-exit as flaky (Colin Ihrig) [#36139] - **tools**: update V8 gypfiles for 9.0 (Michaël Zasso) [#37587] - **tools**: update V8 gypfiles for 8.9 (Michaël Zasso) [#37330] - **tools**: update V8 gypfiles for 8.8 (Michaël Zasso) [#36139] - **tools**: update V8 gypfiles for 8.7 (Michaël Zasso) [#35700] - **worker**: send correct error status for worker init (Yash Ladha) [#36242] PR-URL: #37678
Notable changes: Deprecations and Removals: - **(SEMVER-MAJOR)** **fs**: remove permissive rmdir recursive (Antoine du Hamel) [#37216] - **(SEMVER-MAJOR)** **fs**: runtime deprecate rmdir recursive option (Antoine du Hamel) [#37302] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('http_parser') (James M Snell) [#37813] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('url') (James M Snell) [#37799] - **(SEMVER-MAJOR)** **lib**: make process.binding('util') return only type checkers (Anna Henningsen) [#37819] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('crypto') (James M Snell) [#37790] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('signal_wrap') (James M Snell) [#37800] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('v8') (James M Snell) [#37789] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('async_wrap') (James M Snell) [#37576] - **(SEMVER-MAJOR)** **module**: remove module.createRequireFromPath (Antoine du Hamel) [#37201] - **(SEMVER-MAJOR)** **module**: runtime deprecate subpath folder mappings (Antoine du Hamel) [#37215] - **(SEMVER-MAJOR)** **module**: runtime deprecate "main" index and extension lookups (Antoine du Hamel) [#37206] - **(SEMVER-MAJOR)** **module**: runtime deprecate invalid package.json main entries (Antoine du Hamel) [#37204] - **(SEMVER-MAJOR)** **process**: runtime deprecate changing process.config (James M Snell) [#36902] Stable Timers Promises API: The Timers Promises API provides an alternative set of timer functions that return Promise objects. Added in Node.js v15.0.0, in this release they graduate from experimental status to stable. Contributed by James Snell - [#38112] Toolchain and Compiler Upgrades: Node.js v16.0.0 will be the first release where we ship prebuilt binaries for Apple Silicon. While we’ll be providing separate tarballs for the Intel (`darwin-x64`) and ARM (`darwin-arm64`) architectures the macOS installer (`.pkg`) will be shipped as a ‘fat’ (multi-architecture) binary. - **(SEMVER-MAJOR)** **build**: remove support for Python 2 (Christian Clauss) [#36691] - **(SEMVER-MAJOR)** **build**: default PYTHON to python3 in Makefile (Michaël Zasso) [#37764] - **build**: update Makefile to support fat binary (Ash Cripps) [#37861] - **(SEMVER-MAJOR)** **build**: enable ASLR (PIE) on OS X (woodfairy) [#35704] - **build**: warn for gcc versions earlier than 8.3.0 (Richard Lau) [#37935] - **(SEMVER-MAJOR)** **doc**: update minimum supported Xcode to 11 (Michaël Zasso) [#37872] - **(SEMVER-MAJOR)** **doc**: update minimum supported GCC to 8.3 (Michaël Zasso) [#37871] - **(SEMVER-MAJOR)** **doc**: update AIX to GCC8 for v16.x (Ash Cripps) [#37677] - **tools**: set arch in Distribution.xml (Ash Cripps) [#38261] V8 9.0: The V8 JavaScript engine is updated to V8 9.0, including performance tweaks and improvements. This update also brings the ECMAScript RegExp Match Indices, which provide the start and end indices of the captured string. The indices array is available via the `.indices` property on match objects when the regular expression has the `/d` flag. Contributed by Michaël Zasso - [#37587] Other Notable Changes: - **(SEMVER-MINOR)** **assert**: graduate assert.match and assert.doesNotMatch (James M Snell) [#38111] - **(SEMVER-MAJOR)** **buffer**: expose btoa and atob as globals (James M Snell) [#37786] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 68 (Michaël Zasso) [#37330] - **deps**: update ICU to 69.1 (Michaël Zasso) [#38178] - **deps**: update llhttp to 6.0.0 (Fedor Indutny) [#38277] - **deps**: upgrade npm to 7.10.0 (Ruy Adorno) [#38254] - **(SEMVER-MINOR)** **http**: add http.ClientRequest.getRawHeaderNames() (simov) [#37660] - **(SEMVER-MAJOR)** **lib,src**: update cluster to use Parent (Michael Dawson) [#36478] - **(SEMVER-MINOR)** **module**: add support for `node:`‑prefixed `require(…)` calls (ExE Boss) [#37246] - **(SEMVER-MINOR)** **perf_hooks**: add histogram option to timerify (James M Snell) [#37475] - **(SEMVER-MINOR)** **repl**: add auto‑completion for `node:`‑prefixed `require(…)` calls (ExE Boss) [#37246] - **(SEMVER-MINOR)** **util**: add getSystemErrorMap() impl (eladkeyshawn) [#38101] Semver-Major Commits: - **(SEMVER-MAJOR)** **async_hooks**: add thisArg to AsyncResource.bind (James M Snell) [#36782] - **(SEMVER-MAJOR)** **buffer**: expose btoa and atob as globals (James M Snell) [#37786] - **(SEMVER-MAJOR)** **build**: remove support for Python 2 (Christian Clauss) [#36691] - **(SEMVER-MAJOR)** **build**: default PYTHON to python3 in Makefile (Michaël Zasso) [#37764] - **(SEMVER-MAJOR)** **build**: update Makefile to support fat binary (Ash Cripps) [#37861] - **(SEMVER-MAJOR)** **build**: include minimal V8 headers in distribution (Michaël Zasso) [#37570] - **(SEMVER-MAJOR)** **build**: use C++11 ABI with libstdc++ (Anna Henningsen) [#36634] - **(SEMVER-MAJOR)** **build**: enable ASLR (PIE) on OS X (woodfairy) [#35704] - **(SEMVER-MAJOR)** **deps**: update V8 to 9.0.257.11 (Michaël Zasso) [#37587] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 68 (Michaël Zasso) [#37330] - **(SEMVER-MAJOR)** **deps**: update V8 to 8.9.255.19 (Michaël Zasso) [#37330] - **(SEMVER-MAJOR)** **deps**: update V8 to 8.8.278.17 (Michaël Zasso) [#36139] - **(SEMVER-MAJOR)** **deps**: update V8 to 8.7.220 (Michaël Zasso) [#35700] - **(SEMVER-MAJOR)** **dns**: use url module instead of punycode for IDNA (Antoine du Hamel) [#35091] - **(SEMVER-MAJOR)** **doc**: update minimum supported Xcode to 11 (Michaël Zasso) [#37872] - **(SEMVER-MAJOR)** **doc**: update minimum supported GCC to 8.3 (Michaël Zasso) [#37871] - **(SEMVER-MAJOR)** **doc**: update AIX to GCC8 for v16.x (Ash Cripps) [#37677] - **(SEMVER-MAJOR)** **doc**: add http.IncomingMessage#connection (Pranshu Srivastava) [#33768] - **(SEMVER-MAJOR)** **events**: change EventTarget handler exception behavior (Nitzan Uziely) [#37237] - **(SEMVER-MAJOR)** **fs**: remove permissive rmdir recursive (Antoine du Hamel) [#37216] - **(SEMVER-MAJOR)** **fs**: add validation for fd and path (Dylan Elliott) [#35187] - **(SEMVER-MAJOR)** **fs**: runtime deprecate rmdir recursive option (Antoine du Hamel) [#37302] - **(SEMVER-MAJOR)** **fs**: fix flag and mode validation (James M Snell) [#37480] - **(SEMVER-MAJOR)** **http**: use objects with null prototype in Agent (Michaël Zasso) [#36409] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('http_parser') (James M Snell) [#37813] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('url') (James M Snell) [#37799] - **(SEMVER-MAJOR)** **lib**: make process.binding('util') return only type checkers (Anna Henningsen) [#37819] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('crypto') (James M Snell) [#37790] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('signal_wrap') (James M Snell) [#37800] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('v8') (James M Snell) [#37789] - **(SEMVER-MAJOR)** **lib**: aggregate errors to avoid error swallowing (Antoine du Hamel) [#37460] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('async_wrap') (James M Snell) [#37576] - **(SEMVER-MAJOR)** **lib**: remove usage of url.parse (raisinten) [#36853] - **(SEMVER-MAJOR)** **lib**: add error handling for input stream (rexagod) [#31603] - **(SEMVER-MAJOR)** **lib,src**: update cluster to use Parent (Michael Dawson) [#36478] - **(SEMVER-MAJOR)** **module**: runtime deprecate subpath folder mappings (Antoine du Hamel) [#37215] - **(SEMVER-MAJOR)** **module**: runtime deprecate "main" index and extension lookups (Antoine du Hamel) [#37206] - **(SEMVER-MAJOR)** **module**: runtime deprecate invalid package.json main entries (Antoine du Hamel) [#37204] - **(SEMVER-MAJOR)** **module**: remove module.createRequireFromPath (Antoine du Hamel) [#37201] - **(SEMVER-MAJOR)** **module**: only set cache when finding module succeeds (Yongsheng Zhang) [#36642] - **(SEMVER-MAJOR)** **perf_hooks**: make performance a global (James M Snell) [#37970] - **(SEMVER-MAJOR)** **perf_hooks**: complete overhaul of the implementation (James M Snell) [#37136] - **(SEMVER-MAJOR)** **process**: disallow adding options to process.allowedNodeEnvironmentFlags (Antoine du Hamel) [#36660] - **(SEMVER-MAJOR)** **process**: runtime deprecate changing process.config (James M Snell) [#36902] - **(SEMVER-MAJOR)** **readline**: cursorTo throw error on NaN (Zijian Liu) [#36379] - **(SEMVER-MAJOR)** **src**: mark internally exported functions as explicitly internal (Tyler Ang-Wanek) [#37000] - **(SEMVER-MAJOR)** **src**: inline AsyncCleanupHookHandle in headers (Tyler Ang-Wanek) [#37000] - **(SEMVER-MAJOR)** **src**: clean up embedder API (Anna Henningsen) [#35897] - **(SEMVER-MAJOR)** **worker**: send correct error status for worker init (Yash Ladha) [#36242] PR-URL: #37678
Notable changes: Deprecations and Removals: - **(SEMVER-MAJOR)** **fs**: remove permissive rmdir recursive (Antoine du Hamel) [#37216] - **(SEMVER-MAJOR)** **fs**: runtime deprecate rmdir recursive option (Antoine du Hamel) [#37302] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('http_parser') (James M Snell) [#37813] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('url') (James M Snell) [#37799] - **(SEMVER-MAJOR)** **lib**: make process.binding('util') return only type checkers (Anna Henningsen) [#37819] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('crypto') (James M Snell) [#37790] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('signal_wrap') (James M Snell) [#37800] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('v8') (James M Snell) [#37789] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('async_wrap') (James M Snell) [#37576] - **(SEMVER-MAJOR)** **module**: remove module.createRequireFromPath (Antoine du Hamel) [#37201] - **(SEMVER-MAJOR)** **module**: runtime deprecate subpath folder mappings (Antoine du Hamel) [#37215] - **(SEMVER-MAJOR)** **module**: runtime deprecate "main" index and extension lookups (Antoine du Hamel) [#37206] - **(SEMVER-MAJOR)** **module**: runtime deprecate invalid package.json main entries (Antoine du Hamel) [#37204] - **(SEMVER-MAJOR)** **process**: runtime deprecate changing process.config (James M Snell) [#36902] Stable Timers Promises API: The Timers Promises API provides an alternative set of timer functions that return Promise objects. Added in Node.js v15.0.0, in this release they graduate from experimental status to stable. Contributed by James Snell - [#38112] Toolchain and Compiler Upgrades: Node.js v16.0.0 will be the first release where we ship prebuilt binaries for Apple Silicon. While we’ll be providing separate tarballs for the Intel (`darwin-x64`) and ARM (`darwin-arm64`) architectures the macOS installer (`.pkg`) will be shipped as a ‘fat’ (multi-architecture) binary. - **(SEMVER-MAJOR)** **build**: remove support for Python 2 (Christian Clauss) [#36691] - **(SEMVER-MAJOR)** **build**: default PYTHON to python3 in Makefile (Michaël Zasso) [#37764] - **build**: update Makefile to support fat binary (Ash Cripps) [#37861] - **(SEMVER-MAJOR)** **build**: enable ASLR (PIE) on OS X (woodfairy) [#35704] - **build**: warn for gcc versions earlier than 8.3.0 (Richard Lau) [#37935] - **(SEMVER-MAJOR)** **doc**: update minimum supported Xcode to 11 (Michaël Zasso) [#37872] - **(SEMVER-MAJOR)** **doc**: update minimum supported GCC to 8.3 (Michaël Zasso) [#37871] - **(SEMVER-MAJOR)** **doc**: update AIX to GCC8 for v16.x (Ash Cripps) [#37677] - **tools**: set arch in Distribution.xml (Ash Cripps) [#38261] V8 9.0: The V8 JavaScript engine is updated to V8 9.0, including performance tweaks and improvements. This update also brings the ECMAScript RegExp Match Indices, which provide the start and end indices of the captured string. The indices array is available via the `.indices` property on match objects when the regular expression has the `/d` flag. Contributed by Michaël Zasso - [#37587] Other Notable Changes: - **(SEMVER-MINOR)** **assert**: graduate assert.match and assert.doesNotMatch (James M Snell) [#38111] - **(SEMVER-MAJOR)** **buffer**: expose btoa and atob as globals (James M Snell) [#37786] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 68 (Michaël Zasso) [#37330] - **deps**: update ICU to 69.1 (Michaël Zasso) [#38178] - **deps**: update llhttp to 6.0.0 (Fedor Indutny) [#38277] - **deps**: upgrade npm to 7.10.0 (Ruy Adorno) [#38254] - **(SEMVER-MINOR)** **http**: add http.ClientRequest.getRawHeaderNames() (simov) [#37660] - **(SEMVER-MAJOR)** **lib,src**: update cluster to use Parent (Michael Dawson) [#36478] - **(SEMVER-MINOR)** **module**: add support for `node:`‑prefixed `require(…)` calls (ExE Boss) [#37246] - **(SEMVER-MINOR)** **perf_hooks**: add histogram option to timerify (James M Snell) [#37475] - **(SEMVER-MINOR)** **repl**: add auto‑completion for `node:`‑prefixed `require(…)` calls (ExE Boss) [#37246] - **(SEMVER-MINOR)** **util**: add getSystemErrorMap() impl (eladkeyshawn) [#38101] Semver-Major Commits: - **(SEMVER-MAJOR)** **async_hooks**: add thisArg to AsyncResource.bind (James M Snell) [#36782] - **(SEMVER-MAJOR)** **buffer**: expose btoa and atob as globals (James M Snell) [#37786] - **(SEMVER-MAJOR)** **build**: remove support for Python 2 (Christian Clauss) [#36691] - **(SEMVER-MAJOR)** **build**: default PYTHON to python3 in Makefile (Michaël Zasso) [#37764] - **(SEMVER-MAJOR)** **build**: update Makefile to support fat binary (Ash Cripps) [#37861] - **(SEMVER-MAJOR)** **build**: include minimal V8 headers in distribution (Michaël Zasso) [#37570] - **(SEMVER-MAJOR)** **build**: use C++11 ABI with libstdc++ (Anna Henningsen) [#36634] - **(SEMVER-MAJOR)** **build**: enable ASLR (PIE) on OS X (woodfairy) [#35704] - **(SEMVER-MAJOR)** **deps**: update V8 to 9.0.257.11 (Michaël Zasso) [#37587] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 68 (Michaël Zasso) [#37330] - **(SEMVER-MAJOR)** **deps**: update V8 to 8.9.255.19 (Michaël Zasso) [#37330] - **(SEMVER-MAJOR)** **deps**: update V8 to 8.8.278.17 (Michaël Zasso) [#36139] - **(SEMVER-MAJOR)** **deps**: update V8 to 8.7.220 (Michaël Zasso) [#35700] - **(SEMVER-MAJOR)** **dns**: use url module instead of punycode for IDNA (Antoine du Hamel) [#35091] - **(SEMVER-MAJOR)** **doc**: update minimum supported Xcode to 11 (Michaël Zasso) [#37872] - **(SEMVER-MAJOR)** **doc**: update minimum supported GCC to 8.3 (Michaël Zasso) [#37871] - **(SEMVER-MAJOR)** **doc**: update AIX to GCC8 for v16.x (Ash Cripps) [#37677] - **(SEMVER-MAJOR)** **doc**: add http.IncomingMessage#connection (Pranshu Srivastava) [#33768] - **(SEMVER-MAJOR)** **events**: change EventTarget handler exception behavior (Nitzan Uziely) [#37237] - **(SEMVER-MAJOR)** **fs**: remove permissive rmdir recursive (Antoine du Hamel) [#37216] - **(SEMVER-MAJOR)** **fs**: add validation for fd and path (Dylan Elliott) [#35187] - **(SEMVER-MAJOR)** **fs**: runtime deprecate rmdir recursive option (Antoine du Hamel) [#37302] - **(SEMVER-MAJOR)** **fs**: fix flag and mode validation (James M Snell) [#37480] - **(SEMVER-MAJOR)** **http**: use objects with null prototype in Agent (Michaël Zasso) [#36409] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('http_parser') (James M Snell) [#37813] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('url') (James M Snell) [#37799] - **(SEMVER-MAJOR)** **lib**: make process.binding('util') return only type checkers (Anna Henningsen) [#37819] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('crypto') (James M Snell) [#37790] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('signal_wrap') (James M Snell) [#37800] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('v8') (James M Snell) [#37789] - **(SEMVER-MAJOR)** **lib**: aggregate errors to avoid error swallowing (Antoine du Hamel) [#37460] - **(SEMVER-MAJOR)** **lib**: runtime deprecate access to process.binding('async_wrap') (James M Snell) [#37576] - **(SEMVER-MAJOR)** **lib**: remove usage of url.parse (raisinten) [#36853] - **(SEMVER-MAJOR)** **lib**: add error handling for input stream (rexagod) [#31603] - **(SEMVER-MAJOR)** **lib,src**: update cluster to use Parent (Michael Dawson) [#36478] - **(SEMVER-MAJOR)** **module**: runtime deprecate subpath folder mappings (Antoine du Hamel) [#37215] - **(SEMVER-MAJOR)** **module**: runtime deprecate "main" index and extension lookups (Antoine du Hamel) [#37206] - **(SEMVER-MAJOR)** **module**: runtime deprecate invalid package.json main entries (Antoine du Hamel) [#37204] - **(SEMVER-MAJOR)** **module**: remove module.createRequireFromPath (Antoine du Hamel) [#37201] - **(SEMVER-MAJOR)** **module**: only set cache when finding module succeeds (Yongsheng Zhang) [#36642] - **(SEMVER-MAJOR)** **perf_hooks**: make performance a global (James M Snell) [#37970] - **(SEMVER-MAJOR)** **perf_hooks**: complete overhaul of the implementation (James M Snell) [#37136] - **(SEMVER-MAJOR)** **process**: disallow adding options to process.allowedNodeEnvironmentFlags (Antoine du Hamel) [#36660] - **(SEMVER-MAJOR)** **process**: runtime deprecate changing process.config (James M Snell) [#36902] - **(SEMVER-MAJOR)** **readline**: cursorTo throw error on NaN (Zijian Liu) [#36379] - **(SEMVER-MAJOR)** **src**: mark internally exported functions as explicitly internal (Tyler Ang-Wanek) [#37000] - **(SEMVER-MAJOR)** **src**: inline AsyncCleanupHookHandle in headers (Tyler Ang-Wanek) [#37000] - **(SEMVER-MAJOR)** **src**: clean up embedder API (Anna Henningsen) [#35897] - **(SEMVER-MAJOR)** **worker**: send correct error status for worker init (Yash Ladha) [#36242] PR-URL: #37678
|
@ExE-Boss do you mind creating a backport PR for this one? It didn't land cleanly on |
|
@danielleadams I think we should maybe wait a little bit before backporting this to v14.x. It was originally labelled at Semver-Major but we opted to land as Semver-Minor and get some feedback first. I think this makes more sense for the 14.18.0 release rather than 14.17.0 |
Fixes: nodejs#36098 Co-authored-by: Antoine du Hamel <duhamelantoine1995@gmail.com> Co-authored-by: Guy Bedford <guybedford@gmail.com> Co-authored-by: Darshan Sen <raisinten@gmail.com> PR-URL: nodejs#37246 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Refs: nodejs#37178 PR-URL: nodejs#37246 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Refs: nodejs#37178 PR-URL: nodejs#37246 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>


Fixes: #36098 (applies only to commit 1d8c8b7)
Refs: #37178 (applies only to commit b0fbc91)