copy-sync.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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.preserveTimestamps = 'preserveTimestamps' in options ? !!options.preserveTimestamps : true
  14. options.filter = options.filter || function () { return true }
  15. var stats = options.recursive ? fs.lstatSync(src) : fs.statSync(src)
  16. var destFolder = path.dirname(dest)
  17. var destFolderExists = fs.existsSync(destFolder)
  18. var performCopy = false
  19. if (stats.isFile()) {
  20. if (options.filter instanceof RegExp) performCopy = options.filter.test(src)
  21. else if (typeof options.filter === 'function') performCopy = options.filter(src)
  22. if (performCopy) {
  23. if (!destFolderExists) mkdir.mkdirsSync(destFolder)
  24. copyFileSync(src, dest, {clobber: options.clobber, preserveTimestamps: options.preserveTimestamps})
  25. }
  26. } else if (stats.isDirectory()) {
  27. if (!fs.existsSync(dest)) mkdir.mkdirsSync(dest)
  28. var contents = fs.readdirSync(src)
  29. contents.forEach(function (content) {
  30. var opts = options
  31. opts.recursive = true
  32. copySync(path.join(src, content), path.join(dest, content), opts)
  33. })
  34. } else if (options.recursive && stats.isSymbolicLink()) {
  35. var srcPath = fs.readlinkSync(src)
  36. fs.symlinkSync(srcPath, dest)
  37. }
  38. }
  39. module.exports = copySync