Package Exports
- fs-remove-compat
- fs-remove-compat/package.json
Readme
fs-remove-compat
Cross-platform file removal utilities with Node.js 0.8+ compatibility.
Features
- Strict ponyfills:
rmandrmSyncexactly match Node.jsfs.rm/fs.rmSyncAPI - Enhanced variants:
safeRmandsafeRmSyncwith Windows-friendly defaults - Node 0.8+ support: Works on all Node.js versions
- Zero dependencies: Pure Node.js implementation
- Migration codemod: Auto-migrate from rimraf2
Installation
npm install fs-remove-compatUsage
Strict Ponyfills (match Node.js fs.rm)
import { rm, rmSync } from 'fs-remove-compat';
// Remove a file
rmSync('/path/to/file.txt');
// Remove directory recursively
rmSync('/path/to/dir', { recursive: true });
// Ignore if doesn't exist
rmSync('/path/to/maybe', { force: true });
// Async with callback
rm('/path/to/file.txt', (err) => {
if (err) console.error(err);
});
// Async with Promise
await rm('/path/to/file.txt');
await rm('/path/to/dir', { recursive: true, force: true });Enhanced Variants (Windows-friendly)
import { safeRm, safeRmSync } from 'fs-remove-compat';
// safeRm/safeRmSync have Windows-friendly defaults:
// - maxRetries: 10 on Windows, 0 on POSIX
// - Exponential backoff (1.2 factor)
// - EPERM chmod fix for locked files
// Use for CI/test cleanup where Windows file locking is common
safeRmSync('/path/to/dir', { recursive: true, force: true });
await safeRm('/path/to/dir', { recursive: true, force: true });API
Options
interface RmOptions {
recursive?: boolean; // Remove directories recursively. Default: false
force?: boolean; // Ignore ENOENT errors. Default: false
maxRetries?: number; // Retries on EBUSY/EPERM/etc. Default: 0 (or 10 for safe*)
retryDelay?: number; // Delay between retries in ms. Default: 100
}rm(path, [options], [callback])
Removes a file or directory. Matches Node.js fs.rm signature.
rmSync(path, [options])
Synchronous version. Matches Node.js fs.rmSync signature.
safeRm(path, [options], [callback])
Enhanced version with Windows-friendly defaults.
safeRmSync(path, [options])
Synchronous enhanced version.
Migration from rimraf2
The package includes a smart migration codemod:
npx fs-remove-compat migrate <directory>Smart Detection
The codemod automatically chooses the right function based on file location:
Source files (src/) - Uses strict ponyfill:
rm/rmSync- exactly matches Node.js behavior- Apps should know immediately if removal fails
Test files (test/) - Uses enhanced variant:
safeRm/safeRmSync- Windows-friendly retry defaults- Retry is acceptable for test cleanup
Transformations
| Context | Before | After |
|---|---|---|
| Source | rimraf2(p, {disableGlob:true}, cb) |
rm(p, cb) |
| Source | rimraf2.sync(p, {disableGlob:true}) |
rmSync(p) |
| Test | rimraf2(p, {disableGlob:true}, cb) |
safeRm(p, cb) |
| Test | rimraf2.sync(p, {disableGlob:true}) |
safeRmSync(p) |
Why use this?
- Replace rimraf2 without the
{ disableGlob: true }boilerplate - Cross-platform with automatic Windows retry logic
- Future-proof - uses native
fs.rmwhen available (Node 14.14+) - Backwards compatible - works on Node 0.8+
License
MIT