You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					85 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					85 lines
				
				2.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								module.exports = move
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var nodeFs = require('fs')
							 | 
						||
| 
								 | 
							
								var rimraf = require('rimraf')
							 | 
						||
| 
								 | 
							
								var validate = require('aproba')
							 | 
						||
| 
								 | 
							
								var copy = require('copy-concurrently')
							 | 
						||
| 
								 | 
							
								var RunQueue = require('run-queue')
							 | 
						||
| 
								 | 
							
								var extend = Object.assign || require('util')._extend
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function promisify (Promise, fn) {
							 | 
						||
| 
								 | 
							
								  return function () {
							 | 
						||
| 
								 | 
							
								    var args = [].slice.call(arguments)
							 | 
						||
| 
								 | 
							
								    return new Promise(function (resolve, reject) {
							 | 
						||
| 
								 | 
							
								      return fn.apply(null, args.concat(function (err, value) {
							 | 
						||
| 
								 | 
							
								        if (err) {
							 | 
						||
| 
								 | 
							
								          reject(err)
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          resolve(value)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }))
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function move (from, to, opts) {
							 | 
						||
| 
								 | 
							
								  validate('SSO|SS', arguments)
							 | 
						||
| 
								 | 
							
								  opts = extend({}, opts || {})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var Promise = opts.Promise || global.Promise
							 | 
						||
| 
								 | 
							
								  var fs = opts.fs || nodeFs
							 | 
						||
| 
								 | 
							
								  var rimrafAsync = promisify(Promise, rimraf)
							 | 
						||
| 
								 | 
							
								  var renameAsync = promisify(Promise, fs.rename)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  opts.top = from
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var queue = new RunQueue({
							 | 
						||
| 
								 | 
							
								    maxConcurrency: opts.maxConcurrency,
							 | 
						||
| 
								 | 
							
								    Promise: Promise
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  opts.queue = queue
							 | 
						||
| 
								 | 
							
								  opts.recurseWith = rename
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  queue.add(0, rename, [from, to, opts])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return queue.run().then(function () {
							 | 
						||
| 
								 | 
							
								    return remove(from)
							 | 
						||
| 
								 | 
							
								  }, function (err) {
							 | 
						||
| 
								 | 
							
								    // if the target already exists don't clobber it
							 | 
						||
| 
								 | 
							
								    if (err.code === 'EEXIST' || err.code === 'EPERM') {
							 | 
						||
| 
								 | 
							
								      return passThroughError()
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return remove(to).then(passThroughError, passThroughError)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    function passThroughError () {
							 | 
						||
| 
								 | 
							
								      return Promise.reject(err)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function remove (target) {
							 | 
						||
| 
								 | 
							
								    var opts = {
							 | 
						||
| 
								 | 
							
								      unlink: fs.unlink,
							 | 
						||
| 
								 | 
							
								      chmod: fs.chmod,
							 | 
						||
| 
								 | 
							
								      stat: fs.stat,
							 | 
						||
| 
								 | 
							
								      lstat: fs.lstat,
							 | 
						||
| 
								 | 
							
								      rmdir: fs.rmdir,
							 | 
						||
| 
								 | 
							
								      readdir: fs.readdir,
							 | 
						||
| 
								 | 
							
								      glob: false
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return rimrafAsync(target, opts)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function rename (from, to, opts, done) {
							 | 
						||
| 
								 | 
							
								    return renameAsync(from, to).catch(function (err) {
							 | 
						||
| 
								 | 
							
								      if (err.code !== 'EXDEV') {
							 | 
						||
| 
								 | 
							
								        return Promise.reject(err)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        return remove(to).then(function () {
							 | 
						||
| 
								 | 
							
								          return copy.item(from, to, opts)
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |