@componentor/fs 3.0.47 → 3.0.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@componentor/fs",
3
- "version": "3.0.47",
3
+ "version": "3.0.49",
4
4
  "description": "High-performance OPFS-based Node.js fs polyfill with true sync API, VFS binary format, and bidirectional OPFS mirroring",
5
5
  "license": "MIT",
6
6
  "author": "Componentor",
package/readme.md CHANGED
@@ -604,6 +604,20 @@ Make sure `opfsSync` is enabled (it's `true` by default). Files are mirrored to
604
604
 
605
605
  See [CHANGELOG.md](./CHANGELOG.md) for the full version history.
606
606
 
607
+ ### v3.0.49 (2026)
608
+
609
+ **Fixes:**
610
+ - `rename` over a non-empty directory no longer leaves stale descendants. Previously the target's children survived in `pathIndex` while their inodes were never freed; source descendants were laid on top, leaking inodes and leaving zombies reachable via `read`. Surfaced as corrupt `.vite/deps` after Vite's `deps_temp_<hash>` → `deps` swap (stale chunks for `vue.js`, `@unhead/vue`, etc., or 404s)
611
+ - `rename(x, x)` no longer destroys the file (it used to free its own blocks and mark its inode FREE before re-pointing the index)
612
+ - Same descendant-cleanup logic now applies when the rename target is an *implicit* directory (path with no inode of its own but with descendants in `pathIndex` — the state produced by bulk OPFS import)
613
+ - `write`, `symlink`, `link`, and `copy` (with `COPYFILE_EXCL`) now reject implicit-directory targets (EISDIR for `write`, EEXIST for the others). Previously these silently clobbered the implicit dir, e.g. registering a regular `FILE` inode at a path whose children still existed in `pathIndex` — breaking every subsequent read of that path and its subtree
614
+ - Add 5 regression tests in `implicit-dir-targets.test.ts` covering each fixed call site
615
+
616
+ ### v3.0.48 (2026)
617
+
618
+ **Fixes:**
619
+ - Close the residual race left in the 3.0.47 broker-heartbeat fix: stop calling `close()` on the prior control port. The disentangle signal travels on a separate IPC pipe from the SW main channel with no ordering guarantee against `register-server`, so a `transfer-port` already queued in the SW inbox could still be dispatched against a detached `serverPort` and silently dropped. Letting the old port live until both endpoints become unreferenced (and GC-collected) keeps it routable through the swap and removes the window entirely
620
+
607
621
  ### v3.0.47 (2026)
608
622
 
609
623
  **Fixes:**