'use strict'; const fs = require('graceful-fs'); const path = require('path'); const copySync = require('../copy-sync').copySync; const removeSync = require('../remove').removeSync; const mkdirpSync = require('../mkdirs').mkdirpSync; const stat = require('../util/stat'); function moveSync(src, dest, opts) { opts = opts || {}; const overwrite = opts.overwrite || opts.clobber || false; const { srcStat } = stat.checkPathsSync(src, dest, 'move'); stat.checkParentPathsSync(src, srcStat, dest, 'move'); mkdirpSync(path.dirname(dest)); return doRename(src, dest, overwrite); } function doRename(src, dest, overwrite) { if (overwrite) { removeSync(dest); return rename(src, dest, overwrite); } if (fs.existsSync(dest)) throw new Error('dest already exists.'); return rename(src, dest, overwrite); } function rename(src, dest, overwrite) { try { fs.renameSync(src, dest); } catch (err) { if (err.code !== 'EXDEV') throw err; return moveAcrossDevice(src, dest, overwrite); } } function moveAcrossDevice(src, dest, overwrite) { const opts = { overwrite, errorOnExist: true, }; copySync(src, dest, opts); return removeSync(src); } module.exports = moveSync;