Skip to content

Commit

Permalink
fs: accept URL as argument for fs.rm and fs.rmSync
Browse files Browse the repository at this point in the history
PR-URL: #41132
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
aduh95 authored and danielleadams committed Dec 13, 2021
1 parent db410e7 commit bbdcd05
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
10 changes: 10 additions & 0 deletions doc/api/fs.md
Expand Up @@ -3580,6 +3580,11 @@ with options `{ recursive: true, force: true }`.

<!-- YAML
added: v14.14.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/41132
description: The `path` parameter can be a WHATWG `URL` object using `file:`
protocol.
-->

* `path` {string|Buffer|URL}
Expand Down Expand Up @@ -5328,6 +5333,11 @@ with options `{ recursive: true, force: true }`.
<!-- YAML
added: v14.14.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/41132
description: The `path` parameter can be a WHATWG `URL` object using `file:`
protocol.
-->
* `path` {string|Buffer|URL}
Expand Down
2 changes: 2 additions & 0 deletions lib/fs.js
Expand Up @@ -1185,6 +1185,7 @@ function rm(path, options, callback) {
callback = options;
options = undefined;
}
path = getValidatedPath(path);

validateRmOptions(path, options, false, (err, options) => {
if (err) {
Expand All @@ -1208,6 +1209,7 @@ function rm(path, options, callback) {
* @returns {void}
*/
function rmSync(path, options) {
path = getValidatedPath(path);
options = validateRmOptionsSync(path, options, false);

lazyLoadRimraf();
Expand Down
26 changes: 26 additions & 0 deletions test/parallel/test-fs-rm.js
Expand Up @@ -5,6 +5,7 @@ const tmpdir = require('../common/tmpdir');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const { pathToFileURL } = require('url');
const { execSync } = require('child_process');

const { validateRmOptionsSync } = require('internal/fs/utils');
Expand Down Expand Up @@ -97,6 +98,11 @@ function removeAsync(dir) {
makeNonEmptyDirectory(2, 10, 2, dir, false);
removeAsync(dir);

// Same test using URL instead of a path
dir = nextDirPath();
makeNonEmptyDirectory(2, 10, 2, dir, false);
removeAsync(pathToFileURL(dir));

// Create a flat folder including symlinks
dir = nextDirPath();
makeNonEmptyDirectory(1, 10, 2, dir, true);
Expand Down Expand Up @@ -156,6 +162,16 @@ function removeAsync(dir) {
fs.rmSync(filePath, { force: true });
}

// Should accept URL
const fileURL = pathToFileURL(path.join(tmpdir.path, 'rm-file.txt'));
fs.writeFileSync(fileURL, '');

try {
fs.rmSync(fileURL, { recursive: true });
} finally {
fs.rmSync(fileURL, { force: true });
}

// Recursive removal should succeed.
fs.rmSync(dir, { recursive: true });

Expand Down Expand Up @@ -202,6 +218,16 @@ function removeAsync(dir) {
} finally {
fs.rmSync(filePath, { force: true });
}

// Should accept URL
const fileURL = pathToFileURL(path.join(tmpdir.path, 'rm-promises-file.txt'));
fs.writeFileSync(fileURL, '');

try {
await fs.promises.rm(fileURL, { recursive: true });
} finally {
fs.rmSync(fileURL, { force: true });
}
})().then(common.mustCall());

// Test input validation.
Expand Down

0 comments on commit bbdcd05

Please sign in to comment.