summaryrefslogtreecommitdiff
path: root/lib/fs.js
diff options
context:
space:
mode:
authorbcoe <bencoe@google.com>2021-08-08 13:48:01 -0700
committerBenjamin Coe <bencoe@google.com>2021-08-11 19:53:32 -0700
commit87d6fd7e696ee02178a8dc33a51e8e59bdc61d68 (patch)
treee9c76b5f1d9f4ba4f51528b2ef8e41b82b6e2f4f /lib/fs.js
parent4ece669c6205ec78abfdadfe78869bbb8411463e (diff)
downloadnode-new-87d6fd7e696ee02178a8dc33a51e8e59bdc61d68.tar.gz
fs: add recursive cp method
Introduces recursive cp method, based on fs-extra implementation. PR-URL: https://github.com/nodejs/node/pull/39372 Fixes: https://github.com/nodejs/node/issues/35880 Refs: https://github.com/nodejs/tooling/issues/98 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Michaƫl Zasso <targos@protonmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ian Sutherland <ian@iansutherland.ca>
Diffstat (limited to 'lib/fs.js')
-rw-r--r--lib/fs.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/fs.js b/lib/fs.js
index cf3c885b31..7e126b84ad 100644
--- a/lib/fs.js
+++ b/lib/fs.js
@@ -107,6 +107,7 @@ const {
stringToSymlinkType,
toUnixTimestamp,
validateBufferArray,
+ validateCpOptions,
validateOffsetLengthRead,
validateOffsetLengthWrite,
validatePath,
@@ -145,6 +146,8 @@ let truncateWarn = true;
let fs;
// Lazy loaded
+let cpFn;
+let cpSyncFn;
let promises = null;
let ReadStream;
let WriteStream;
@@ -1075,6 +1078,13 @@ function ftruncateSync(fd, len = 0) {
handleErrorFromBinding(ctx);
}
+function lazyLoadCp() {
+ if (cpFn === undefined) {
+ ({ cpFn } = require('internal/fs/cp/cp'));
+ cpFn = require('util').callbackify(cpFn);
+ ({ cpSyncFn } = require('internal/fs/cp/cp-sync'));
+ }
+}
function lazyLoadRimraf() {
if (rimraf === undefined)
@@ -2790,6 +2800,44 @@ function copyFileSync(src, dest, mode) {
handleErrorFromBinding(ctx);
}
+/**
+ * Asynchronously copies `src` to `dest`. `src` can be a file, directory, or
+ * symlink. The contents of directories will be copied recursively.
+ * @param {string | URL} src
+ * @param {string | URL} dest
+ * @param {Object} [options]
+ * @param {() => any} callback
+ * @returns {void}
+ */
+function cp(src, dest, options, callback) {
+ if (typeof options === 'function') {
+ callback = options;
+ options = undefined;
+ }
+ callback = makeCallback(callback);
+ options = validateCpOptions(options);
+ src = pathModule.toNamespacedPath(getValidatedPath(src, 'src'));
+ dest = pathModule.toNamespacedPath(getValidatedPath(dest, 'dest'));
+ lazyLoadCp();
+ cpFn(src, dest, options, callback);
+}
+
+/**
+ * Synchronously copies `src` to `dest`. `src` can be a file, directory, or
+ * symlink. The contents of directories will be copied recursively.
+ * @param {string | URL} src
+ * @param {string | URL} dest
+ * @param {Object} [options]
+ * @returns {void}
+ */
+function cpSync(src, dest, options) {
+ options = validateCpOptions(options);
+ src = pathModule.toNamespacedPath(getValidatedPath(src, 'src'));
+ dest = pathModule.toNamespacedPath(getValidatedPath(dest, 'dest'));
+ lazyLoadCp();
+ cpSyncFn(src, dest, options);
+}
+
function lazyLoadStreams() {
if (!ReadStream) {
({ ReadStream, WriteStream } = require('internal/fs/streams'));
@@ -2854,6 +2902,8 @@ module.exports = fs = {
closeSync,
copyFile,
copyFileSync,
+ cp,
+ cpSync,
createReadStream,
createWriteStream,
exists,