summaryrefslogtreecommitdiff
path: root/node_modules/fs-extra/lib
diff options
context:
space:
mode:
authorArman Shah <[email protected]>2018-02-19 23:50:04 -0800
committerArman Shah <[email protected]>2018-02-19 23:50:04 -0800
commitae34dcfd3823a609ba7182f2d6eda593be876f7d (patch)
treeb9d7f2884c4999349418cbdc4f9ab46d113e0afd /node_modules/fs-extra/lib
parentInitial commit (diff)
downloadlauncher-ae34dcfd3823a609ba7182f2d6eda593be876f7d.tar.xz
launcher-ae34dcfd3823a609ba7182f2d6eda593be876f7d.zip
add base files
Diffstat (limited to 'node_modules/fs-extra/lib')
-rw-r--r--node_modules/fs-extra/lib/copy-sync/copy-file-sync.js39
-rw-r--r--node_modules/fs-extra/lib/copy-sync/copy-sync.js48
-rw-r--r--node_modules/fs-extra/lib/copy-sync/index.js3
-rw-r--r--node_modules/fs-extra/lib/copy/copy.js44
-rw-r--r--node_modules/fs-extra/lib/copy/index.js3
-rw-r--r--node_modules/fs-extra/lib/copy/ncp.js243
-rw-r--r--node_modules/fs-extra/lib/empty/index.js47
-rw-r--r--node_modules/fs-extra/lib/ensure/file.js43
-rw-r--r--node_modules/fs-extra/lib/ensure/index.js21
-rw-r--r--node_modules/fs-extra/lib/ensure/link.js58
-rw-r--r--node_modules/fs-extra/lib/ensure/symlink-paths.js97
-rw-r--r--node_modules/fs-extra/lib/ensure/symlink-type.js27
-rw-r--r--node_modules/fs-extra/lib/ensure/symlink.js62
-rw-r--r--node_modules/fs-extra/lib/index.js37
-rw-r--r--node_modules/fs-extra/lib/json/index.js9
-rw-r--r--node_modules/fs-extra/lib/json/jsonfile.js14
-rw-r--r--node_modules/fs-extra/lib/json/output-json-sync.js16
-rw-r--r--node_modules/fs-extra/lib/json/output-json.js24
-rw-r--r--node_modules/fs-extra/lib/mkdirs/index.js9
-rw-r--r--node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js57
-rw-r--r--node_modules/fs-extra/lib/mkdirs/mkdirs.js61
-rw-r--r--node_modules/fs-extra/lib/mkdirs/win32.js24
-rw-r--r--node_modules/fs-extra/lib/move/index.js161
-rw-r--r--node_modules/fs-extra/lib/output/index.js35
-rw-r--r--node_modules/fs-extra/lib/remove/index.js14
-rw-r--r--node_modules/fs-extra/lib/util/assign.js14
-rw-r--r--node_modules/fs-extra/lib/util/utimes.js69
-rw-r--r--node_modules/fs-extra/lib/walk/index.js5
28 files changed, 1284 insertions, 0 deletions
diff --git a/node_modules/fs-extra/lib/copy-sync/copy-file-sync.js b/node_modules/fs-extra/lib/copy-sync/copy-file-sync.js
new file mode 100644
index 0000000..c6c5711
--- /dev/null
+++ b/node_modules/fs-extra/lib/copy-sync/copy-file-sync.js
@@ -0,0 +1,39 @@
+var fs = require('graceful-fs')
+
+var BUF_LENGTH = 64 * 1024
+var _buff = new Buffer(BUF_LENGTH)
+
+function copyFileSync (srcFile, destFile, options) {
+ var clobber = options.clobber
+ var preserveTimestamps = options.preserveTimestamps
+
+ if (fs.existsSync(destFile)) {
+ if (clobber) {
+ fs.chmodSync(destFile, parseInt('777', 8))
+ fs.unlinkSync(destFile)
+ } else {
+ throw Error('EEXIST')
+ }
+ }
+
+ var fdr = fs.openSync(srcFile, 'r')
+ var stat = fs.fstatSync(fdr)
+ var fdw = fs.openSync(destFile, 'w', stat.mode)
+ var bytesRead = 1
+ var pos = 0
+
+ while (bytesRead > 0) {
+ bytesRead = fs.readSync(fdr, _buff, 0, BUF_LENGTH, pos)
+ fs.writeSync(fdw, _buff, 0, bytesRead)
+ pos += bytesRead
+ }
+
+ if (preserveTimestamps) {
+ fs.futimesSync(fdw, stat.atime, stat.mtime)
+ }
+
+ fs.closeSync(fdr)
+ fs.closeSync(fdw)
+}
+
+module.exports = copyFileSync
diff --git a/node_modules/fs-extra/lib/copy-sync/copy-sync.js b/node_modules/fs-extra/lib/copy-sync/copy-sync.js
new file mode 100644
index 0000000..8168dee
--- /dev/null
+++ b/node_modules/fs-extra/lib/copy-sync/copy-sync.js
@@ -0,0 +1,48 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var copyFileSync = require('./copy-file-sync')
+var mkdir = require('../mkdirs')
+
+function copySync (src, dest, options) {
+ if (typeof options === 'function' || options instanceof RegExp) {
+ options = {filter: options}
+ }
+
+ options = options || {}
+ options.recursive = !!options.recursive
+
+ // default to true for now
+ options.clobber = 'clobber' in options ? !!options.clobber : true
+ options.dereference = 'dereference' in options ? !!options.dereference : false
+ options.preserveTimestamps = 'preserveTimestamps' in options ? !!options.preserveTimestamps : false
+
+ options.filter = options.filter || function () { return true }
+
+ var stats = (options.recursive && !options.dereference) ? fs.lstatSync(src) : fs.statSync(src)
+ var destFolder = path.dirname(dest)
+ var destFolderExists = fs.existsSync(destFolder)
+ var performCopy = false
+
+ if (stats.isFile()) {
+ if (options.filter instanceof RegExp) performCopy = options.filter.test(src)
+ else if (typeof options.filter === 'function') performCopy = options.filter(src)
+
+ if (performCopy) {
+ if (!destFolderExists) mkdir.mkdirsSync(destFolder)
+ copyFileSync(src, dest, {clobber: options.clobber, preserveTimestamps: options.preserveTimestamps})
+ }
+ } else if (stats.isDirectory()) {
+ if (!fs.existsSync(dest)) mkdir.mkdirsSync(dest)
+ var contents = fs.readdirSync(src)
+ contents.forEach(function (content) {
+ var opts = options
+ opts.recursive = true
+ copySync(path.join(src, content), path.join(dest, content), opts)
+ })
+ } else if (options.recursive && stats.isSymbolicLink()) {
+ var srcPath = fs.readlinkSync(src)
+ fs.symlinkSync(srcPath, dest)
+ }
+}
+
+module.exports = copySync
diff --git a/node_modules/fs-extra/lib/copy-sync/index.js b/node_modules/fs-extra/lib/copy-sync/index.js
new file mode 100644
index 0000000..ebc7e0b
--- /dev/null
+++ b/node_modules/fs-extra/lib/copy-sync/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+ copySync: require('./copy-sync')
+}
diff --git a/node_modules/fs-extra/lib/copy/copy.js b/node_modules/fs-extra/lib/copy/copy.js
new file mode 100644
index 0000000..d9d2912
--- /dev/null
+++ b/node_modules/fs-extra/lib/copy/copy.js
@@ -0,0 +1,44 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var ncp = require('./ncp')
+var mkdir = require('../mkdirs')
+
+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 || {}
+
+ // don't allow src and dest to be the same
+ var basePath = process.cwd()
+ var currentPath = path.resolve(basePath, src)
+ var targetPath = path.resolve(basePath, dest)
+ if (currentPath === targetPath) return callback(new Error('Source and destination must not be the same.'))
+
+ fs.lstat(src, function (err, stats) {
+ if (err) return callback(err)
+
+ var dir = null
+ if (stats.isDirectory()) {
+ var parts = dest.split(path.sep)
+ parts.pop()
+ dir = parts.join(path.sep)
+ } else {
+ dir = path.dirname(dest)
+ }
+
+ fs.exists(dir, function (dirExists) {
+ if (dirExists) return ncp(src, dest, options, callback)
+ mkdir.mkdirs(dir, function (err) {
+ if (err) return callback(err)
+ ncp(src, dest, options, callback)
+ })
+ })
+ })
+}
+
+module.exports = copy
diff --git a/node_modules/fs-extra/lib/copy/index.js b/node_modules/fs-extra/lib/copy/index.js
new file mode 100644
index 0000000..3e09016
--- /dev/null
+++ b/node_modules/fs-extra/lib/copy/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+ copy: require('./copy')
+}
diff --git a/node_modules/fs-extra/lib/copy/ncp.js b/node_modules/fs-extra/lib/copy/ncp.js
new file mode 100644
index 0000000..d30cae5
--- /dev/null
+++ b/node_modules/fs-extra/lib/copy/ncp.js
@@ -0,0 +1,243 @@
+// imported from ncp (this is temporary, will rewrite)
+
+var fs = require('graceful-fs')
+var path = require('path')
+var utimes = require('../util/utimes')
+
+function ncp (source, dest, options, callback) {
+ if (!callback) {
+ callback = options
+ options = {}
+ }
+
+ var basePath = process.cwd()
+ var currentPath = path.resolve(basePath, source)
+ var targetPath = path.resolve(basePath, dest)
+
+ var filter = options.filter
+ var transform = options.transform
+ var clobber = options.clobber !== false
+ var dereference = options.dereference
+ var preserveTimestamps = options.preserveTimestamps === true
+
+ var errs = null
+
+ var started = 0
+ var finished = 0
+ var running = 0
+ // this is pretty useless now that we're using graceful-fs
+ // consider removing
+ var limit = options.limit || 512
+
+ startCopy(currentPath)
+
+ function startCopy (source) {
+ started++
+ if (filter) {
+ if (filter instanceof RegExp) {
+ if (!filter.test(source)) {
+ return doneOne(true)
+ }
+ } else if (typeof filter === 'function') {
+ if (!filter(source)) {
+ return doneOne(true)
+ }
+ }
+ }
+ return getStats(source)
+ }
+
+ function getStats (source) {
+ var stat = dereference ? fs.stat : fs.lstat
+ if (running >= limit) {
+ return setImmediate(function () {
+ getStats(source)
+ })
+ }
+ running++
+ stat(source, function (err, stats) {
+ if (err) return onError(err)
+
+ // We need to get the mode from the stats object and preserve it.
+ var item = {
+ name: source,
+ mode: stats.mode,
+ mtime: stats.mtime, // modified time
+ atime: stats.atime, // access time
+ stats: stats // temporary
+ }
+
+ if (stats.isDirectory()) {
+ return onDir(item)
+ } else if (stats.isFile() || stats.isCharacterDevice() || stats.isBlockDevice()) {
+ return onFile(item)
+ } else if (stats.isSymbolicLink()) {
+ // Symlinks don't really need to know about the mode.
+ return onLink(source)
+ }
+ })
+ }
+
+ function onFile (file) {
+ var target = file.name.replace(currentPath, targetPath)
+ isWritable(target, function (writable) {
+ if (writable) {
+ copyFile(file, target)
+ } else {
+ if (clobber) {
+ rmFile(target, function () {
+ copyFile(file, target)
+ })
+ } else {
+ doneOne()
+ }
+ }
+ })
+ }
+
+ function copyFile (file, target) {
+ var readStream = fs.createReadStream(file.name)
+ var writeStream = fs.createWriteStream(target, { mode: file.mode })
+
+ readStream.on('error', onError)
+ writeStream.on('error', onError)
+
+ if (transform) {
+ transform(readStream, writeStream, file)
+ } else {
+ writeStream.on('open', function () {
+ readStream.pipe(writeStream)
+ })
+ }
+
+ writeStream.once('finish', function () {
+ fs.chmod(target, file.mode, function (err) {
+ if (err) return onError(err)
+ if (preserveTimestamps) {
+ utimes.utimesMillis(target, file.atime, file.mtime, function (err) {
+ if (err) return onError(err)
+ return doneOne()
+ })
+ } else {
+ doneOne()
+ }
+ })
+ })
+ }
+
+ function rmFile (file, done) {
+ fs.unlink(file, function (err) {
+ if (err) return onError(err)
+ return done()
+ })
+ }
+
+ function onDir (dir) {
+ var target = dir.name.replace(currentPath, targetPath)
+ isWritable(target, function (writable) {
+ if (writable) {
+ return mkDir(dir, target)
+ }
+ copyDir(dir.name)
+ })
+ }
+
+ function mkDir (dir, target) {
+ fs.mkdir(target, dir.mode, function (err) {
+ if (err) return onError(err)
+ // despite setting mode in fs.mkdir, doesn't seem to work
+ // so we set it here.
+ fs.chmod(target, dir.mode, function (err) {
+ if (err) return onError(err)
+ copyDir(dir.name)
+ })
+ })
+ }
+
+ function copyDir (dir) {
+ fs.readdir(dir, function (err, items) {
+ if (err) return onError(err)
+ items.forEach(function (item) {
+ startCopy(path.join(dir, item))
+ })
+ return doneOne()
+ })
+ }
+
+ function onLink (link) {
+ var target = link.replace(currentPath, targetPath)
+ fs.readlink(link, function (err, resolvedPath) {
+ if (err) return onError(err)
+ checkLink(resolvedPath, target)
+ })
+ }
+
+ function checkLink (resolvedPath, target) {
+ if (dereference) {
+ resolvedPath = path.resolve(basePath, resolvedPath)
+ }
+ isWritable(target, function (writable) {
+ if (writable) {
+ return makeLink(resolvedPath, target)
+ }
+ fs.readlink(target, function (err, targetDest) {
+ if (err) return onError(err)
+
+ if (dereference) {
+ targetDest = path.resolve(basePath, targetDest)
+ }
+ if (targetDest === resolvedPath) {
+ return doneOne()
+ }
+ return rmFile(target, function () {
+ makeLink(resolvedPath, target)
+ })
+ })
+ })
+ }
+
+ function makeLink (linkPath, target) {
+ fs.symlink(linkPath, target, function (err) {
+ if (err) return onError(err)
+ return doneOne()
+ })
+ }
+
+ function isWritable (path, done) {
+ fs.lstat(path, function (err) {
+ if (err) {
+ if (err.code === 'ENOENT') return done(true)
+ return done(false)
+ }
+ return done(false)
+ })
+ }
+
+ function onError (err) {
+ if (options.stopOnError) {
+ return callback(err)
+ } else if (!errs && options.errs) {
+ errs = fs.createWriteStream(options.errs)
+ } else if (!errs) {
+ errs = []
+ }
+ if (typeof errs.write === 'undefined') {
+ errs.push(err)
+ } else {
+ errs.write(err.stack + '\n\n')
+ }
+ return doneOne()
+ }
+
+ function doneOne (skipped) {
+ if (!skipped) running--
+ finished++
+ if ((started === finished) && (running === 0)) {
+ if (callback !== undefined) {
+ return errs ? callback(errs) : callback(null)
+ }
+ }
+ }
+}
+
+module.exports = ncp
diff --git a/node_modules/fs-extra/lib/empty/index.js b/node_modules/fs-extra/lib/empty/index.js
new file mode 100644
index 0000000..a17cbae
--- /dev/null
+++ b/node_modules/fs-extra/lib/empty/index.js
@@ -0,0 +1,47 @@
+var fs = require('fs')
+var path = require('path')
+var mkdir = require('../mkdirs')
+var remove = require('../remove')
+
+function emptyDir (dir, callback) {
+ callback = callback || function () {}
+ fs.readdir(dir, function (err, items) {
+ if (err) return mkdir.mkdirs(dir, callback)
+
+ items = items.map(function (item) {
+ return path.join(dir, item)
+ })
+
+ deleteItem()
+
+ function deleteItem () {
+ var item = items.pop()
+ if (!item) return callback()
+ remove.remove(item, function (err) {
+ if (err) return callback(err)
+ deleteItem()
+ })
+ }
+ })
+}
+
+function emptyDirSync (dir) {
+ var items
+ try {
+ items = fs.readdirSync(dir)
+ } catch (err) {
+ return mkdir.mkdirsSync(dir)
+ }
+
+ items.forEach(function (item) {
+ item = path.join(dir, item)
+ remove.removeSync(item)
+ })
+}
+
+module.exports = {
+ emptyDirSync: emptyDirSync,
+ emptydirSync: emptyDirSync,
+ emptyDir: emptyDir,
+ emptydir: emptyDir
+}
diff --git a/node_modules/fs-extra/lib/ensure/file.js b/node_modules/fs-extra/lib/ensure/file.js
new file mode 100644
index 0000000..1c9c2de
--- /dev/null
+++ b/node_modules/fs-extra/lib/ensure/file.js
@@ -0,0 +1,43 @@
+var path = require('path')
+var fs = require('graceful-fs')
+var mkdir = require('../mkdirs')
+
+function createFile (file, callback) {
+ function makeFile () {
+ fs.writeFile(file, '', function (err) {
+ if (err) return callback(err)
+ callback()
+ })
+ }
+
+ fs.exists(file, function (fileExists) {
+ if (fileExists) return callback()
+ var dir = path.dirname(file)
+ fs.exists(dir, function (dirExists) {
+ if (dirExists) return makeFile()
+ mkdir.mkdirs(dir, function (err) {
+ if (err) return callback(err)
+ makeFile()
+ })
+ })
+ })
+}
+
+function createFileSync (file) {
+ if (fs.existsSync(file)) return
+
+ var dir = path.dirname(file)
+ if (!fs.existsSync(dir)) {
+ mkdir.mkdirsSync(dir)
+ }
+
+ fs.writeFileSync(file, '')
+}
+
+module.exports = {
+ createFile: createFile,
+ createFileSync: createFileSync,
+ // alias
+ ensureFile: createFile,
+ ensureFileSync: createFileSync
+}
diff --git a/node_modules/fs-extra/lib/ensure/index.js b/node_modules/fs-extra/lib/ensure/index.js
new file mode 100644
index 0000000..26e8705
--- /dev/null
+++ b/node_modules/fs-extra/lib/ensure/index.js
@@ -0,0 +1,21 @@
+var file = require('./file')
+var link = require('./link')
+var symlink = require('./symlink')
+
+module.exports = {
+ // file
+ createFile: file.createFile,
+ createFileSync: file.createFileSync,
+ ensureFile: file.createFile,
+ ensureFileSync: file.createFileSync,
+ // link
+ createLink: link.createLink,
+ createLinkSync: link.createLinkSync,
+ ensureLink: link.createLink,
+ ensureLinkSync: link.createLinkSync,
+ // symlink
+ createSymlink: symlink.createSymlink,
+ createSymlinkSync: symlink.createSymlinkSync,
+ ensureSymlink: symlink.createSymlink,
+ ensureSymlinkSync: symlink.createSymlinkSync
+}
diff --git a/node_modules/fs-extra/lib/ensure/link.js b/node_modules/fs-extra/lib/ensure/link.js
new file mode 100644
index 0000000..4e4e283
--- /dev/null
+++ b/node_modules/fs-extra/lib/ensure/link.js
@@ -0,0 +1,58 @@
+var path = require('path')
+var fs = require('graceful-fs')
+var mkdir = require('../mkdirs')
+
+function createLink (srcpath, dstpath, callback) {
+ function makeLink (srcpath, dstpath) {
+ fs.link(srcpath, dstpath, function (err) {
+ if (err) return callback(err)
+ callback(null)
+ })
+ }
+
+ fs.exists(dstpath, function (destinationExists) {
+ if (destinationExists) return callback(null)
+ fs.lstat(srcpath, function (err, stat) {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ return callback(err)
+ }
+
+ var dir = path.dirname(dstpath)
+ fs.exists(dir, function (dirExists) {
+ if (dirExists) return makeLink(srcpath, dstpath)
+ mkdir.mkdirs(dir, function (err) {
+ if (err) return callback(err)
+ makeLink(srcpath, dstpath)
+ })
+ })
+ })
+ })
+}
+
+function createLinkSync (srcpath, dstpath, callback) {
+ var destinationExists = fs.existsSync(dstpath)
+ if (destinationExists) return undefined
+
+ try {
+ fs.lstatSync(srcpath)
+ } catch (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ throw err
+ }
+
+ var dir = path.dirname(dstpath)
+ var dirExists = fs.existsSync(dir)
+ if (dirExists) return fs.linkSync(srcpath, dstpath)
+ mkdir.mkdirsSync(dir)
+
+ return fs.linkSync(srcpath, dstpath)
+}
+
+module.exports = {
+ createLink: createLink,
+ createLinkSync: createLinkSync,
+ // alias
+ ensureLink: createLink,
+ ensureLinkSync: createLinkSync
+}
diff --git a/node_modules/fs-extra/lib/ensure/symlink-paths.js b/node_modules/fs-extra/lib/ensure/symlink-paths.js
new file mode 100644
index 0000000..cc27d04
--- /dev/null
+++ b/node_modules/fs-extra/lib/ensure/symlink-paths.js
@@ -0,0 +1,97 @@
+var path = require('path')
+// path.isAbsolute shim for Node.js 0.10 support
+path.isAbsolute = (path.isAbsolute) ? path.isAbsolute : require('path-is-absolute')
+var fs = require('graceful-fs')
+
+/**
+ * Function that returns two types of paths, one relative to symlink, and one
+ * relative to the current working directory. Checks if path is absolute or
+ * relative. If the path is relative, this function checks if the path is
+ * relative to symlink or relative to current working directory. This is an
+ * initiative to find a smarter `srcpath` to supply when building symlinks.
+ * This allows you to determine which path to use out of one of three possible
+ * types of source paths. The first is an absolute path. This is detected by
+ * `path.isAbsolute()`. When an absolute path is provided, it is checked to
+ * see if it exists. If it does it's used, if not an error is returned
+ * (callback)/ thrown (sync). The other two options for `srcpath` are a
+ * relative url. By default Node's `fs.symlink` works by creating a symlink
+ * using `dstpath` and expects the `srcpath` to be relative to the newly
+ * created symlink. If you provide a `srcpath` that does not exist on the file
+ * system it results in a broken symlink. To minimize this, the function
+ * checks to see if the 'relative to symlink' source file exists, and if it
+ * does it will use it. If it does not, it checks if there's a file that
+ * exists that is relative to the current working directory, if does its used.
+ * This preserves the expectations of the original fs.symlink spec and adds
+ * the ability to pass in `relative to current working direcotry` paths.
+ */
+
+function symlinkPaths (srcpath, dstpath, callback) {
+ if (path.isAbsolute(srcpath)) {
+ return fs.lstat(srcpath, function (err, stat) {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ 'toCwd': srcpath,
+ 'toDst': srcpath
+ })
+ })
+ } else {
+ var dstdir = path.dirname(dstpath)
+ var relativeToDst = path.join(dstdir, srcpath)
+ return fs.exists(relativeToDst, function (exists) {
+ if (exists) {
+ return callback(null, {
+ 'toCwd': relativeToDst,
+ 'toDst': srcpath
+ })
+ } else {
+ return fs.lstat(srcpath, function (err, stat) {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ 'toCwd': srcpath,
+ 'toDst': path.relative(dstdir, srcpath)
+ })
+ })
+ }
+ })
+ }
+}
+
+function symlinkPathsSync (srcpath, dstpath) {
+ var exists
+ if (path.isAbsolute(srcpath)) {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('absolute srcpath does not exist')
+ return {
+ 'toCwd': srcpath,
+ 'toDst': srcpath
+ }
+ } else {
+ var dstdir = path.dirname(dstpath)
+ var relativeToDst = path.join(dstdir, srcpath)
+ exists = fs.existsSync(relativeToDst)
+ if (exists) {
+ return {
+ 'toCwd': relativeToDst,
+ 'toDst': srcpath
+ }
+ } else {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('relative srcpath does not exist')
+ return {
+ 'toCwd': srcpath,
+ 'toDst': path.relative(dstdir, srcpath)
+ }
+ }
+ }
+}
+
+module.exports = {
+ 'symlinkPaths': symlinkPaths,
+ 'symlinkPathsSync': symlinkPathsSync
+}
diff --git a/node_modules/fs-extra/lib/ensure/symlink-type.js b/node_modules/fs-extra/lib/ensure/symlink-type.js
new file mode 100644
index 0000000..81e3588
--- /dev/null
+++ b/node_modules/fs-extra/lib/ensure/symlink-type.js
@@ -0,0 +1,27 @@
+var fs = require('graceful-fs')
+
+function symlinkType (srcpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+ if (type) return callback(null, type)
+ fs.lstat(srcpath, function (err, stats) {
+ if (err) return callback(null, 'file')
+ type = (stats && stats.isDirectory()) ? 'dir' : 'file'
+ callback(null, type)
+ })
+}
+
+function symlinkTypeSync (srcpath, type) {
+ if (type) return type
+ try {
+ var stats = fs.lstatSync(srcpath)
+ } catch (e) {
+ return 'file'
+ }
+ return (stats && stats.isDirectory()) ? 'dir' : 'file'
+}
+
+module.exports = {
+ symlinkType: symlinkType,
+ symlinkTypeSync: symlinkTypeSync
+}
diff --git a/node_modules/fs-extra/lib/ensure/symlink.js b/node_modules/fs-extra/lib/ensure/symlink.js
new file mode 100644
index 0000000..6244790
--- /dev/null
+++ b/node_modules/fs-extra/lib/ensure/symlink.js
@@ -0,0 +1,62 @@
+var path = require('path')
+var fs = require('graceful-fs')
+var _mkdirs = require('../mkdirs')
+var mkdirs = _mkdirs.mkdirs
+var mkdirsSync = _mkdirs.mkdirsSync
+
+var _symlinkPaths = require('./symlink-paths')
+var symlinkPaths = _symlinkPaths.symlinkPaths
+var symlinkPathsSync = _symlinkPaths.symlinkPathsSync
+
+var _symlinkType = require('./symlink-type')
+var symlinkType = _symlinkType.symlinkType
+var symlinkTypeSync = _symlinkType.symlinkTypeSync
+
+function createSymlink (srcpath, dstpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+
+ fs.exists(dstpath, function (destinationExists) {
+ if (destinationExists) return callback(null)
+ symlinkPaths(srcpath, dstpath, function (err, relative) {
+ if (err) return callback(err)
+ srcpath = relative.toDst
+ symlinkType(relative.toCwd, type, function (err, type) {
+ if (err) return callback(err)
+ var dir = path.dirname(dstpath)
+ fs.exists(dir, function (dirExists) {
+ if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
+ mkdirs(dir, function (err) {
+ if (err) return callback(err)
+ fs.symlink(srcpath, dstpath, type, callback)
+ })
+ })
+ })
+ })
+ })
+}
+
+function createSymlinkSync (srcpath, dstpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+
+ var destinationExists = fs.existsSync(dstpath)
+ if (destinationExists) return undefined
+
+ var relative = symlinkPathsSync(srcpath, dstpath)
+ srcpath = relative.toDst
+ type = symlinkTypeSync(relative.toCwd, type)
+ var dir = path.dirname(dstpath)
+ var exists = fs.existsSync(dir)
+ if (exists) return fs.symlinkSync(srcpath, dstpath, type)
+ mkdirsSync(dir)
+ return fs.symlinkSync(srcpath, dstpath, type)
+}
+
+module.exports = {
+ createSymlink: createSymlink,
+ createSymlinkSync: createSymlinkSync,
+ // alias
+ ensureSymlink: createSymlink,
+ ensureSymlinkSync: createSymlinkSync
+}
diff --git a/node_modules/fs-extra/lib/index.js b/node_modules/fs-extra/lib/index.js
new file mode 100644
index 0000000..a56bb0c
--- /dev/null
+++ b/node_modules/fs-extra/lib/index.js
@@ -0,0 +1,37 @@
+var assign = require('./util/assign')
+
+var fse = {}
+var gfs = require('graceful-fs')
+
+// attach fs methods to fse
+Object.keys(gfs).forEach(function (key) {
+ fse[key] = gfs[key]
+})
+
+var fs = fse
+
+assign(fs, require('./copy'))
+assign(fs, require('./copy-sync'))
+assign(fs, require('./mkdirs'))
+assign(fs, require('./remove'))
+assign(fs, require('./json'))
+assign(fs, require('./move'))
+assign(fs, require('./empty'))
+assign(fs, require('./ensure'))
+assign(fs, require('./output'))
+assign(fs, require('./walk'))
+
+module.exports = fs
+
+// maintain backwards compatibility for awhile
+var jsonfile = {}
+Object.defineProperty(jsonfile, 'spaces', {
+ get: function () {
+ return fs.spaces // found in ./json
+ },
+ set: function (val) {
+ fs.spaces = val
+ }
+})
+
+module.exports.jsonfile = jsonfile // so users of fs-extra can modify jsonFile.spaces
diff --git a/node_modules/fs-extra/lib/json/index.js b/node_modules/fs-extra/lib/json/index.js
new file mode 100644
index 0000000..b13cf54
--- /dev/null
+++ b/node_modules/fs-extra/lib/json/index.js
@@ -0,0 +1,9 @@
+var jsonFile = require('./jsonfile')
+
+jsonFile.outputJsonSync = require('./output-json-sync')
+jsonFile.outputJson = require('./output-json')
+// aliases
+jsonFile.outputJSONSync = require('./output-json-sync')
+jsonFile.outputJSON = require('./output-json')
+
+module.exports = jsonFile
diff --git a/node_modules/fs-extra/lib/json/jsonfile.js b/node_modules/fs-extra/lib/json/jsonfile.js
new file mode 100644
index 0000000..51d8390
--- /dev/null
+++ b/node_modules/fs-extra/lib/json/jsonfile.js
@@ -0,0 +1,14 @@
+var jsonFile = require('jsonfile')
+
+module.exports = {
+ // jsonfile exports
+ readJson: jsonFile.readFile,
+ readJSON: jsonFile.readFile,
+ readJsonSync: jsonFile.readFileSync,
+ readJSONSync: jsonFile.readFileSync,
+ writeJson: jsonFile.writeFile,
+ writeJSON: jsonFile.writeFile,
+ writeJsonSync: jsonFile.writeFileSync,
+ writeJSONSync: jsonFile.writeFileSync,
+ spaces: 2 // default in fs-extra
+}
diff --git a/node_modules/fs-extra/lib/json/output-json-sync.js b/node_modules/fs-extra/lib/json/output-json-sync.js
new file mode 100644
index 0000000..7684843
--- /dev/null
+++ b/node_modules/fs-extra/lib/json/output-json-sync.js
@@ -0,0 +1,16 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var jsonFile = require('./jsonfile')
+var mkdir = require('../mkdirs')
+
+function outputJsonSync (file, data, options) {
+ var dir = path.dirname(file)
+
+ if (!fs.existsSync(dir)) {
+ mkdir.mkdirsSync(dir)
+ }
+
+ jsonFile.writeJsonSync(file, data, options)
+}
+
+module.exports = outputJsonSync
diff --git a/node_modules/fs-extra/lib/json/output-json.js b/node_modules/fs-extra/lib/json/output-json.js
new file mode 100644
index 0000000..7824597
--- /dev/null
+++ b/node_modules/fs-extra/lib/json/output-json.js
@@ -0,0 +1,24 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var jsonFile = require('./jsonfile')
+var mkdir = require('../mkdirs')
+
+function outputJson (file, data, options, callback) {
+ if (typeof options === 'function') {
+ callback = options
+ options = {}
+ }
+
+ var dir = path.dirname(file)
+
+ fs.exists(dir, function (itDoes) {
+ if (itDoes) return jsonFile.writeJson(file, data, options, callback)
+
+ mkdir.mkdirs(dir, function (err) {
+ if (err) return callback(err)
+ jsonFile.writeJson(file, data, options, callback)
+ })
+ })
+}
+
+module.exports = outputJson
diff --git a/node_modules/fs-extra/lib/mkdirs/index.js b/node_modules/fs-extra/lib/mkdirs/index.js
new file mode 100644
index 0000000..2611217
--- /dev/null
+++ b/node_modules/fs-extra/lib/mkdirs/index.js
@@ -0,0 +1,9 @@
+module.exports = {
+ mkdirs: require('./mkdirs'),
+ mkdirsSync: require('./mkdirs-sync'),
+ // alias
+ mkdirp: require('./mkdirs'),
+ mkdirpSync: require('./mkdirs-sync'),
+ ensureDir: require('./mkdirs'),
+ ensureDirSync: require('./mkdirs-sync')
+}
diff --git a/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js b/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js
new file mode 100644
index 0000000..3f30680
--- /dev/null
+++ b/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js
@@ -0,0 +1,57 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var invalidWin32Path = require('./win32').invalidWin32Path
+
+var o777 = parseInt('0777', 8)
+
+function mkdirsSync (p, opts, made) {
+ if (!opts || typeof opts !== 'object') {
+ opts = { mode: opts }
+ }
+
+ var mode = opts.mode
+ var xfs = opts.fs || fs
+
+ if (process.platform === 'win32' && invalidWin32Path(p)) {
+ var errInval = new Error(p + ' contains invalid WIN32 path characters.')
+ errInval.code = 'EINVAL'
+ throw errInval
+ }
+
+ if (mode === undefined) {
+ mode = o777 & (~process.umask())
+ }
+ if (!made) made = null
+
+ p = path.resolve(p)
+
+ try {
+ xfs.mkdirSync(p, mode)
+ made = made || p
+ } catch (err0) {
+ switch (err0.code) {
+ case 'ENOENT':
+ if (path.dirname(p) === p) throw err0
+ made = mkdirsSync(path.dirname(p), opts, made)
+ mkdirsSync(p, opts, made)
+ break
+
+ // In the case of any other error, just see if there's a dir
+ // there already. If so, then hooray! If not, then something
+ // is borked.
+ default:
+ var stat
+ try {
+ stat = xfs.statSync(p)
+ } catch (err1) {
+ throw err0
+ }
+ if (!stat.isDirectory()) throw err0
+ break
+ }
+ }
+
+ return made
+}
+
+module.exports = mkdirsSync
diff --git a/node_modules/fs-extra/lib/mkdirs/mkdirs.js b/node_modules/fs-extra/lib/mkdirs/mkdirs.js
new file mode 100644
index 0000000..939776c
--- /dev/null
+++ b/node_modules/fs-extra/lib/mkdirs/mkdirs.js
@@ -0,0 +1,61 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var invalidWin32Path = require('./win32').invalidWin32Path
+
+var o777 = parseInt('0777', 8)
+
+function mkdirs (p, opts, callback, made) {
+ if (typeof opts === 'function') {
+ callback = opts
+ opts = {}
+ } else if (!opts || typeof opts !== 'object') {
+ opts = { mode: opts }
+ }
+
+ if (process.platform === 'win32' && invalidWin32Path(p)) {
+ var errInval = new Error(p + ' contains invalid WIN32 path characters.')
+ errInval.code = 'EINVAL'
+ return callback(errInval)
+ }
+
+ var mode = opts.mode
+ var xfs = opts.fs || fs
+
+ if (mode === undefined) {
+ mode = o777 & (~process.umask())
+ }
+ if (!made) made = null
+
+ callback = callback || function () {}
+ p = path.resolve(p)
+
+ xfs.mkdir(p, mode, function (er) {
+ if (!er) {
+ made = made || p
+ return callback(null, made)
+ }
+ switch (er.code) {
+ case 'ENOENT':
+ if (path.dirname(p) === p) return callback(er)
+ mkdirs(path.dirname(p), opts, function (er, made) {
+ if (er) callback(er, made)
+ else mkdirs(p, opts, callback, made)
+ })
+ break
+
+ // In the case of any other error, just see if there's a dir
+ // there already. If so, then hooray! If not, then something
+ // is borked.
+ default:
+ xfs.stat(p, function (er2, stat) {
+ // if the stat fails, then that's super weird.
+ // let the original error be the failure reason.
+ if (er2 || !stat.isDirectory()) callback(er, made)
+ else callback(null, made)
+ })
+ break
+ }
+ })
+}
+
+module.exports = mkdirs
diff --git a/node_modules/fs-extra/lib/mkdirs/win32.js b/node_modules/fs-extra/lib/mkdirs/win32.js
new file mode 100644
index 0000000..569ac1a
--- /dev/null
+++ b/node_modules/fs-extra/lib/mkdirs/win32.js
@@ -0,0 +1,24 @@
+'use strict'
+var path = require('path')
+
+// get drive on windows
+function getRootPath (p) {
+ p = path.normalize(path.resolve(p)).split(path.sep)
+ if (p.length > 0) return p[0]
+ else return null
+}
+
+// http://stackoverflow.com/a/62888/10333 contains more accurate
+// TODO: expand to include the rest
+var INVALID_PATH_CHARS = /[<>:"|?*]/
+
+function invalidWin32Path (p) {
+ var rp = getRootPath(p)
+ p = p.replace(rp, '')
+ return INVALID_PATH_CHARS.test(p)
+}
+
+module.exports = {
+ getRootPath: getRootPath,
+ invalidWin32Path: invalidWin32Path
+}
diff --git a/node_modules/fs-extra/lib/move/index.js b/node_modules/fs-extra/lib/move/index.js
new file mode 100644
index 0000000..f28152f
--- /dev/null
+++ b/node_modules/fs-extra/lib/move/index.js
@@ -0,0 +1,161 @@
+// most of this code was written by Andrew Kelley
+// licensed under the BSD license: see
+// https://github.com/andrewrk/node-mv/blob/master/package.json
+
+// this needs a cleanup
+
+var fs = require('graceful-fs')
+var ncp = require('../copy/ncp')
+var path = require('path')
+var rimraf = require('rimraf')
+var mkdirp = require('../mkdirs').mkdirs
+
+function mv (source, dest, options, callback) {
+ if (typeof options === 'function') {
+ callback = options
+ options = {}
+ }
+
+ var shouldMkdirp = ('mkdirp' in options) ? options.mkdirp : true
+ var clobber = ('clobber' in options) ? options.clobber : false
+
+ var limit = options.limit || 16
+
+ if (shouldMkdirp) {
+ mkdirs()
+ } else {
+ doRename()
+ }
+
+ function mkdirs () {
+ mkdirp(path.dirname(dest), function (err) {
+ if (err) return callback(err)
+ doRename()
+ })
+ }
+
+ function doRename () {
+ if (clobber) {
+ fs.rename(source, dest, function (err) {
+ if (!err) return callback()
+
+ if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST') {
+ rimraf(dest, function (err) {
+ if (err) return callback(err)
+ options.clobber = false // just clobbered it, no need to do it again
+ mv(source, dest, options, callback)
+ })
+ return
+ }
+
+ // weird Windows shit
+ if (err.code === 'EPERM') {
+ setTimeout(function () {
+ rimraf(dest, function (err) {
+ if (err) return callback(err)
+ options.clobber = false
+ mv(source, dest, options, callback)
+ })
+ }, 200)
+ return
+ }
+
+ if (err.code !== 'EXDEV') return callback(err)
+ moveAcrossDevice(source, dest, clobber, limit, callback)
+ })
+ } else {
+ fs.link(source, dest, function (err) {
+ if (err) {
+ if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM') {
+ moveAcrossDevice(source, dest, clobber, limit, callback)
+ return
+ }
+ callback(err)
+ return
+ }
+ fs.unlink(source, callback)
+ })
+ }
+ }
+}
+
+function moveAcrossDevice (source, dest, clobber, limit, callback) {
+ fs.stat(source, function (err, stat) {
+ if (err) {
+ callback(err)
+ return
+ }
+
+ if (stat.isDirectory()) {
+ moveDirAcrossDevice(source, dest, clobber, limit, callback)
+ } else {
+ moveFileAcrossDevice(source, dest, clobber, limit, callback)
+ }
+ })
+}
+
+function moveFileAcrossDevice (source, dest, clobber, limit, callback) {
+ var outFlags = clobber ? 'w' : 'wx'
+ var ins = fs.createReadStream(source)
+ var outs = fs.createWriteStream(dest, {flags: outFlags})
+
+ ins.on('error', function (err) {
+ ins.destroy()
+ outs.destroy()
+ outs.removeListener('close', onClose)
+
+ // may want to create a directory but `out` line above
+ // creates an empty file for us: See #108
+ // don't care about error here
+ fs.unlink(dest, function () {
+ // note: `err` here is from the input stream errror
+ if (err.code === 'EISDIR' || err.code === 'EPERM') {
+ moveDirAcrossDevice(source, dest, clobber, limit, callback)
+ } else {
+ callback(err)
+ }
+ })
+ })
+
+ outs.on('error', function (err) {
+ ins.destroy()
+ outs.destroy()
+ outs.removeListener('close', onClose)
+ callback(err)
+ })
+
+ outs.once('close', onClose)
+ ins.pipe(outs)
+
+ function onClose () {
+ fs.unlink(source, callback)
+ }
+}
+
+function moveDirAcrossDevice (source, dest, clobber, limit, callback) {
+ var options = {
+ stopOnErr: true,
+ clobber: false,
+ limit: limit
+ }
+
+ function startNcp () {
+ ncp(source, dest, options, function (errList) {
+ if (errList) return callback(errList[0])
+ rimraf(source, callback)
+ })
+ }
+
+ if (clobber) {
+ rimraf(dest, function (err) {
+ if (err) return callback(err)
+ startNcp()
+ })
+ } else {
+ startNcp()
+ }
+}
+
+module.exports = {
+ move: mv
+}
diff --git a/node_modules/fs-extra/lib/output/index.js b/node_modules/fs-extra/lib/output/index.js
new file mode 100644
index 0000000..e8f45f3
--- /dev/null
+++ b/node_modules/fs-extra/lib/output/index.js
@@ -0,0 +1,35 @@
+var path = require('path')
+var fs = require('graceful-fs')
+var mkdir = require('../mkdirs')
+
+function outputFile (file, data, encoding, callback) {
+ if (typeof encoding === 'function') {
+ callback = encoding
+ encoding = 'utf8'
+ }
+
+ var dir = path.dirname(file)
+ fs.exists(dir, function (itDoes) {
+ if (itDoes) return fs.writeFile(file, data, encoding, callback)
+
+ mkdir.mkdirs(dir, function (err) {
+ if (err) return callback(err)
+
+ fs.writeFile(file, data, encoding, callback)
+ })
+ })
+}
+
+function outputFileSync (file, data, encoding) {
+ var dir = path.dirname(file)
+ if (fs.existsSync(dir)) {
+ return fs.writeFileSync.apply(fs, arguments)
+ }
+ mkdir.mkdirsSync(dir)
+ fs.writeFileSync.apply(fs, arguments)
+}
+
+module.exports = {
+ outputFile: outputFile,
+ outputFileSync: outputFileSync
+}
diff --git a/node_modules/fs-extra/lib/remove/index.js b/node_modules/fs-extra/lib/remove/index.js
new file mode 100644
index 0000000..925de67
--- /dev/null
+++ b/node_modules/fs-extra/lib/remove/index.js
@@ -0,0 +1,14 @@
+var rimraf = require('rimraf')
+
+function removeSync (dir) {
+ return rimraf.sync(dir)
+}
+
+function remove (dir, callback) {
+ return callback ? rimraf(dir, callback) : rimraf(dir, function () {})
+}
+
+module.exports = {
+ remove: remove,
+ removeSync: removeSync
+}
diff --git a/node_modules/fs-extra/lib/util/assign.js b/node_modules/fs-extra/lib/util/assign.js
new file mode 100644
index 0000000..8e41f9a
--- /dev/null
+++ b/node_modules/fs-extra/lib/util/assign.js
@@ -0,0 +1,14 @@
+// simple mutable assign
+function assign () {
+ var args = [].slice.call(arguments).filter(function (i) { return i })
+ var dest = args.shift()
+ args.forEach(function (src) {
+ Object.keys(src).forEach(function (key) {
+ dest[key] = src[key]
+ })
+ })
+
+ return dest
+}
+
+module.exports = assign
diff --git a/node_modules/fs-extra/lib/util/utimes.js b/node_modules/fs-extra/lib/util/utimes.js
new file mode 100644
index 0000000..c99b010
--- /dev/null
+++ b/node_modules/fs-extra/lib/util/utimes.js
@@ -0,0 +1,69 @@
+var fs = require('graceful-fs')
+var path = require('path')
+var os = require('os')
+
+// HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
+function hasMillisResSync () {
+ var tmpfile = path.join('millis-test-sync' + Date.now().toString() + Math.random().toString().slice(2))
+ tmpfile = path.join(os.tmpdir(), tmpfile)
+
+ // 550 millis past UNIX epoch
+ var d = new Date(1435410243862)
+ fs.writeFileSync(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141')
+ var fd = fs.openSync(tmpfile, 'r+')
+ fs.futimesSync(fd, d, d)
+ fs.closeSync(fd)
+ return fs.statSync(tmpfile).mtime > 1435410243000
+}
+
+function hasMillisRes (callback) {
+ var tmpfile = path.join('millis-test' + Date.now().toString() + Math.random().toString().slice(2))
+ tmpfile = path.join(os.tmpdir(), tmpfile)
+
+ // 550 millis past UNIX epoch
+ var d = new Date(1435410243862)
+ fs.writeFile(tmpfile, 'https://github.com/jprichardson/node-fs-extra/pull/141', function (err) {
+ if (err) return callback(err)
+ fs.open(tmpfile, 'r+', function (err, fd) {
+ if (err) return callback(err)
+ fs.futimes(fd, d, d, function (err) {
+ if (err) return callback(err)
+ fs.close(fd, function (err) {
+ if (err) return callback(err)
+ fs.stat(tmpfile, function (err, stats) {
+ if (err) return callback(err)
+ callback(null, stats.mtime > 1435410243000)
+ })
+ })
+ })
+ })
+ })
+}
+
+function timeRemoveMillis (timestamp) {
+ if (typeof timestamp === 'number') {
+ return Math.floor(timestamp / 1000) * 1000
+ } else if (timestamp instanceof Date) {
+ return new Date(Math.floor(timestamp.getTime() / 1000) * 1000)
+ } else {
+ throw new Error('fs-extra: timeRemoveMillis() unknown parameter type')
+ }
+}
+
+function utimesMillis (path, atime, mtime, callback) {
+ // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
+ fs.open(path, 'r+', function (err, fd) {
+ if (err) return callback(err)
+ fs.futimes(fd, atime, mtime, function (err) {
+ if (err) return callback(err)
+ fs.close(fd, callback)
+ })
+ })
+}
+
+module.exports = {
+ hasMillisRes: hasMillisRes,
+ hasMillisResSync: hasMillisResSync,
+ timeRemoveMillis: timeRemoveMillis,
+ utimesMillis: utimesMillis
+}
diff --git a/node_modules/fs-extra/lib/walk/index.js b/node_modules/fs-extra/lib/walk/index.js
new file mode 100644
index 0000000..8626d47
--- /dev/null
+++ b/node_modules/fs-extra/lib/walk/index.js
@@ -0,0 +1,5 @@
+var klaw = require('klaw')
+
+module.exports = {
+ walk: klaw
+}