diff options
author | bcoe <bencoe@google.com> | 2021-08-08 13:48:01 -0700 |
---|---|---|
committer | Benjamin Coe <bencoe@google.com> | 2021-08-11 19:53:32 -0700 |
commit | 87d6fd7e696ee02178a8dc33a51e8e59bdc61d68 (patch) | |
tree | e9c76b5f1d9f4ba4f51528b2ef8e41b82b6e2f4f /lib/fs.js | |
parent | 4ece669c6205ec78abfdadfe78869bbb8411463e (diff) | |
download | node-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.js | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -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, |