copy-sync.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. var fs = require('graceful-fs')
  2. var path = require('path')
  3. var copyFileSync = require('./copy-file-sync')
  4. var mkdir = require('../mkdirs')
  5. function copySync (src, dest, options) {
  6. if (typeof options === 'function' || options instanceof RegExp) {
  7. options = {filter: options}
  8. }
  9. options = options || {}
  10. options.recursive = !!options.recursive
  11. // default to true for now
  12. options.clobber = 'clobber' in options ? !!options.clobber : true
  13. options.dereference = 'dereference' in options ? !!options.dereference : false
  14. options.preserveTimestamps = 'preserveTimestamps' in options ? !!options.preserveTimestamps : false
  15. options.filter = options.filter || function () { return true }
  16. var stats = (options.recursive && !options.dereference) ? fs.lstatSync(src) : fs.statSync(src)
  17. var destFolder = path.dirname(dest)
  18. var destFolderExists = fs.existsSync(destFolder)
  19. var performCopy = false
  20. if (stats.isFile()) {
  21. if (options.filter instanceof RegExp) performCopy = options.filter.test(src)
  22. else if (typeof options.filter === 'function') performCopy = options.filter(src)
  23. if (performCopy) {
  24. if (!destFolderExists) mkdir.mkdirsSync(destFolder)
  25. copyFileSync(src, dest, {clobber: options.clobber, preserveTimestamps: options.preserveTimestamps})
  26. }
  27. } else if (stats.isDirectory()) {
  28. if (!fs.existsSync(dest)) mkdir.mkdirsSync(dest)
  29. var contents = fs.readdirSync(src)
  30. contents.forEach(function (content) {
  31. var opts = options
  32. opts.recursive = true
  33. copySync(path.join(src, content), path.join(dest, content), opts)
  34. })
  35. } else if (options.recursive && stats.isSymbolicLink()) {
  36. var srcPath = fs.readlinkSync(src)
  37. fs.symlinkSync(srcPath, dest)
  38. }
  39. }
  40. module.exports = copySync