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

test_runner: exclude test files from coverage by default #56060

Merged
merged 5 commits into from
Dec 17, 2024

Conversation

pmarchini
Copy link
Member

This should address #53508.

I'm opening this PR since #55633 seems to be stale.

This PR contains the feature and some changes to reduce its footprint.

Note: The reason behind lazyMinimatch is to avoid experimental warnings related to matchesGlob.

I'm not entirely convinced about the change I introduced to the --test-coverage-exclude and --test-coverage-include flags.

Regarding:
@cjihrig
#55633 (review)

Another thing that is not clear to me: what happens if someone runs a test file, but that test file imports another file that also includes tests? Should we exclude that imported file from the coverage report, or should we only exclude the files that the user specified?

I think we should just exclude the files specified by the user, as it's the most common scenario.
If a user imports other tests from different files, I would expect them to exclude those manually.
WDYT?

@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/test_runner

@pmarchini pmarchini added the test_runner Issues and PRs related to the test runner subsystem. label Nov 28, 2024
@nodejs-github-bot nodejs-github-bot added the needs-ci PRs that need a full CI run. label Nov 28, 2024
doc/api/test.md Outdated Show resolved Hide resolved
doc/api/test.md Outdated Show resolved Hide resolved
Copy link

codecov bot commented Nov 28, 2024

Codecov Report

Attention: Patch coverage is 89.13043% with 5 lines in your changes missing coverage. Please review.

Project coverage is 88.53%. Comparing base (ce346b6) to head (70be970).
Report is 186 commits behind head on main.

Files with missing lines Patch % Lines
lib/internal/test_runner/utils.js 0.00% 5 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #56060      +/-   ##
==========================================
+ Coverage   88.00%   88.53%   +0.52%     
==========================================
  Files         653      657       +4     
  Lines      188093   190226    +2133     
  Branches    35942    36521     +579     
==========================================
+ Hits       165537   168420    +2883     
+ Misses      15734    14986     -748     
+ Partials     6822     6820       -2     
Files with missing lines Coverage Δ
lib/internal/fs/glob.js 92.63% <100.00%> (+1.93%) ⬆️
lib/internal/test_runner/coverage.js 64.71% <100.00%> (+0.36%) ⬆️
lib/path.js 96.04% <100.00%> (+0.82%) ⬆️
lib/internal/test_runner/utils.js 56.20% <0.00%> (-0.47%) ⬇️

... and 148 files with indirect coverage changes

@JakobJingleheimer
Copy link
Member

I think we should just exclude the files specified by the user, as it's the most common scenario.
If a user imports other tests from different files, I would expect them to exclude those manually.
WDYT?

I agree :)

Copy link
Member

@JakobJingleheimer JakobJingleheimer left a comment

Choose a reason for hiding this comment

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

Thanks for this!

doc/api/cli.md Outdated Show resolved Hide resolved
lib/internal/test_runner/coverage.js Outdated Show resolved Hide resolved
@pmarchini
Copy link
Member Author

I just pushed a new implementation for this feature based on default coverageExcludeGlobs value.

Copy link
Contributor

@cjihrig cjihrig left a comment

Choose a reason for hiding this comment

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

This approach looks a lot better to me. Left a couple minor comments, but otherwise LGTM. Thanks!

@@ -42,6 +42,25 @@ const kLineEndingRegex = /\r?\n$/u;
const kLineSplitRegex = /(?<=\r?\n)/u;
const kStatusRegex = /\/\* node:coverage (?<status>enable|disable) \*\//;

let minimatch;
Copy link
Contributor

Choose a reason for hiding this comment

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

Is all of this to avoid the experimental warning? If so, maybe we should create a flag in the internal glob() function to skip the warning instead of duplicating the code.

Copy link
Member Author

Choose a reason for hiding this comment

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

yes it is 😞
I tried without luck to add a flag or something to prevent the warning in case of internal usage but I didn't find a decent solution.
Do you know if we have something similar around in the codebase?

Copy link
Contributor

Choose a reason for hiding this comment

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

It looks like matchesGlob() calls an internal glob() function. I would move glob() to internal/ and add a flag to that function.

Copy link
Member Author

Choose a reason for hiding this comment

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

Ok, thanks, I'll take a look ASAP 🚀

Copy link
Member Author

@pmarchini pmarchini Dec 11, 2024

Choose a reason for hiding this comment

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

I've just realised that in another part of the runner, we're using a different approach:

#47653

This includes a lean implementation of https://github.com/isaacs/node-glob on top of minimatch (added at #47499).
This is marked as [semver-major]( semver-major PRs that contain breaking changes and should be released in the next major version. ) since a couple of edge cases will produce a different list of tests, such as file names containing *.

I'm just going to replace matchesGlob with lib/internal/fs/glob.js, as we are doing in the test files glob.

Edit: I think it's better to go with

It looks like matchesGlob() calls an internal glob() function. I would move glob() to internal/ and add a flag to that function.

Copy link
Member Author

Choose a reason for hiding this comment

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

I moved glob to internal/fs/glob but I'm not entirely convinced about the naming:

module.exports = {
  __proto__: null,
  Glob,
  glob,
};

@@ -171,7 +171,12 @@ const tests = [
name: 'test-runner/output/source_mapped_locations.mjs',
flags: ['--test-reporter=tap'],
},
process.features.inspector ? { name: 'test-runner/output/lcov_reporter.js', transform: lcovTransform } : false,
process.features.inspector ?
Copy link
Contributor

Choose a reason for hiding this comment

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

Are there any new tests for this functionality? It seems like the existing tests were all updated to continue working, but nothing new was added.

Copy link
Member Author

Choose a reason for hiding this comment

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

Hey @cjihrig, not yet.
Currently, since our tests are located under the test/** path, they are excluded by default from the coverage output.

I was planning to add a test to validate that defaults are being set, but it seems I'll need to test the parseCommandLine() utility instead. Do you think that’s enough?

I don’t think we currently have a way to assert test configurations (I’m not sure about this, I’ll take a look tonight).

Copy link
Contributor

Choose a reason for hiding this comment

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

Currently, since our tests are located under the test/** path, they are excluded by default from the coverage output.

What if you use the tmpdir module, copy files into that, and use that as the working directory?

Copy link
Member Author

Choose a reason for hiding this comment

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

sure, makes sense 🚀 !
I'll take a look asap!

Copy link
Member Author

Choose a reason for hiding this comment

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

done!

Copy link
Contributor

@cjihrig cjihrig left a comment

Choose a reason for hiding this comment

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

LGTM once the final issues are addressed and the CI passes.

lib/path.js Outdated Show resolved Hide resolved
@pmarchini pmarchini added the request-ci Add this label to start a Jenkins CI on a PR. label Dec 12, 2024
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Dec 12, 2024
@nodejs-github-bot
Copy link
Collaborator

@pmarchini pmarchini added the request-ci Add this label to start a Jenkins CI on a PR. label Dec 13, 2024
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Dec 13, 2024
@nodejs-github-bot
Copy link
Collaborator

@pmarchini pmarchini added the request-ci Add this label to start a Jenkins CI on a PR. label Dec 14, 2024
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Dec 14, 2024
@nodejs-github-bot
Copy link
Collaborator

Copy link
Member

@mcollina mcollina left a comment

Choose a reason for hiding this comment

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

lgtm

@nodejs-github-bot
Copy link
Collaborator

@pmarchini pmarchini added commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. author ready PRs that have at least one approval, no pending requests for changes, and a CI started. labels Dec 15, 2024
@pmarchini pmarchini added the commit-queue Add this label to land a pull request using GitHub Actions. label Dec 17, 2024
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Dec 17, 2024
@nodejs-github-bot nodejs-github-bot merged commit 5ad2ca9 into nodejs:main Dec 17, 2024
68 checks passed
@nodejs-github-bot
Copy link
Collaborator

Landed in 5ad2ca9

aduh95 pushed a commit that referenced this pull request Dec 18, 2024
PR-URL: #56060
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Moshe Atlow <[email protected]>
aduh95 pushed a commit that referenced this pull request Dec 18, 2024
PR-URL: #56060
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Moshe Atlow <[email protected]>
@Llorx
Copy link

Llorx commented Dec 20, 2024

I think that this one's footprint is worse than the previous one as it touches a lot of different files outside of the test runner folder, like fs and path. I don't know why the other one went stale actually. Noone replied anything and then I found another PR which adresses the same feature but with a more scattered footprint. Being my first PR I was happy about following any indication, it was constructive for me, but then I find this... :-(

Apart from the footprint being too scattered (personal opinion), it doesn't seem that it excludes test files by default. It excludes a matching pattern by default, but if I change the globPatterns to include different patterns, those files are not excluded, which breaks the "exclude test files by default" feature. This is more a "there's a exclude pattern by default" but not "exclude test files by default".

Also, it doesn't exclude a test file ran by cli by default, and if you pass a test file array programmatically neither. That's why my approach was moving the final calculated testfiles array around, so it actually excludes test files by default. This PR and the other PR doesn't address the same feature.

@pmarchini
Copy link
Member Author

Hey @Llorx, I proceeded as I saw no activity. I meant no offense 😞

Regarding the implementation footprint, the rationale behind the fs and path changes is that we decided to avoid a warning message related to glob usage.

The implementation follows the same logic as other tools, such as c8, and is based on the default exclusion mechanisms.

@Llorx
Copy link

Llorx commented Dec 20, 2024

Thank you for replying @pmarchini

I see your point now, specially the footprint. Didn't read this thread actually, just the diff and went directly to comment. Hot blooded I guess as I was hyped to be a small collaborator. To "have my bit of code in nodejs" haha. Sorry about that.

I understand the include/exclude logic as other tools. Is just an opinion as I prefer for a tool to be the less verbose as possible in a normal usage. For example, if I do a default test with the default options I see that the test files are not included in the coverage output (which is something expected, I guess), but if I change the include pattern for whatever reason I notice that they are included (not that expected as it differs from the default behaviour, and the coverage output is a feature directly linked to running tests), so I have to search why, and then add more arguments which they are going to be an exact copy of the files include pattern, which makes me feel that the coverage output is not that linked to the test runner anymore, like it is a different tool that needs its own parameters, although it is listed inside the test runner documentation. Obviously that's an opinion and I'm no collaborator, so I don't know what is the philosophy in nodejs about these things.

Maybe an easy way to do this (if is something that fits the nodejs philosophy) but without transfering the test files array along all the testing line down to the coverage one (a mid-point between one PR and the other), the default coverage exclude pattern could be the same pattern as the include pattern provided by the user (that's something that was already pointed before in the original issue), although this leaves running tests directly by the cli or programmatically with the run({files:[...]}) option unattended... but covers the majority of the test runner usage, which is by running using the node --test argument.

IDK just debating. Obviosuly, if my position is not clear enough, I would prefer it this way haha.

@pmarchini
Copy link
Member Author

@Llorx don't worry, I totally understand your position, and I'm sorry you felt that way.
I am sure that you will have a chance, and if you would like to contribute, #56316 <-- this is an issue I was planning to work on. If you want to go ahead with it, I'm happy to support you 😁

Regarding setting the value equal to the input could be a solution, but I feel it would be misaligned with other similar tools.
That said, I see no reason not to open a PR with your suggestion and see what other collaborators think 🚀

tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Dec 21, 2024
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [node](https://nodejs.org) ([source](https://github.com/nodejs/node)) | minor | `23.4.0` -> `23.5.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

### [`v23.5.0`](https://github.com/nodejs/node/releases/tag/v23.5.0): 2024-12-19, Version 23.5.0 (Current), @&#8203;aduh95

[Compare Source](nodejs/node@v23.4.0...v23.5.0)

##### Notable Changes

##### WebCryptoAPI [`Ed25519`](nodejs/node@Ed25519) and X25519 algorithms are now stable

Following the merge of Curve25519 into the
[Web Cryptography API Editor's Draft](https://w3c.github.io/webcrypto/) the
`Ed25519` and `X25519` algorithm identifiers are now stable and will no longer
emit an ExperimentalWarning upon use.

Contributed by Filip Skokan in [#&#8203;56142](nodejs/node#56142).

##### On-thread hooks are back

This release introduces `module.registerHooks()` for registering module loader
customization hooks that are run for all modules loaded by `require()`, `import`
and functions returned by `createRequire()` in the same thread, which makes them
easier for CJS monkey-patchers to migrate to.

```mjs
import assert from 'node:assert';
import { registerHooks, createRequire } from 'node:module';
import { writeFileSync } from 'node:fs';

writeFileSync('./bar.js', 'export const id = 123;', 'utf8');

registerHooks({
  resolve(specifier, context, nextResolve) {
    const replaced = specifier.replace('foo', 'bar');
    return nextResolve(replaced, context);
  },
  load(url, context, nextLoad) {
    const result = nextLoad(url, context);
    return {
      ...result,
      source: result.source.toString().replace('123', '456'),
    };
  },
});

// Checks that it works with require.
const require = createRequire(import.meta.url);
const required = require('./foo.js');  // Redirected by resolve hook to bar.js
assert.strictEqual(required.id, 456);  // Replaced by load hook to 456

// Checks that it works with import.
const imported = await import('./foo.js');  // Redirected by resolve hook to bar.js
assert.strictEqual(imported.id, 456);  // Replaced by load hook to 456
```

This complements the `module.register()` hooks - the new hooks fit better
internally and cover all corners in the module graph; whereas
`module.register()` previously could not cover `require()` while it was
on-thread, and still cannot cover `createRequire()` after being moved
off-thread.

They are also run in the same thread as the modules being loaded and where the
hooks are registered, which means they are easier to debug (no more
`console.log()` getting lost) and do not have the many deadlock issues haunting
the `module.register()` hooks. The new API also takes functions directly so that
it's easier for intermediate loader packages to take user options from files
that the hooks can't be aware of, like many existing CJS monkey-patchers do.

Contributed by Joyee Cheung in [#&#8203;55698](nodejs/node#55698).

##### Other notable changes

-   \[[`59cae91465`](nodejs/node@59cae91465)] - **(SEMVER-MINOR)** **dgram**: support blocklist in udp (theanarkh) [#&#8203;56087](nodejs/node#56087)
-   \[[`72f79b44ed`](nodejs/node@72f79b44ed)] - **doc**: stabilize util.styleText (Rafael Gonzaga) [#&#8203;56265](nodejs/node#56265)
-   \[[`b5a2c0777d`](nodejs/node@b5a2c0777d)] - **(SEMVER-MINOR)** **module**: add prefix-only modules to `module.builtinModules` (Jordan Harband) [#&#8203;56185](nodejs/node#56185)
-   \[[`9863d27566`](nodejs/node@9863d27566)] - **(SEMVER-MINOR)** **module**: only emit require(esm) warning under --trace-require-module (Joyee Cheung) [#&#8203;56194](nodejs/node#56194)
-   \[[`8e780bc5ae`](nodejs/node@8e780bc5ae)] - **(SEMVER-MINOR)** **module**: use synchronous hooks for preparsing in import(cjs) (Joyee Cheung) [#&#8203;55698](nodejs/node#55698)
-   \[[`65bc8e847f`](nodejs/node@65bc8e847f)] - **(SEMVER-MINOR)** **report**: fix typos in report keys and bump the version (Yuan-Ming Hsu) [#&#8203;56068](nodejs/node#56068)
-   \[[`0ab36e1937`](nodejs/node@0ab36e1937)] - **(SEMVER-MINOR)** **sqlite**: aggregate constants in a single property (Edigleysson Silva (Edy)) [#&#8203;56213](nodejs/node#56213)
-   \[[`efcc5d90c5`](nodejs/node@efcc5d90c5)] - **(SEMVER-MINOR)** **src,lib**: stabilize permission model (Rafael Gonzaga) [#&#8203;56201](nodejs/node#56201)

##### Commits

-   \[[`2314e4916e`](nodejs/node@2314e4916e)] - **assert**: make Maps be partially compared in partialDeepStrictEqual (Giovanni Bucci) [#&#8203;56195](nodejs/node#56195)
-   \[[`cfbdff7b45`](nodejs/node@cfbdff7b45)] - **assert**: make partialDeepStrictEqual work with ArrayBuffers (Giovanni Bucci) [#&#8203;56098](nodejs/node#56098)
-   \[[`f264dd6d20`](nodejs/node@f264dd6d20)] - **buffer**: document concat zero-fill (Duncan) [#&#8203;55562](nodejs/node#55562)
-   \[[`4831b87d83`](nodejs/node@4831b87d83)] - **build**: set DESTCPU correctly for 'make binary' on loongarch64 (吴小白) [#&#8203;56271](nodejs/node#56271)
-   \[[`1497bb405e`](nodejs/node@1497bb405e)] - **build**: fix missing fp16 dependency in d8 builds (Joyee Cheung) [#&#8203;56266](nodejs/node#56266)
-   \[[`445c8c7489`](nodejs/node@445c8c7489)] - **build**: add major release action (Rafael Gonzaga) [#&#8203;56199](nodejs/node#56199)
-   \[[`f4faedfa69`](nodejs/node@f4faedfa69)] - **build**: fix C string encoding for `PRODUCT_DIR_ABS` (Anna Henningsen) [#&#8203;56111](nodejs/node#56111)
-   \[[`6f49c8006c`](nodejs/node@6f49c8006c)] - **build**: use variable for simdutf path (Shelley Vohr) [#&#8203;56196](nodejs/node#56196)
-   \[[`fcaa2c82a6`](nodejs/node@fcaa2c82a6)] - **build**: fix GN build on macOS (Joyee Cheung) [#&#8203;56141](nodejs/node#56141)
-   \[[`08e5309f4f`](nodejs/node@08e5309f4f)] - ***Revert*** "**build**: avoid compiling with VS v17.12" (Gerhard Stöbich) [#&#8203;56151](nodejs/node#56151)
-   \[[`c2fb38cfdf`](nodejs/node@c2fb38cfdf)] - **crypto**: graduate WebCryptoAPI [`Ed25519`](nodejs/node@Ed25519) and X25519 algorithms as stable (Filip Skokan) [#&#8203;56142](nodejs/node#56142)
-   \[[`8658833884`](nodejs/node@8658833884)] - **deps**: update nghttp3 to 1.6.0 (Node.js GitHub Bot) [#&#8203;56258](nodejs/node#56258)
-   \[[`7c941d4610`](nodejs/node@7c941d4610)] - **deps**: update simdutf to 5.6.4 (Node.js GitHub Bot) [#&#8203;56255](nodejs/node#56255)
-   \[[`4e9113eada`](nodejs/node@4e9113eada)] - **deps**: update libuv to 1.49.2 (Luigi Pinca) [#&#8203;56224](nodejs/node#56224)
-   \[[`db6aba12e4`](nodejs/node@db6aba12e4)] - **deps**: update c-ares to v1.34.4 (Node.js GitHub Bot) [#&#8203;56256](nodejs/node#56256)
-   \[[`25bb462bc2`](nodejs/node@25bb462bc2)] - **deps**: define V8\_PRESERVE_MOST as no-op on Windows (Stefan Stojanovic) [#&#8203;56238](nodejs/node#56238)
-   \[[`54308c51bb`](nodejs/node@54308c51bb)] - **deps**: update sqlite to 3.47.2 (Node.js GitHub Bot) [#&#8203;56178](nodejs/node#56178)
-   \[[`59cae91465`](nodejs/node@59cae91465)] - **(SEMVER-MINOR)** **dgram**: support blocklist in udp (theanarkh) [#&#8203;56087](nodejs/node#56087)
-   \[[`52c18e605e`](nodejs/node@52c18e605e)] - **doc**: fix color contrast issue in light mode (Rich Trott) [#&#8203;56272](nodejs/node#56272)
-   \[[`72f79b44ed`](nodejs/node@72f79b44ed)] - **doc**: stabilize util.styleText (Rafael Gonzaga) [#&#8203;56265](nodejs/node#56265)
-   \[[`0d08756d0c`](nodejs/node@0d08756d0c)] - **doc**: clarify util.aborted resource usage (Kunal Kumar) [#&#8203;55780](nodejs/node#55780)
-   \[[`f94f21080b`](nodejs/node@f94f21080b)] - **doc**: add esm examples to node:repl (Alfredo González) [#&#8203;55432](nodejs/node#55432)
-   \[[`7a10ef88d9`](nodejs/node@7a10ef88d9)] - **doc**: add esm examples to node:readline (Alfredo González) [#&#8203;55335](nodejs/node#55335)
-   \[[`cc7a7c391b`](nodejs/node@cc7a7c391b)] - **doc**: fix 'which' to 'that' and add commas (Selveter Senitro) [#&#8203;56216](nodejs/node#56216)
-   \[[`c5b086250e`](nodejs/node@c5b086250e)] - **doc**: fix winget config path (Alex Yang) [#&#8203;56233](nodejs/node#56233)
-   \[[`71c38a24d4`](nodejs/node@71c38a24d4)] - **doc**: add esm examples to node:tls (Alfredo González) [#&#8203;56229](nodejs/node#56229)
-   \[[`394fffbbde`](nodejs/node@394fffbbde)] - **doc**: add esm examples to node:perf_hooks (Alfredo González) [#&#8203;55257](nodejs/node#55257)
-   \[[`7b2a6ee61e`](nodejs/node@7b2a6ee61e)] - **doc**: `sea.getRawAsset(key)` always returns an ArrayBuffer (沈鸿飞) [#&#8203;56206](nodejs/node#56206)
-   \[[`8092dcf27e`](nodejs/node@8092dcf27e)] - **doc**: update announce documentation for releases (Rafael Gonzaga) [#&#8203;56200](nodejs/node#56200)
-   \[[`2974667815`](nodejs/node@2974667815)] - **doc**: update blog link to /vulnerability (Rafael Gonzaga) [#&#8203;56198](nodejs/node#56198)
-   \[[`f3b3ff85e0`](nodejs/node@f3b3ff85e0)] - **doc**: call out import.meta is only supported in ES modules (Anton Kastritskii) [#&#8203;56186](nodejs/node#56186)
-   \[[`a9e67280e7`](nodejs/node@a9e67280e7)] - **doc**: add ambassador message - benefits of Node.js (Michael Dawson) [#&#8203;56085](nodejs/node#56085)
-   \[[`e4922ab15f`](nodejs/node@e4922ab15f)] - **doc**: fix incorrect link to style guide (Yuan-Ming Hsu) [#&#8203;56181](nodejs/node#56181)
-   \[[`114a3e5a05`](nodejs/node@114a3e5a05)] - **doc**: fix c++ addon hello world sample (Edigleysson Silva (Edy)) [#&#8203;56172](nodejs/node#56172)
-   \[[`f1c2d2f65e`](nodejs/node@f1c2d2f65e)] - **doc**: update blog release-post link (Ruy Adorno) [#&#8203;56123](nodejs/node#56123)
-   \[[`d48b5224c0`](nodejs/node@d48b5224c0)] - **doc**: fix module.md headings (Chengzhong Wu) [#&#8203;56131](nodejs/node#56131)
-   \[[`4cc0493a0b`](nodejs/node@4cc0493a0b)] - **fs**: make mutating `options` in Callback `readdir()` not affect results (LiviaMedeiros) [#&#8203;56057](nodejs/node#56057)
-   \[[`8d485f1c09`](nodejs/node@8d485f1c09)] - **fs**: make mutating `options` in Promises `readdir()` not affect results (LiviaMedeiros) [#&#8203;56057](nodejs/node#56057)
-   \[[`595851b5ed`](nodejs/node@595851b5ed)] - **fs,win**: fix readdir for named pipe (Hüseyin Açacak) [#&#8203;56110](nodejs/node#56110)
-   \[[`075b36b7b4`](nodejs/node@075b36b7b4)] - **http**: add setDefaultHeaders option to http.request (Tim Perry) [#&#8203;56112](nodejs/node#56112)
-   \[[`febd969c46`](nodejs/node@febd969c46)] - **http2**: remove duplicate codeblock (Vitaly Aminev) [#&#8203;55915](nodejs/node#55915)
-   \[[`b0ebd23e52`](nodejs/node@b0ebd23e52)] - **http2**: support ALPNCallback option (ZYSzys) [#&#8203;56187](nodejs/node#56187)
-   \[[`f10239fde7`](nodejs/node@f10239fde7)] - **lib**: remove redundant global regexps (Gürgün Dayıoğlu) [#&#8203;56182](nodejs/node#56182)
-   \[[`fd55d3cbdd`](nodejs/node@fd55d3cbdd)] - **lib**: clean up persisted signals when they are settled (Edigleysson Silva (Edy)) [#&#8203;56001](nodejs/node#56001)
-   \[[`889094fdbc`](nodejs/node@889094fdbc)] - **lib**: handle Float16Array in node:v8 serdes (Bartek Iwańczuk) [#&#8203;55996](nodejs/node#55996)
-   \[[`5aec513207`](nodejs/node@5aec513207)] - **lib**: disable default memory leak warning for AbortSignal (Lenz Weber-Tronic) [#&#8203;55816](nodejs/node#55816)
-   \[[`b5a2c0777d`](nodejs/node@b5a2c0777d)] - **(SEMVER-MINOR)** **module**: add prefix-only modules to `module.builtinModules` (Jordan Harband) [#&#8203;56185](nodejs/node#56185)
-   \[[`9863d27566`](nodejs/node@9863d27566)] - **(SEMVER-MINOR)** **module**: only emit require(esm) warning under --trace-require-module (Joyee Cheung) [#&#8203;56194](nodejs/node#56194)
-   \[[`5665e86da6`](nodejs/node@5665e86da6)] - **module**: prevent main thread exiting before esm worker ends (Shima Ryuhei) [#&#8203;56183](nodejs/node#56183)
-   \[[`8e780bc5ae`](nodejs/node@8e780bc5ae)] - **(SEMVER-MINOR)** **module**: use synchronous hooks for preparsing in import(cjs) (Joyee Cheung) [#&#8203;55698](nodejs/node#55698)
-   \[[`e5bb6c2303`](nodejs/node@e5bb6c2303)] - **(SEMVER-MINOR)** **module**: implement module.registerHooks() (Joyee Cheung) [#&#8203;55698](nodejs/node#55698)
-   \[[`f883bedceb`](nodejs/node@f883bedceb)] - **node-api**: allow napi_delete_reference in finalizers (Chengzhong Wu) [#&#8203;55620](nodejs/node#55620)
-   \[[`65bc8e847f`](nodejs/node@65bc8e847f)] - **(SEMVER-MINOR)** **report**: fix typos in report keys and bump the version (Yuan-Ming Hsu) [#&#8203;56068](nodejs/node#56068)
-   \[[`a6f0cfa468`](nodejs/node@a6f0cfa468)] - **sea**: only assert snapshot main function for main threads (Joyee Cheung) [#&#8203;56120](nodejs/node#56120)
-   \[[`0ab36e1937`](nodejs/node@0ab36e1937)] - **(SEMVER-MINOR)** **sqlite**: aggregate constants in a single property (Edigleysson Silva (Edy)) [#&#8203;56213](nodejs/node#56213)
-   \[[`4745798225`](nodejs/node@4745798225)] - **sqlite**: add support for custom functions (Colin Ihrig) [#&#8203;55985](nodejs/node#55985)
-   \[[`53cc0cc744`](nodejs/node@53cc0cc744)] - **sqlite**: support `db.loadExtension` (Alex Yang) [#&#8203;53900](nodejs/node#53900)
-   \[[`3968599702`](nodejs/node@3968599702)] - **src**: fix outdated js2c.cc references (Chengzhong Wu) [#&#8203;56133](nodejs/node#56133)
-   \[[`efcc5d90c5`](nodejs/node@efcc5d90c5)] - **(SEMVER-MINOR)** **src,lib**: stabilize permission model (Rafael Gonzaga) [#&#8203;56201](nodejs/node#56201)
-   \[[`a4a83613cb`](nodejs/node@a4a83613cb)] - **stream**: commit pull-into descriptors after filling from queue (Mattias Buelens) [#&#8203;56072](nodejs/node#56072)
-   \[[`3298ef4891`](nodejs/node@3298ef4891)] - **test**: remove test-sqlite-statement-sync flaky designation (Luigi Pinca) [#&#8203;56051](nodejs/node#56051)
-   \[[`1d8cc6179d`](nodejs/node@1d8cc6179d)] - **test**: use --permission over --experimental-permission (Rafael Gonzaga) [#&#8203;56239](nodejs/node#56239)
-   \[[`5d252b7a67`](nodejs/node@5d252b7a67)] - **test**: remove exludes for sea tests on PPC (Michael Dawson) [#&#8203;56217](nodejs/node#56217)
-   \[[`8288f57724`](nodejs/node@8288f57724)] - **test**: fix test-abortsignal-drop-settled-signals flakiness (Edigleysson Silva (Edy)) [#&#8203;56197](nodejs/node#56197)
-   \[[`683cc15796`](nodejs/node@683cc15796)] - **test**: move localizationd data from `test-icu-env` to external file (Livia Medeiros) [#&#8203;55618](nodejs/node#55618)
-   \[[`a0c4a5f122`](nodejs/node@a0c4a5f122)] - **test**: update WPT for url to [`6fa3fe8`](nodejs/node@6fa3fe8a92) (Node.js GitHub Bot) [#&#8203;56136](nodejs/node#56136)
-   \[[`a0e3926285`](nodejs/node@a0e3926285)] - **test**: remove `hasOpenSSL3x` utils (Antoine du Hamel) [#&#8203;56164](nodejs/node#56164)
-   \[[`041a49094e`](nodejs/node@041a49094e)] - **test**: update streams wpt (Mattias Buelens) [#&#8203;56072](nodejs/node#56072)
-   \[[`ea9a675f56`](nodejs/node@ea9a675f56)] - **test_runner**: exclude test files from coverage by default (Pietro Marchini) [#&#8203;56060](nodejs/node#56060)
-   \[[`118cd9998f`](nodejs/node@118cd9998f)] - **tools**: fix `node:` enforcement for docs (Antoine du Hamel) [#&#8203;56284](nodejs/node#56284)
-   \[[`c4c56daae8`](nodejs/node@c4c56daae8)] - **tools**: update github_reporter to 1.7.2 (Node.js GitHub Bot) [#&#8203;56205](nodejs/node#56205)
-   \[[`78743b1533`](nodejs/node@78743b1533)] - **tools**: add REPLACEME check to workflow (Mert Can Altin) [#&#8203;56251](nodejs/node#56251)
-   \[[`002ee71d9b`](nodejs/node@002ee71d9b)] - **tools**: use `github.actor` instead of bot username for release proposals (Antoine du Hamel) [#&#8203;56232](nodejs/node#56232)
-   \[[`d25d16efeb`](nodejs/node@d25d16efeb)] - ***Revert*** "**tools**: disable automated libuv updates" (Luigi Pinca) [#&#8203;56223](nodejs/node#56223)
-   \[[`b395e0c8c9`](nodejs/node@b395e0c8c9)] - **tools**: update gyp-next to 0.19.1 (Anna Henningsen) [#&#8203;56111](nodejs/node#56111)
-   \[[`a5aaf31c50`](nodejs/node@a5aaf31c50)] - **tools**: fix release proposal linter to support more than 1 folk preparing (Antoine du Hamel) [#&#8203;56203](nodejs/node#56203)
-   \[[`fa667d609e`](nodejs/node@fa667d609e)] - **tools**: remove has_absl_stringify from gyp file (Michaël Zasso) [#&#8203;56157](nodejs/node#56157)
-   \[[`65b541e70e`](nodejs/node@65b541e70e)] - **tools**: enable linter for `tools/icu/**` (Livia Medeiros) [#&#8203;56176](nodejs/node#56176)
-   \[[`28a4b6ff58`](nodejs/node@28a4b6ff58)] - **tools**: use commit title as MR title when creating release proposal (Antoine du Hamel) [#&#8203;56165](nodejs/node#56165)
-   \[[`e20eef659f`](nodejs/node@e20eef659f)] - **tools**: update gyp-next to 0.19.0 (Node.js GitHub Bot) [#&#8203;56158](nodejs/node#56158)
-   \[[`efcc829085`](nodejs/node@efcc829085)] - **tools**: bump the eslint group in /tools/eslint with 4 updates (dependabot\[bot]) [#&#8203;56099](nodejs/node#56099)
-   \[[`5620b2be8a`](nodejs/node@5620b2be8a)] - **tools**: improve release proposal MR opening (Antoine du Hamel) [#&#8203;56161](nodejs/node#56161)
-   \[[`3e17a8e78e`](nodejs/node@3e17a8e78e)] - **util**: harden more built-in classes against prototype pollution (Antoine du Hamel) [#&#8203;56225](nodejs/node#56225)
-   \[[`13815417c7`](nodejs/node@13815417c7)] - **util**: fix Latin1 decoding to return string output (Mert Can Altin) [#&#8203;56222](nodejs/node#56222)
-   \[[`77397c5013`](nodejs/node@77397c5013)] - **util**: do not rely on mutable `Object` and `Function`' `constructor` prop (Antoine du Hamel) [#&#8203;56188](nodejs/node#56188)
-   \[[`84f98e0a74`](nodejs/node@84f98e0a74)] - **v8,tools**: expose experimental wasm revectorize feature (Yolanda-Chen) [#&#8203;54896](nodejs/node#54896)
-   \[[`8325fa5c04`](nodejs/node@8325fa5c04)] - **worker**: fix crash when a worker joins after exit (Stephen Belanger) [#&#8203;56191](nodejs/node#56191)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS43Ny4wIiwidXBkYXRlZEluVmVyIjoiMzkuNzcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
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. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. needs-ci PRs that need a full CI run. test_runner Issues and PRs related to the test runner subsystem.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants