Repository navigation
Conversation
… letters `--watch`, `--hot` and `bun test --watch` did not watch a project file whose path only holds the letters `node_modules`: a project in a folder named `node_modules-cleaner`, a file named `list-node_modules.js`, a directory named `node_modules_helpers`. The six gates of the watcher tested `strings::contains(path, b"node_modules")`. `bun_paths` gets one component test in two forms, one for the path of a file and one for the path of a directory. `ImportWatcher::add_file` holds the rule for the modules that the runtime loads, so the three loader sites drop their copy. `Watcher::is_eligible_directory` holds the rule for directories, and the resolver's directory callback calls it. A source lint keeps the bare test out of the watcher.
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Path component detection src/paths/string_paths.rs, src/paths/resolve_path.rs |
Added file and directory checks that match node_modules as a complete path component. Added Posix and Windows tests for component boundaries and separators. |
Watcher registration and descriptor ownership src/runtime/jsc_hooks.rs, src/watcher/Watcher.rs, src/jsc/hot_reloader.rs, src/jsc/RuntimeTranspilerStore.rs |
File and directory watcher eligibility now uses path-aware checks. ImportWatcher::add_file declines registration for paths inside node_modules and returns caller-owned descriptor status. Transpiler call paths no longer filter those paths before calling the watcher. |
Watch behavior tests test/cli/watch/watch.test.ts, test/internal/source-lints/watcher-node-modules-needle.test.ts |
Added CLI tests for paths containing node_modules, including watch, hot-reload, test-watch, and build-watch cases. Added a source lint for literal substring searches. |
Suggested reviewers: jarred-sumner, dylan-conway
Priority:
Merge Risk: 
Minimal · up to 9c6c8
-
No actionable issue remains in the supplied review evidence; this change is mergeable after normal checks.
Pre-merge checks: 
4
-
Full details: Description check
-
Explanation
The description follows the template with both required sections, "What does this PR do?" (as "Problem", "Fix", "Background", "Downsides") and "How did you verify your code works?" (as "Tests", "Measurements", "Suites run on the debug build"). It is detailed and specific: it names the bug, the affected gates, the repro, the fix, the tests added, the tradeoffs, and the mutation checks. Its main gap is that the verification relies on platform-specific tests that do not run on the author's machine, which the evidence block flags as "no test proof". Remediation needs a confirmation from CI, not a rewrite. The description is long and includes a large details block, but the content is on topic and mostly complete.
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
|
Status: ready for review. How it was reproduced, on bun 1.4.3-canary.1 (367d939) and on main a8b5e92, Linux x64:
Nothing reloads and nothing is printed. The same project in a folder named A fuzz run on this PR then found two cases that main reloads and an earlier head (2e865b7) did not. Release builds of main a0cc096 and of both heads, Linux x64:
PR: #46809 |
There was a problem hiding this comment.
Beyond the inline findings, I also checked the fd ownership on the new decline path: the three loader sites that now reach ImportWatcher::add_file for package files (maybe_watch_file in src/runtime/jsc_hooks.rs and both sites in src/jsc/RuntimeTranspilerStore.rs) only clear the close flag on FdOwnership::Watcher, so the early FdOwnership::Caller return leaves the descriptor closed by the caller as before. The has_node_modules_component scan was also checked for the boundary cases in the unit table (leading component, trailing separator, backslash on POSIX) and matches its stated contract.
Extended reasoning...
The change moves the watcher's node_modules exclusion from a bare substring test to a path-component test in src/paths/string_paths.rs and centralizes it in ImportWatcher::add_file and Watcher::is_eligible_directory, with a source lint and 28 new watch tests. It touches no security-sensitive surface. Inline findings already cover the behavioral regressions (symlinked .nosync stores, rename saves outside the cwd) and test nits; this note only records the fd-ownership and scan-boundary checks that were ruled out.
Findings marked 🟡 are optional suggestions and need no follow-up push.
…ses skip Windows The trace case now also loads and rewrites a module that is a file of node_modules itself, so the existing descriptor cases keep their input. Each case that skips a platform says why.
There was a problem hiding this comment.
Code review found no new issues
No new issues were found in this update; 1 finding from earlier reviews is still open above.
Still open from earlier reviews (1):
- 🔴
src/jsc/hot_reloader.rs:82—macOS/iCloud users whose node_modules is a symlink to node_modules.nosync get every package file watched under --watch/…
If you have decided not to act on one of these findings, resolve its thread (a reply alone leaves it open) and the next review stops counting it. To review this commit again now, use Re-run on its "Claude Code Review" check.
The Windows watcher loses a change that lands before its thread first calls ReadDirectoryChangesW. A case that edits the file as soon as the first output arrives can hit that window: on Windows 11 aarch64 one new case waited 90 s for a reload that never came, and passed on the retry. On Windows the new cases now repeat the edit, at doubling intervals, until the reload shows. Other platforms still make one edit.
There was a problem hiding this comment.
Code review found no new issues
No new issues were found in this update; 1 finding from earlier reviews is still open above.
Still open from earlier reviews (1):
- 🔴
src/jsc/hot_reloader.rs:82—macOS/iCloud users whose node_modules is a symlink to node_modules.nosync get every package file watched under --watch/…
If you have decided not to act on one of these findings, resolve its thread (a reply alone leaves it open) and the next review stops counting it. To review this commit again now, use Re-run on its "Claude Code Review" check.
…h-node-modules-segment
…age store iCloud Drive does not sync a name that ends in `.nosync`. Its users keep the store as `node_modules.nosync` behind a link named `node_modules`. The module loader sees the real path, so the component test took that store for project code and watched every package file and directory. `has_node_modules_component` now also accepts that name. The test for the suffix runs only after the letters are found and the component does not close.
…h-node-modules-segment
There was a problem hiding this comment.
Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.
Beyond the inline nit on the new source lint, this pass also checked the node_modules.nosync store case raised earlier: commit ec504f6 now treats that suffix as a package component in has_node_modules_component (src/paths/string_paths.rs) with unit rows for it, and the early FdOwnership::Caller return in ImportWatcher::add_file (src/jsc/hot_reloader.rs) matches the None arm so the three loader sites that dropped their own guard still close the fd themselves. The serial spawn-and-reload cases in test/cli/watch/watch.test.ts were looked at for runtime and left alone since the file states why it stays serial.
Extended reasoning...
The change replaces six bare-substring node_modules checks in the watcher, transpiler store and JSC hooks with two component-aware helpers in bun_paths, adds a cfg(test) highway_memmem stub, and ships watch-mode CLI tests plus a source lint. It touches no security-sensitive surface; the only inline finding is a nit about the lint guarding a pattern the PR itself removed. The earlier open concern about iCloud .nosync stores was addressed by a later commit, and the fd-ownership contract on the new early return was verified against the None arm.
|
Linked package stores: the wider rule is not built A later report asked for a wider rule. The rule: watch mode skips every hoisted store that it reaches through a link named Checked on bun 1.4.3-canary.1 (367d939), Linux x64:
Two routes keep such a store unwatched today, with 0 store descriptors in each:
A maintainer can decide otherwise. If the |
Problem
--watch,--hotandbun test --watchnever reload an imported file whose path only holds the lettersnode_modules, as in a folder namednode_modules-cleaner. A fuzz run found it, no user report.strings::contains(path, b"node_modules"):RuntimeTranspilerStore.rs:906,:933,jsc_hooks.rs:3367,:3478,Watcher.rs:788,:974.Fix
bun_pathstests for a path component namednode_modulesornode_modules.nosync. A realnode_modulesstays unwatched.ImportWatcher::add_fileholds the rule for modules,Watcher::is_eligible_directoryfor directories. A source lint bans the bare test.test/cli/watch/watch.test.ts, 35 new cases fail on main. Alsotest/cli/hot/,test-changed.test.ts. Self-reviewed: 20 concerns raised, 19 addressed. Rejected: leaving an answered review thread open (Notes).Background
ImportWatcheris the handle of--watchand--hoton theWatcher. The loader offers it each file by real path. TheWatcheralso watches each file's directory.node_modules.nosyncbehind a link namednode_modules. Main skipped it by the letters.Downsides
node_modules -> node_modules.noindexis watched (main skipped it): at 200 packages and 256 descriptors a later project file reloads in 9 of 16 runs.node_modules -> storeis watched on main too.Notes
How it was found. A fuzz run, not a user report. A second fuzz run on this PR found the two cases that an earlier head lost against main: the store behind
node_modules -> node_modules.nosync(fixed here) and the save by rename outside the working directory (below, not fixed here). Searches of the tracker find no issue for this symptom. The nearest ask is #42702 (closed): it asks to "skip anything under anode_modulespath segment ... as the docs describe".docs/runtime/watch-mode.mdx:108says that Bun watches "all imported source files (excluding those innode_modules)".Repro.
index.jsimports./src/util.js. The script rewrites that file after the first print and waits for the second print. On bun 1.4.3-canary.1 (367d939) and on main a8b5e92:With this change all six lines print
reloaded.What main does in such a folder, by mode and file.
--check: never reloads. This is the bug.--watch --check: reloads on main. The type checker adds each file that it reads throughadd_file_by_path_slow, with its own component rule (check_command.rs:608).add_file_by_path_slow. On Linux under--hot, main loses the entry when the path is absent at the moment of the reload (renamed away or removed, then written again): 0 of 3 on main, 3 of 3 here, 3 of 3 in a folder with a harmless name. The directory was not watched, so nothing saw the file come back. On kqueue the code defers that reload to a directory event (hot_reloader.rs, theis_waiting_for_dir_changebranch). That was read, not run.The two forms. Both look for the letters with
strings::index_of, so a path without them costs one search, as before. On a hit, the byte before must be a separator or the start of the path.path_is_inside_node_modules: the byte after must be a separator./p/node_modules/foo.jsis inside. A file namednode_modulesis not.dir_is_or_is_inside_node_modules: the byte after must be a separator or the end of the path. The resolver hands the watcher/p/node_modules/in most cases, and/p/node_moduleswhen the first read of that directory is a relative lookup that fails (require("./node_modules/x.js"), traced with gdb).Platform::AUTO:/everywhere,\also on Windows. On POSIX a backslash is a byte of a file name. The private scan takes the platform as a parameter, so the unit table runs its Windows rows on every host.node_modules.nosync. The test for the suffix runs only after the letters are found and the component does not close.NODE_MODULES_NEEDLE,path_contains_node_modules_folderandPath::is_node_module()are not changed.Where the rule lives now.
ImportWatcher::add_file(src/jsc/hot_reloader.rs): its four callers are the loader sites. It returnsFdOwnership::Callerfor a package file, before the watcher mutex.jsc_hooks.rs, file-loader arm: keeps its own call, because on kqueue it opens a descriptor beforeadd_fileand must not open one for a package file.Watcher::is_eligible_directory:on_maybe_watch_directorycalls it. The package test runs first, as it did inon_maybe_watch_directory, so a resolver miss undernode_modulesis still rejected by one scan.add_file_by_path_slow. It has three producers and each one decides: the entry file (VirtualMachine.rs:4659), each file that--checkreads (VirtualMachine.rs:4685, rule atcheck_command.rs:608) and the seeding oftest --changed(test_command.rs:2438). Alsodirectory_watch_store.rs:360, where the dev server adds a directory itself.Behaviour changes besides the fix.
node_modules. The loader sees only the real path of a package,<target>/pkg/.... Paths under.bun/<pkg>/node_modules/,.pnpm/<pkg>/node_modules/and nestednode_moduleskeep a component and stay unwatched.node_modules -> node_modules.nosync(the iCloud Drive layout) is a package store again for--watch,--hotandbun test --watch: they register no file and no directory of it, as on main. An earlier head of this PR (2e865b7) registered all of them. Why it matters: on kqueue each watched file holds one descriptor, the cost that Stop keeping resolver file descriptors in watch mode #42714 removed forbun --watchwatches node_modules despite docs saying it doesn't (isolated linker) #42702 and that macOS: bun --watch retains high FDs and breaks piped posix_spawn with EBADF #40907 reports.bun build --watchregisters the files of the store on purpose and no directory, as on main (the earlier head also took the directories).--watch --checkhave their own test for/node_modules/(BundleV2::should_add_watcher,check_command.rs). They register the files of a.nosyncstore on main and here.Path::is_node_module()(the macro guard and others), coverage and test discovery also decide by/node_modules/.node_modules.noindex,node_modules.nosync.noindex,.node_modules.nosync,node_modules_linux. Main skipped these by the letters, so this is new against main. A target without the letters (node_modules -> store) is watched on main and here.RLIMIT_NOFILEthe reader closes each file (need_to_close_files,src/resolver/lib.rs), and the loader only offers a file that has an open descriptor (watcher: watch a file read from disk even when its descriptor was closed early #45594). (2) inotify watches:inotify_add_watchfails atfs.inotify.max_user_watchesand the loader sites print nothing (watcher: warn once when a watch cannot be added #41489). Bun raises the soft descriptor limit to the hard limit, so the first budget binds at a low hard limit and the second on a machine with a high one.node_modules -> deps.nosync/node_modules), or--preserve-symlinks, which also stops the reload of workspace packages that are linked into the store.node_modulespoints at that directory. It puts a verdict cache, a second lock and arealpathcall into the sharedWatcher, and it does not see a target without the letters. Include/exclude config forbun run --watch#5278 asks for an exclude setting for watch mode.cd app && bun --watch ../node_modules-tools/server.js: main reloads 3 of 3, this branch 0 of 3. The control../tools/server.jsis 0 of 3 on both.--hotgives the same numbers. Writes in place are 3 of 3 everywhere, and../node_modules/tools/server.jsis 3 of 3 on both. The earlier body recorded the same loss for an import outside the working directory under--watch --check. On main the loader refused the path, so the file had only the path watch ofadd_file_by_path_slow, which holds no descriptor and sees the replace. Now the loader's descriptor is stored, as for every other file, and it pins the old inode.../shared/lib.jsby rename reloads 0 of 3 under--watchand--hoton both, and 3 of 3 in place.bun build --watchget the directory watch in a folder whose name holds the letters. On Linux that watch is how they see a save by rename.File ... is not in the project directory and will not be watched.node_modules/<pkg>. Its entry reloads, its imports do not. A rule relative to the root is its own decision.Tests.
test/cli/watch/watch.test.ts, 35 cases that fail on a debug build of main:--watch,--hot,test --watch} x {letters in the project folder, in the file name, in a directory name} x {import, require}.node_modules-cleaner: a file-loader import, a save by rename of an import and a module that did not parse at first (each under--watchand--hot), an edit to the test file itself (test --watch), a save by rename underbun build --watch, an entry file renamed away and written again (--hot, Linux), and the descriptor of a directory in which a lookup failed.a store behind the link node_modules -> node_modules.nosync. Not on Windows: the descriptor listing has no Windows form, and the unit table covers both separators.--watch,--hot,test --watch} x {import, require}. A case loads a package from behind the link and a project file namedsrc/list-node_modules.js. It asserts that the process holds no descriptor belownode_modules*, and then that an edit to the project file reloads. On main the 6 fail at the reload. On the earlier head the 6 fail with four store paths held.bun build --watchholds no directory of the store and rebuilds a project file insrc/node_modules_helpers/after a save by rename. On main it fails at the rebuild. On the earlier head it fails with two store directories held.--hot sees no event under node_modules. It readsBUN_WATCHER_TRACEand has no platform skip, so it is the case that needs atrueverdict on Windows. It loads and rewrites a file of a package and a module that is a file ofnode_modulesitself, and it makes a lookup fail innode_modulesfirst.ReadDirectoryChangesW(WindowsWatcher.rs,prepare), and a case edits the file as soon as the first output arrives. Other platforms make one edit.test/internal/source-lints/watcher-node-modules-needle.test.ts: no search call with the literalb"node_modules"as its needle insrc/watcher/,src/jsc/andsrc/runtime/jsc_hooks.rs. It fails on main with exactly the six gates.cargo test -p bun_paths: a verdict table for both forms and both platforms. The test module gets a scalar stub forhighway_memmem, next to the other highway stubs.containsinImportWatcher::add_file: 26 of the 28 fail (all but the two directory cases).containsin the file-loader arm: its 2 cases fail.containsinis_eligible_directory: 5 fail (the directory of a failed lookup, the three saves by rename, the entry case)..nosyncsuffix: the unit table fails at/p/node_modules.nosync/pkg/a.js, and the 7 store cases fail.Measurements. Release builds of main a8b5e92 and of this branch, Linux x64, unless a line says debug.
strace,valgrind,perfandbloatyare not installed in the container and it has no network, so the counts come from gdb breakpoint tallies, a small ptrace counter,perf_event_openandsize.node_modulesscans under--watch(debug builds, tally ofhighway_memmemcalls with that needle): 2,001 package modules 2,004 (main 2,004). 2,001 project modules 4,004 (main 4,004).--watchor--hot: 0 scans in 2,002 module loads (main 0).node_modules,require("express")under--watch(debug): 134 package scans, 0 top-level-dir scans (main 134, 0).--hot(debug): 2 scans per accepted file (main 1). A package file: 1 (main 1). The kqueue-only open for a package file is not measured here. The test still precedes it.is_eligible_directoryscans per new file (debug): outside the root 2 (main 1). A package file underbun build --watch1 (main 2). A project file 2 (main 2).--watch, minimum of 5 runs,openat/read/close/inotify_add_watch: package modules 2032/4030/2029/2 (main 2032/4030/2029/2). Project modules 2035/4031/30/2004 (main 2035/4030/30/2004). Runs of one build differ by up to 11 calls.node_modules-proj: 2,004inotify_add_watch(main 0).node_modules-cleaner4,list-node_modules.js4,node_modules_helpers4 (main 4, 1, 2, 2). A realnode_modules/pkg: 2 watches, 8 descriptors, 0 undernode_modules(main the same).ImportWatcher::add_fileentries for 2,001 package modules: 0. The loader has it inlined.memmem,perf_event_opencounter: a path without the letters +13 to +14, a package path +37 to +39, letters inside a longer name +155 to +159 (one more search).size), data and bss equal.Measurements for the
node_modules.nosyncclause. Linux x64, 12 cores, release builds (LTO) of main a0cc096, of the earlier head 2e865b7 and of this head, unless a line says debug.strace,perf,valgrindandbloatyare not installed, so the counts come from gdb (stepi, breakpoint tallies), a ptrace counter,nm,objdumpandsize. The module fixtures have 2,000 modules, one per package directory, plus the entry.node_modules -> node_modules.nosync, 200 packages,ulimit -n 256, then an edit of the project filed.js: 9 descriptors, 0 under the store, 3 inotify watches,d.jsreloads 8 of 8. Main the same, 6 of 6. The earlier head, 8 runs: 128 to 151 descriptors, 120 to 142 under the store, 122 to 145 watches, reloads 4 of 8 (a debug build of it: 133 to 135 descriptors, 0 of 4). The loss is a race there:d.jsis read before or after the descriptor cut-off.d.jsloaded by a lateimport(). This head uses 3 watches and reloads. The earlier head uses all 141 free watches, prints nothing and does not reload. With the store namednode_modules.noindexthis head behaves like the earlier head, and main uses 3 and reloads.node_modules.noindex,node_modules.nosync.noindex,.node_modules.nosync,node_modules_linux), 200 packages,ulimit -n 256, 4 runs each: 128 to 152 descriptors,d.jsreloads in 9 of 16 runs (main 9 descriptors, 4 of 4 in one run each).node_modules -> store: 133 to 151 descriptors and 3 of 5 here, 130 to 151 and 4 of 5 on main.node_modules.nosync/@s/ws -> ../../packages/ws): 5 paths held and 5 watches,packages/wsand its file among them (main the same, the earlier head 11 and 11).bun build --watch, 2 packages behind the link: 11 descriptors and 5 inotify watches (main 11 and 5, the earlier head 13 and 7).--watch,openat/read/close/inotify_add_watch: 6033/4020/6029/2 (main 6031/4020/6028/2, the earlier head 7054/4019/5003/2050). In a real store: 4029/4020/4026/2 (main 4028/4019/4025/2).node_modulessearches for 2,001 module loads under--watch(debug builds, gdb tally ofhighway_memmemwith that needle): project modules 4,002, a real store 4,002, the store behind the link 4,002 (the earlier head 6,072, it stops at the descriptor cut-off). No watcher: 0.stepioverget_resolve_watcher::wrap, first instruction to return): a directory without the letters 1421 (the earlier head 1417, main 1415, each with the watch registration). In a realnode_modules170 (173, main 150). Innode_modules.nosync170 (1537 with the registration, main 135). Innode_modules-cleaner1539 (1534, main 135: main refuses it, which is the bug).nm,objdump): the predicate has one out-of-line copy, as on the earlier head (250 bytes, was 183). One thing changed: LLVM no longer inlines thebun_jscinstance ofImportWatcher::add_fileinto the transpile job, so each ESM module that is offered in watch mode pays one direct call (17 instructions for the call, the prologue and the epilogue, plus the argument moves). Two other shapes of the clause were built and measured. A#[cold]helper for the suffix: +256 bytes, but the predicate falls out of line at the directory gate (+16 to +21 instructions per call). The suffix stripped before the close test: +1,024 bytes, +11 instructions for a real store. Both keep the same out-of-lineadd_file.size): main 109,016,628, the earlier head 109,017,396 (+768), this head 109,018,310 (+914 for the clause, +1,682 against main). Data and bss are equal.node_modulesornode_modules.nosync, followed by a separator in the file form) on 12,000,000 generated paths, both forms, both platforms: no difference.The same bare test in other places. Main has 14 search calls in
src/whose needle is the bareb"node_modules". The six watcher gates are removed here. The other eight stay:src/runtime/cli/package_manager_command.rs:889,:896,:945(bun pm ls --allpanics withindex out of boundsfor a dependency named likenode_modules-x, and needs no search at all),src/bundler/linker_context/MetafileBuilder.rs:884(--metafile-mdcountssrc/list-node_modules.jsas anode_modulesfile),src/js_parser/visit/visit_expr.rs:2458(a prefix test by letters).src/lint/react_compiler/rule.rs:104,src/lint/react_compiler/program.rs:1052andsrc/lint/driver/lint.rs:287. They match what oxlint, the React Compiler plugin and ESLint 8 do.src/resolver/resolver.rs:5615andsrc/install/PackageManager/patchPackage.rs:241test a half-anchorednode_modules<SEP>. Other features, not changed.BundleV2::should_add_watcher,BunTest__shouldGenerateCodeCoverageandcheck_command.rs:608already test a component.Sequencing with open PRs. Six open PRs move or add a bare test on these lines. None of them fixes this bug. The new lint fails each of them after a rebase until the line is changed:
add_moduleinhot_reloader.rs. Delete the bare clause, and usepath_is_inside_node_modulesfor its file-loader test.RuntimeTranspilerStore.rsandjsc_hooks.rs, in front of its new entry point. Put the component test inside that entry point.is_watchable_directoryinWatcher.rs. Callis_eligible_directory.Watcher.rs. Keepdir_is_or_is_inside_node_moduleswhen it rewrites the root test.INotifyWatcher.rs,file_was_replaced) and Watch files loaded through runtime plugin onLoad callbacks in --hot and --watch #33093 (VirtualMachine.rs, in front ofadd_file_by_path_slow): usepath_is_inside_node_modules.ImportWatcherowns the runtime rule is from watcher: watch a file read from disk even when its descriptor was closed early #45594. The fold ofon_maybe_watch_directoryis also in watcher: accept the real path spelling of the project root on Windows #39832 and watch: reload when a missing import appears, keep scanning after a resolve error #41461.node_modulesfrom the package folder that holds the start folder #46910 is stacked on this branch. It rewrites the predicates into one scan (node_modules_component_end,NodeModulesScope). Its unit tables pin/p/node_modules.nosync/pkg/a.jsas not inside, andproject_root("/p/node_modules.nosync/pkg")asNone. After a rebase the first row is inside. Whether the name also counts forproject_root, and for the coverage gate of bun test --coverage: count the files of a project that is a package folder ofnode_modules#46909, is a decision of those PRs: here it is a watcher rule only.Self-review. Ten concerns survived it. What was done:
add_file_by_path_slowwas wrong: the comment is one line now and the three producers are listed.trueverdict: the trace case runs there, and the unit table runs its Windows rows on every host. The review's first choice, to export the predicates to JS tests and delete the Rust table, would add two host functions for a test. Not taken.--hotentry file was fixed with no test: the entry case and the two runtime save-by-rename cases..nosyncbullet did not name the layout or the ceiling: done, above and in Downsides.node_modules: listed as not changed, handed to its own change.src/: each is one line now.Second self-review, of the
node_modules.nosynccommit. Ten concerns survived it. Nine are done, one is rejected:--watch --checkare listed as not changed.ulimit -n 256, a race: it now rests on the registrations (held descriptors on kqueue, Stop keeping resolver file descriptors in watch mode #42714), and a run with no race is in the measurements.bun build --watchcase./p/node_modules-report/src/util.jsfails that change. The two rows that pinned other names as not a store are gone, because that is the open question.Suites run on the debug build.
test/cli/watch/watch.test.ts(53 pass, 1 skip),watcher-trace.test.ts,test/cli/hot/watch.test.ts,watch-many-dirs.test.ts,hot.test.ts(the two "does not take a promise of the program's" cases fail about 3 times in 8 on a debug build of main too),test/cli/test/test-changed.test.ts,test/js/bun/resolve/bun-main-entry-point.test.ts,cargo test -p bun_paths, and the source lintsbyte-search,comment-copand the new one.bun run rust:check-allpasses forx86_64-pc-windows-msvc,aarch64-apple-darwinandx86_64-unknown-freebsd.no test proof · iteration 1 · platform-specific test(s) that do not run on this machine, deferring to CI, which covers all platforms: test/cli/watch/watch.test.ts