123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 'use strict'
- const fs = require('graceful-fs')
- const path = require('path')
- const ncp = require('./ncp')
- const mkdir = require('../mkdirs')
- const pathExists = require('../path-exists').pathExists
- function copy (src, dest, options, callback) {
- if (typeof options === 'function' && !callback) {
- callback = options
- options = {}
- } else if (typeof options === 'function' || options instanceof RegExp) {
- options = {filter: options}
- }
- callback = callback || function () {}
- options = options || {}
- // Warn about using preserveTimestamps on 32-bit node:
- if (options.preserveTimestamps && process.arch === 'ia32') {
- console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
- see https://github.com/jprichardson/node-fs-extra/issues/269`)
- }
- // don't allow src and dest to be the same
- const basePath = process.cwd()
- const currentPath = path.resolve(basePath, src)
- const targetPath = path.resolve(basePath, dest)
- if (currentPath === targetPath) return callback(new Error('Source and destination must not be the same.'))
- fs.lstat(src, (err, stats) => {
- if (err) return callback(err)
- let dir = null
- if (stats.isDirectory()) {
- const parts = dest.split(path.sep)
- parts.pop()
- dir = parts.join(path.sep)
- } else {
- dir = path.dirname(dest)
- }
- pathExists(dir, (err, dirExists) => {
- if (err) return callback(err)
- if (dirExists) return ncp(src, dest, options, callback)
- mkdir.mkdirs(dir, err => {
- if (err) return callback(err)
- ncp(src, dest, options, callback)
- })
- })
- })
- }
- module.exports = copy
|