summaryrefslogtreecommitdiffstats
path: root/node_modules/copy-concurrently
diff options
context:
space:
mode:
authorGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
committerGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
commite06ec920f7a5d784e674c4c4b4e6d1da3dc7391d (patch)
tree55713f725f77b44ebfec86e4eec3ce33e71458ca /node_modules/copy-concurrently
downloadwebsite_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.gz
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.bz2
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.zip
api, login, auth
Diffstat (limited to 'node_modules/copy-concurrently')
-rw-r--r--node_modules/copy-concurrently/LICENSE14
-rw-r--r--node_modules/copy-concurrently/README.md128
-rw-r--r--node_modules/copy-concurrently/README.md~127
-rw-r--r--node_modules/copy-concurrently/copy.js225
-rw-r--r--node_modules/copy-concurrently/is-windows.js2
l---------node_modules/copy-concurrently/node_modules/.bin/rimraf1
-rw-r--r--node_modules/copy-concurrently/node_modules/rimraf/LICENSE15
-rw-r--r--node_modules/copy-concurrently/node_modules/rimraf/README.md101
-rwxr-xr-xnode_modules/copy-concurrently/node_modules/rimraf/bin.js50
-rw-r--r--node_modules/copy-concurrently/node_modules/rimraf/package.json67
-rw-r--r--node_modules/copy-concurrently/node_modules/rimraf/rimraf.js372
-rw-r--r--node_modules/copy-concurrently/package.json74
12 files changed, 1176 insertions, 0 deletions
diff --git a/node_modules/copy-concurrently/LICENSE b/node_modules/copy-concurrently/LICENSE
new file mode 100644
index 0000000..83e7c4c
--- /dev/null
+++ b/node_modules/copy-concurrently/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2017, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/node_modules/copy-concurrently/README.md b/node_modules/copy-concurrently/README.md
new file mode 100644
index 0000000..3f6f974
--- /dev/null
+++ b/node_modules/copy-concurrently/README.md
@@ -0,0 +1,128 @@
+# copy-concurrently
+
+Copy files, directories and symlinks
+
+```
+const copy = require('copy-concurrently')
+copy('/path/to/thing', '/new/path/thing').then(() => {
+ // this is now copied
+}).catch(err => {
+ // oh noooo
+})
+```
+
+Copies files, directories and symlinks. Ownership is maintained when
+running as root, permissions are always maintained. On Windows, if symlinks
+are unavailable then junctions will be used.
+
+## PUBLIC INTERFACE
+
+### copy(from, to, [options]) → Promise
+
+Recursively copies `from` to `to` and resolves its promise when finished.
+If `to` already exists then the promise will be rejected with an `EEXIST`
+error.
+
+Options are:
+
+* maxConcurrency – (Default: `1`) The maximum number of concurrent copies to do at once.
+* recurseWith - (Default: `copy.item`) The function to call on each file after recursing into a directory.
+* isWindows - (Default: `process.platform === 'win32'`) If true enables Windows symlink semantics. This requires
+ an extra `stat` to determine if the destination of a symlink is a file or directory. If symlinking a directory
+ fails then we'll try making a junction instead.
+
+Options can also include dependency injection:
+
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* writeStreamAtomic - (Default: `require('fs-write-stream-atomic')`) The
+ implementation of `writeStreamAtomic` to use. Used to inject a mock.
+* getuid - (Default: `process.getuid`) A function that returns the current UID. Used to inject a mock.
+
+## EXTENSION INTERFACE
+
+Ordinarily you'd only call `copy` above. But it's possible to use it's
+component functions directly. This is useful if, say, you're writing
+[move-concurently](https://npmjs.com/package/move-concurrently).
+
+### copy.file(from, to, options) → Promise
+
+Copies an ordinary file `from` to destination `to`. Uses
+`fs-write-stream-atomic` to ensure that the file is either entirely copied
+or not at all.
+
+Options are:
+
+* uid, gid - (Optional) If `getuid()` is `0` then this and gid will be used to
+ set the user and group of `to`. If uid is present then gid must be too.
+* mode - (Optional) If set then `to` will have its perms set to `mode`.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* writeStreamAtomic - (Default `require('fs-write-stream-atomic')`) The
+ implementation of `writeStreamAtomic` to use. Used to inject a mock.
+
+### copy.symlink(from, to, options) → Promise
+
+Copies a symlink `from` to destination `to`. If you're using Windows and
+symlinking fails and what you're linking is a directory then junctions will
+be tried instead.
+
+Options are:
+
+* top - The top level the copy is being run from. This is used to determine
+ if the symlink destination is within the set of files we're copying or
+ outside it.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* isWindows - (Default: `process.platform === 'win32'`) If true enables Windows symlink semantics. This requires
+ an extra `stat` to determine if the destination of a symlink is a file or directory. If symlinking a directory
+ fails then we'll try making a junction instead.
+
+### copy.recurse(from, to, options) → Promise
+
+Reads all of the files in directory `from` and adds them to the `queue`
+using `recurseWith` (by default `copy.item`).
+
+Options are:
+
+* queue - A [`run-queue`](https://npmjs.com/package/run-queue) object to add files found inside `from` to.
+* recurseWith - (Default: `copy.item`) The function to call on each file after recursing into a directory.
+* uid, gid - (Optional) If `getuid()` is `0` then this and gid will be used to
+ set the user and group of `to`. If uid is present then gid must be too.
+* mode - (Optional) If set then `to` will have its perms set to `mode`.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* getuid - (Default: `process.getuid`) A function that returns the current UID. Used to inject a mock.
+
+### copy.item(from, to, options) → Promise
+
+Copies some kind of `from` to destination `to`. This looks at the filetype
+and calls `copy.file`, `copy.symlink` or `copy.recurse` as appropriate.
+
+Symlink copies are queued with a priority such that they happen after all
+file and directory copies as you can't create a junction on windows to a
+file that doesn't exist yet.
+
+Options are:
+
+* top - The top level the copy is being run from. This is used to determine
+ if the symlink destination is within the set of files we're copying or
+ outside it.
+* queue - The [`run-queue`](https://npmjs.com/package/run-queue) object to
+ pass to `copy.recurse` if `from` is a directory.
+* recurseWith - (Default: `copy.item`) The function to call on each file after recursing into a directory.
+* uid, gid - (Optional) If `getuid()` is `0` then this and gid will be used to
+ set the user and group of `to`. If uid is present then gid must be too.
+* mode - (Optional) If set then `to` will have its perms set to `mode`.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* getuid - (Default: `process.getuid`) A function that returns the current UID. Used to inject a mock.
+* isWindows - (Default: `process.platform === 'win32'`) If true enables Windows symlink semantics. This requires
+ an extra `stat` to determine if the destination of a symlink is a file or directory. If symlinking a directory
+ fails then we'll try making a junction instead.
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* writeStreamAtomic - (Default `require('fs-write-stream-atomic')`) The
+ implementation of `writeStreamAtomic` to use. Used to inject a mock.
diff --git a/node_modules/copy-concurrently/README.md~ b/node_modules/copy-concurrently/README.md~
new file mode 100644
index 0000000..7f93b2a
--- /dev/null
+++ b/node_modules/copy-concurrently/README.md~
@@ -0,0 +1,127 @@
+# copy-concurrently
+
+Copy files, directories and symlinks
+
+```
+const copy = require('copy-concurrently')
+copy('/path/to/thing', '/new/path/thing').then(() => {
+ // this is now copied
+}).catch(err => {
+ // oh noooo
+})
+```
+
+Copies files, directories and symlinks. Ownership is maintained when
+running as root, permissions are always maintained. On Windows, if symlinks
+are unavailable then junctions will be used.
+
+## PUBLIC INTERFACE
+
+### copy(from, to, [options]) → Promise
+
+Recursively copies `from` to `to` and resolves its promise when finished.
+If `to` already exists then the promise will be rejected with an `EEXIST`
+error.
+
+Options are:
+
+* maxConcurrency – (Default: `1`) The maximum number of concurrent copies to do at once.
+* recurseWith - (Default: `copy.item`) The function to call on each file after recursing into a directory.
+* isWindows - (Default: `process.platform === 'win32'`) If true enables Windows symlink semantics. This requires
+ an extra `stat` to determine if the destination of a symlink is a file or directory. If symlinking a directory
+ fails then we'll try making a junction instead.
+
+Options can also include dependency injection:
+
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* writeStreamAtomic - (Default: `require('fs-write-stream-atomic')`) The
+ implementation of `writeStreamAtomic` to use. Used to inject a mock.
+* getuid - (Default: `process.getuid`) A function that returns the current UID. Used to inject a mock.
+
+## EXTENSION INTERFACE
+
+Ordinarily you'd only call `copy` above. But it's possible to use it's
+component functions directly. This is useful if, say, you're writing
+[move-concurently](https://npmjs.com/package/move-concurrently).
+
+### copy.file(from, to, options) → Promise
+
+Copies a ordinary file `from` to destination `to`. Uses
+`fs-write-stream-atomic` to ensure that the file is entirely copied or not
+at all.
+
+Options are:
+
+* uid, gid - (Optional) If `getuid()` is `0` then this and gid will be used to
+ set the user and group of `to`. If uid is present then gid must be too.
+* mode - (Optional) If set then `to` will have its perms set to `mode`.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* writeStreamAtomic - (Default `require('fs-write-stream-atomic')`) The
+ implementation of `writeStreamAtomic` to use. Used to inject a mock.
+
+### copy.symlink(from, to, options) → Promise
+
+Copies a symlink `from` to destination `to`. If on Windows then if
+symlinking fails, a junction will be used instead.
+
+Options are:
+
+* top - The top level the copy is being run from. This is used to determine
+ if the symlink destination is within the set of files we're copying or
+ outside it.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* isWindows - (Default: `process.platform === 'win32'`) If true enables Windows symlink semantics. This requires
+ an extra `stat` to determine if the destination of a symlink is a file or directory. If symlinking a directory
+ fails then we'll try making a junction instead.
+
+### copy.recurse(from, to, options) → Promise
+
+Reads all of the files in directory `from` and adds them to the `queue`
+using `recurseWith` (by default `copy.item`).
+
+Options are:
+
+* queue - A [`run-queue`](https://npmjs.com/package/run-queue) object to add files found inside `from` to.
+* recurseWith - (Default: `copy.item`) The function to call on each file after recursing into a directory.
+* uid, gid - (Optional) If `getuid()` is `0` then this and gid will be used to
+ set the user and group of `to`. If uid is present then gid must be too.
+* mode - (Optional) If set then `to` will have its perms set to `mode`.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* getuid - (Default: `process.getuid`) A function that returns the current UID. Used to inject a mock.
+
+### copy.item(from, to, options) → Promise
+
+Copies some kind of `from` to destination `to`. This looks at the filetype
+and calls `copy.file`, `copy.symlink` or `copy.recurse` as appropriate.
+
+Symlink copies are queued with a priority such that they happen after all
+file and directory copies as you can't create a junction on windows to a
+file that doesn't exist yet.
+
+Options are:
+
+* top - The top level the copy is being run from. This is used to determine
+ if the symlink destination is within the set of files we're copying or
+ outside it.
+* queue - The [`run-queue`](https://npmjs.com/package/run-queue) object to
+ pass to `copy.recurse` if `from` is a directory.
+* recurseWith - (Default: `copy.item`) The function to call on each file after recursing into a directory.
+* uid, gid - (Optional) If `getuid()` is `0` then this and gid will be used to
+ set the user and group of `to`. If uid is present then gid must be too.
+* mode - (Optional) If set then `to` will have its perms set to `mode`.
+* fs - (Default: `require('fs')`) The filesystem module to use. Can be used
+ to use `graceful-fs` or to inject a mock.
+* getuid - (Default: `process.getuid`) A function that returns the current UID. Used to inject a mock.
+* isWindows - (Default: `process.platform === 'win32'`) If true enables Windows symlink semantics. This requires
+ an extra `stat` to determine if the destination of a symlink is a file or directory. If symlinking a directory
+ fails then we'll try making a junction instead.
+* Promise - (Default: `global.Promise`) The promise implementation to use, defaults to Node's.
+* writeStreamAtomic - (Default `require('fs-write-stream-atomic')`) The
+ implementation of `writeStreamAtomic` to use. Used to inject a mock.
diff --git a/node_modules/copy-concurrently/copy.js b/node_modules/copy-concurrently/copy.js
new file mode 100644
index 0000000..36ce9f4
--- /dev/null
+++ b/node_modules/copy-concurrently/copy.js
@@ -0,0 +1,225 @@
+'use strict'
+module.exports = copy
+module.exports.item = copyItem
+module.exports.recurse = recurseDir
+module.exports.symlink = copySymlink
+module.exports.file = copyFile
+
+var nodeFs = require('fs')
+var path = require('path')
+var validate = require('aproba')
+var stockWriteStreamAtomic = require('fs-write-stream-atomic')
+var mkdirp = require('mkdirp')
+var rimraf = require('rimraf')
+var isWindows = require('./is-windows')
+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 copy (from, to, opts) {
+ validate('SSO|SS', arguments)
+ opts = extend({}, opts || {})
+
+ var Promise = opts.Promise || global.Promise
+ var fs = opts.fs || nodeFs
+
+ if (opts.isWindows == null) opts.isWindows = isWindows
+ if (!opts.Promise) opts.Promise = Promise
+ if (!opts.fs) opts.fs = fs
+ if (!opts.recurseWith) opts.recurseWith = copyItem
+ if (!opts.lstat) opts.lstat = promisify(opts.Promise, fs.lstat)
+ if (!opts.stat) opts.stat = promisify(opts.Promise, fs.stat)
+ if (!opts.chown) opts.chown = promisify(opts.Promise, fs.chown)
+ if (!opts.readdir) opts.readdir = promisify(opts.Promise, fs.readdir)
+ if (!opts.readlink) opts.readlink = promisify(opts.Promise, fs.readlink)
+ if (!opts.symlink) opts.symlink = promisify(opts.Promise, fs.symlink)
+ if (!opts.chmod) opts.chmod = promisify(opts.Promise, fs.chmod)
+
+ opts.top = from
+ opts.mkdirpAsync = promisify(opts.Promise, mkdirp)
+ var rimrafAsync = promisify(opts.Promise, rimraf)
+
+ var queue = new RunQueue({
+ maxConcurrency: opts.maxConcurrency,
+ Promise: Promise
+ })
+ opts.queue = queue
+
+ queue.add(0, copyItem, [from, to, opts])
+
+ return queue.run().catch(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 copyItem (from, to, opts) {
+ validate('SSO', [from, to, opts])
+ var fs = opts.fs || nodeFs
+ var Promise = opts.Promise || global.Promise
+ var lstat = opts.lstat || promisify(Promise, fs.lstat)
+
+ return lstat(to).then(function () {
+ return Promise.reject(eexists(from, to))
+ }, function (err) {
+ if (err && err.code !== 'ENOENT') return Promise.reject(err)
+ return lstat(from)
+ }).then(function (fromStat) {
+ var cmdOpts = extend(extend({}, opts), fromStat)
+ if (fromStat.isDirectory()) {
+ return recurseDir(from, to, cmdOpts)
+ } else if (fromStat.isSymbolicLink()) {
+ opts.queue.add(1, copySymlink, [from, to, cmdOpts])
+ } else if (fromStat.isFile()) {
+ return copyFile(from, to, cmdOpts)
+ } else if (fromStat.isBlockDevice()) {
+ return Promise.reject(eunsupported(from + " is a block device, and we don't know how to copy those."))
+ } else if (fromStat.isCharacterDevice()) {
+ return Promise.reject(eunsupported(from + " is a character device, and we don't know how to copy those."))
+ } else if (fromStat.isFIFO()) {
+ return Promise.reject(eunsupported(from + " is a FIFO, and we don't know how to copy those."))
+ } else if (fromStat.isSocket()) {
+ return Promise.reject(eunsupported(from + " is a socket, and we don't know how to copy those."))
+ } else {
+ return Promise.reject(eunsupported("We can't tell what " + from + " is and so we can't copy it."))
+ }
+ })
+}
+
+function recurseDir (from, to, opts) {
+ validate('SSO', [from, to, opts])
+ var recurseWith = opts.recurseWith || copyItem
+ var fs = opts.fs || nodeFs
+ var chown = opts.chown || promisify(Promise, fs.chown)
+ var readdir = opts.readdir || promisify(Promise, fs.readdir)
+ var mkdirpAsync = opts.mkdirpAsync || promisify(Promise, mkdirp)
+
+ return mkdirpAsync(to, {fs: fs, mode: opts.mode}).then(function () {
+ var getuid = opts.getuid || process.getuid
+ if (getuid && opts.uid != null && getuid() === 0) {
+ return chown(to, opts.uid, opts.gid)
+ }
+ }).then(function () {
+ return readdir(from)
+ }).then(function (files) {
+ files.forEach(function (file) {
+ opts.queue.add(0, recurseWith, [path.join(from, file), path.join(to, file), opts])
+ })
+ })
+}
+
+function copySymlink (from, to, opts) {
+ validate('SSO', [from, to, opts])
+ var fs = opts.fs || nodeFs
+ var readlink = opts.readlink || promisify(Promise, fs.readlink)
+ var stat = opts.stat || promisify(Promise, fs.symlink)
+ var symlink = opts.symlink || promisify(Promise, fs.symlink)
+ var Promise = opts.Promise || global.Promise
+
+ return readlink(from).then(function (fromDest) {
+ var absoluteDest = path.resolve(path.dirname(from), fromDest)
+ // Treat absolute paths that are inside the tree we're
+ // copying as relative. This necessary to properly support junctions
+ // on windows (which are always absolute) but is also DWIM with symlinks.
+ var relativeDest = path.relative(opts.top, absoluteDest)
+ var linkFrom = relativeDest.substr(0, 2) === '..' ? fromDest : path.relative(path.dirname(from), absoluteDest)
+ if (opts.isWindows) {
+ return stat(absoluteDest).catch(function () { return null }).then(function (destStat) {
+ var isDir = destStat && destStat.isDirectory()
+ var type = isDir ? 'dir' : 'file'
+ return symlink(linkFrom, to, type).catch(function (err) {
+ if (type === 'dir') {
+ return symlink(linkFrom, to, 'junction')
+ } else {
+ return Promise.reject(err)
+ }
+ })
+ })
+ } else {
+ return symlink(linkFrom, to)
+ }
+ })
+}
+
+function copyFile (from, to, opts) {
+ validate('SSO', [from, to, opts])
+ var fs = opts.fs || nodeFs
+ var writeStreamAtomic = opts.writeStreamAtomic || stockWriteStreamAtomic
+ var Promise = opts.Promise || global.Promise
+ var chmod = opts.chmod || promisify(Promise, fs.chmod)
+
+ var writeOpts = {}
+ var getuid = opts.getuid || process.getuid
+ if (getuid && opts.uid != null && getuid() === 0) {
+ writeOpts.chown = {
+ uid: opts.uid,
+ gid: opts.gid
+ }
+ }
+
+ return new Promise(function (resolve, reject) {
+ var errored = false
+ function onError (err) {
+ errored = true
+ reject(err)
+ }
+ fs.createReadStream(from)
+ .once('error', onError)
+ .pipe(writeStreamAtomic(to, writeOpts))
+ .once('error', onError)
+ .once('close', function () {
+ if (errored) return
+ if (opts.mode != null) {
+ resolve(chmod(to, opts.mode))
+ } else {
+ resolve()
+ }
+ })
+ })
+}
+
+function eexists (from, to) {
+ var err = new Error('Could not move ' + from + ' to ' + to + ': destination already exists.')
+ err.code = 'EEXIST'
+ return err
+}
+
+function eunsupported (msg) {
+ var err = new Error(msg)
+ err.code = 'EUNSUPPORTED'
+ return err
+}
diff --git a/node_modules/copy-concurrently/is-windows.js b/node_modules/copy-concurrently/is-windows.js
new file mode 100644
index 0000000..8a991d5
--- /dev/null
+++ b/node_modules/copy-concurrently/is-windows.js
@@ -0,0 +1,2 @@
+'use strict'
+module.exports = process.platform === 'win32'
diff --git a/node_modules/copy-concurrently/node_modules/.bin/rimraf b/node_modules/copy-concurrently/node_modules/.bin/rimraf
new file mode 120000
index 0000000..4cd49a4
--- /dev/null
+++ b/node_modules/copy-concurrently/node_modules/.bin/rimraf
@@ -0,0 +1 @@
+../rimraf/bin.js \ No newline at end of file
diff --git a/node_modules/copy-concurrently/node_modules/rimraf/LICENSE b/node_modules/copy-concurrently/node_modules/rimraf/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/copy-concurrently/node_modules/rimraf/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/copy-concurrently/node_modules/rimraf/README.md b/node_modules/copy-concurrently/node_modules/rimraf/README.md
new file mode 100644
index 0000000..423b8cf
--- /dev/null
+++ b/node_modules/copy-concurrently/node_modules/rimraf/README.md
@@ -0,0 +1,101 @@
+[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)
+
+The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.
+
+Install with `npm install rimraf`, or just drop rimraf.js somewhere.
+
+## API
+
+`rimraf(f, [opts], callback)`
+
+The first parameter will be interpreted as a globbing pattern for files. If you
+want to disable globbing you can do so with `opts.disableGlob` (defaults to
+`false`). This might be handy, for instance, if you have filenames that contain
+globbing wildcard characters.
+
+The callback will be called with an error if there is one. Certain
+errors are handled for you:
+
+* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
+ `opts.maxBusyTries` times before giving up, adding 100ms of wait
+ between each attempt. The default `maxBusyTries` is 3.
+* `ENOENT` - If the file doesn't exist, rimraf will return
+ successfully, since your desired outcome is already the case.
+* `EMFILE` - Since `readdir` requires opening a file descriptor, it's
+ possible to hit `EMFILE` if too many file descriptors are in use.
+ In the sync case, there's nothing to be done for this. But in the
+ async case, rimraf will gradually back off with timeouts up to
+ `opts.emfileWait` ms, which defaults to 1000.
+
+## options
+
+* unlink, chmod, stat, lstat, rmdir, readdir,
+ unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync
+
+ In order to use a custom file system library, you can override
+ specific fs functions on the options object.
+
+ If any of these functions are present on the options object, then
+ the supplied function will be used instead of the default fs
+ method.
+
+ Sync methods are only relevant for `rimraf.sync()`, of course.
+
+ For example:
+
+ ```javascript
+ var myCustomFS = require('some-custom-fs')
+
+ rimraf('some-thing', myCustomFS, callback)
+ ```
+
+* maxBusyTries
+
+ If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered
+ on Windows systems, then rimraf will retry with a linear backoff
+ wait of 100ms longer on each try. The default maxBusyTries is 3.
+
+ Only relevant for async usage.
+
+* emfileWait
+
+ If an `EMFILE` error is encountered, then rimraf will retry
+ repeatedly with a linear backoff of 1ms longer on each try, until
+ the timeout counter hits this max. The default limit is 1000.
+
+ If you repeatedly encounter `EMFILE` errors, then consider using
+ [graceful-fs](http://npm.im/graceful-fs) in your program.
+
+ Only relevant for async usage.
+
+* glob
+
+ Set to `false` to disable [glob](http://npm.im/glob) pattern
+ matching.
+
+ Set to an object to pass options to the glob module. The default
+ glob options are `{ nosort: true, silent: true }`.
+
+ Glob version 6 is used in this module.
+
+ Relevant for both sync and async usage.
+
+* disableGlob
+
+ Set to any non-falsey value to disable globbing entirely.
+ (Equivalent to setting `glob: false`.)
+
+## rimraf.sync
+
+It can remove stuff synchronously, too. But that's not so good. Use
+the async API. It's better.
+
+## CLI
+
+If installed with `npm install rimraf -g` it can be used as a global
+command `rimraf <path> [<path> ...]` which is useful for cross platform support.
+
+## mkdirp
+
+If you need to create a directory recursively, check out
+[mkdirp](https://github.com/substack/node-mkdirp).
diff --git a/node_modules/copy-concurrently/node_modules/rimraf/bin.js b/node_modules/copy-concurrently/node_modules/rimraf/bin.js
new file mode 100755
index 0000000..0d1e17b
--- /dev/null
+++ b/node_modules/copy-concurrently/node_modules/rimraf/bin.js
@@ -0,0 +1,50 @@
+#!/usr/bin/env node
+
+var rimraf = require('./')
+
+var help = false
+var dashdash = false
+var noglob = false
+var args = process.argv.slice(2).filter(function(arg) {
+ if (dashdash)
+ return !!arg
+ else if (arg === '--')
+ dashdash = true
+ else if (arg === '--no-glob' || arg === '-G')
+ noglob = true
+ else if (arg === '--glob' || arg === '-g')
+ noglob = false
+ else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
+ help = true
+ else
+ return !!arg
+})
+
+if (help || args.length === 0) {
+ // If they didn't ask for help, then this is not a "success"
+ var log = help ? console.log : console.error
+ log('Usage: rimraf <path> [<path> ...]')
+ log('')
+ log(' Deletes all files and folders at "path" recursively.')
+ log('')
+ log('Options:')
+ log('')
+ log(' -h, --help Display this usage info')
+ log(' -G, --no-glob Do not expand glob patterns in arguments')
+ log(' -g, --glob Expand glob patterns in arguments (default)')
+ process.exit(help ? 0 : 1)
+} else
+ go(0)
+
+function go (n) {
+ if (n >= args.length)
+ return
+ var options = {}
+ if (noglob)
+ options = { glob: false }
+ rimraf(args[n], options, function (er) {
+ if (er)
+ throw er
+ go(n+1)
+ })
+}
diff --git a/node_modules/copy-concurrently/node_modules/rimraf/package.json b/node_modules/copy-concurrently/node_modules/rimraf/package.json
new file mode 100644
index 0000000..300c49a
--- /dev/null
+++ b/node_modules/copy-concurrently/node_modules/rimraf/package.json
@@ -0,0 +1,67 @@
+{
+ "_from": "rimraf@^2.5.4",
+ "_id": "rimraf@2.7.1",
+ "_inBundle": false,
+ "_integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "_location": "/copy-concurrently/rimraf",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "rimraf@^2.5.4",
+ "name": "rimraf",
+ "escapedName": "rimraf",
+ "rawSpec": "^2.5.4",
+ "saveSpec": null,
+ "fetchSpec": "^2.5.4"
+ },
+ "_requiredBy": [
+ "/copy-concurrently"
+ ],
+ "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "_shasum": "35797f13a7fdadc566142c29d4f07ccad483e3ec",
+ "_spec": "rimraf@^2.5.4",
+ "_where": "/home/pruss/Dev/3-minute-website/node_modules/copy-concurrently",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "bugs": {
+ "url": "https://github.com/isaacs/rimraf/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "deprecated": false,
+ "description": "A deep deletion module for node (like `rm -rf`)",
+ "devDependencies": {
+ "mkdirp": "^0.5.1",
+ "tap": "^12.1.1"
+ },
+ "files": [
+ "LICENSE",
+ "README.md",
+ "bin.js",
+ "rimraf.js"
+ ],
+ "homepage": "https://github.com/isaacs/rimraf#readme",
+ "license": "ISC",
+ "main": "rimraf.js",
+ "name": "rimraf",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/rimraf.git"
+ },
+ "scripts": {
+ "postpublish": "git push origin --all; git push origin --tags",
+ "postversion": "npm publish",
+ "preversion": "npm test",
+ "test": "tap test/*.js"
+ },
+ "version": "2.7.1"
+}
diff --git a/node_modules/copy-concurrently/node_modules/rimraf/rimraf.js b/node_modules/copy-concurrently/node_modules/rimraf/rimraf.js
new file mode 100644
index 0000000..a90ad02
--- /dev/null
+++ b/node_modules/copy-concurrently/node_modules/rimraf/rimraf.js
@@ -0,0 +1,372 @@
+module.exports = rimraf
+rimraf.sync = rimrafSync
+
+var assert = require("assert")
+var path = require("path")
+var fs = require("fs")
+var glob = undefined
+try {
+ glob = require("glob")
+} catch (_err) {
+ // treat glob as optional.
+}
+var _0666 = parseInt('666', 8)
+
+var defaultGlobOpts = {
+ nosort: true,
+ silent: true
+}
+
+// for EMFILE handling
+var timeout = 0
+
+var isWindows = (process.platform === "win32")
+
+function defaults (options) {
+ var methods = [
+ 'unlink',
+ 'chmod',
+ 'stat',
+ 'lstat',
+ 'rmdir',
+ 'readdir'
+ ]
+ methods.forEach(function(m) {
+ options[m] = options[m] || fs[m]
+ m = m + 'Sync'
+ options[m] = options[m] || fs[m]
+ })
+
+ options.maxBusyTries = options.maxBusyTries || 3
+ options.emfileWait = options.emfileWait || 1000
+ if (options.glob === false) {
+ options.disableGlob = true
+ }
+ if (options.disableGlob !== true && glob === undefined) {
+ throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
+ }
+ options.disableGlob = options.disableGlob || false
+ options.glob = options.glob || defaultGlobOpts
+}
+
+function rimraf (p, options, cb) {
+ if (typeof options === 'function') {
+ cb = options
+ options = {}
+ }
+
+ assert(p, 'rimraf: missing path')
+ assert.equal(typeof p, 'string', 'rimraf: path should be a string')
+ assert.equal(typeof cb, 'function', 'rimraf: callback function required')
+ assert(options, 'rimraf: invalid options argument provided')
+ assert.equal(typeof options, 'object', 'rimraf: options should be object')
+
+ defaults(options)
+
+ var busyTries = 0
+ var errState = null
+ var n = 0
+
+ if (options.disableGlob || !glob.hasMagic(p))
+ return afterGlob(null, [p])
+
+ options.lstat(p, function (er, stat) {
+ if (!er)
+ return afterGlob(null, [p])
+
+ glob(p, options.glob, afterGlob)
+ })
+
+ function next (er) {
+ errState = errState || er
+ if (--n === 0)
+ cb(errState)
+ }
+
+ function afterGlob (er, results) {
+ if (er)
+ return cb(er)
+
+ n = results.length
+ if (n === 0)
+ return cb()
+
+ results.forEach(function (p) {
+ rimraf_(p, options, function CB (er) {
+ if (er) {
+ if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
+ busyTries < options.maxBusyTries) {
+ busyTries ++
+ var time = busyTries * 100
+ // try again, with the same exact callback as this one.
+ return setTimeout(function () {
+ rimraf_(p, options, CB)
+ }, time)
+ }
+
+ // this one won't happen if graceful-fs is used.
+ if (er.code === "EMFILE" && timeout < options.emfileWait) {
+ return setTimeout(function () {
+ rimraf_(p, options, CB)
+ }, timeout ++)
+ }
+
+ // already gone
+ if (er.code === "ENOENT") er = null
+ }
+
+ timeout = 0
+ next(er)
+ })
+ })
+ }
+}
+
+// Two possible strategies.
+// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong. However, there
+// are likely far more normal files in the world than directories. This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow. But until then, YAGNI.
+function rimraf_ (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // sunos lets the root user unlink directories, which is... weird.
+ // so we have to lstat here and make sure it's not a dir.
+ options.lstat(p, function (er, st) {
+ if (er && er.code === "ENOENT")
+ return cb(null)
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er && er.code === "EPERM" && isWindows)
+ fixWinEPERM(p, options, er, cb)
+
+ if (st && st.isDirectory())
+ return rmdir(p, options, er, cb)
+
+ options.unlink(p, function (er) {
+ if (er) {
+ if (er.code === "ENOENT")
+ return cb(null)
+ if (er.code === "EPERM")
+ return (isWindows)
+ ? fixWinEPERM(p, options, er, cb)
+ : rmdir(p, options, er, cb)
+ if (er.code === "EISDIR")
+ return rmdir(p, options, er, cb)
+ }
+ return cb(er)
+ })
+ })
+}
+
+function fixWinEPERM (p, options, er, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+ if (er)
+ assert(er instanceof Error)
+
+ options.chmod(p, _0666, function (er2) {
+ if (er2)
+ cb(er2.code === "ENOENT" ? null : er)
+ else
+ options.stat(p, function(er3, stats) {
+ if (er3)
+ cb(er3.code === "ENOENT" ? null : er)
+ else if (stats.isDirectory())
+ rmdir(p, options, er, cb)
+ else
+ options.unlink(p, cb)
+ })
+ })
+}
+
+function fixWinEPERMSync (p, options, er) {
+ assert(p)
+ assert(options)
+ if (er)
+ assert(er instanceof Error)
+
+ try {
+ options.chmodSync(p, _0666)
+ } catch (er2) {
+ if (er2.code === "ENOENT")
+ return
+ else
+ throw er
+ }
+
+ try {
+ var stats = options.statSync(p)
+ } catch (er3) {
+ if (er3.code === "ENOENT")
+ return
+ else
+ throw er
+ }
+
+ if (stats.isDirectory())
+ rmdirSync(p, options, er)
+ else
+ options.unlinkSync(p)
+}
+
+function rmdir (p, options, originalEr, cb) {
+ assert(p)
+ assert(options)
+ if (originalEr)
+ assert(originalEr instanceof Error)
+ assert(typeof cb === 'function')
+
+ // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+ // if we guessed wrong, and it's not a directory, then
+ // raise the original error.
+ options.rmdir(p, function (er) {
+ if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
+ rmkids(p, options, cb)
+ else if (er && er.code === "ENOTDIR")
+ cb(originalEr)
+ else
+ cb(er)
+ })
+}
+
+function rmkids(p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.readdir(p, function (er, files) {
+ if (er)
+ return cb(er)
+ var n = files.length
+ if (n === 0)
+ return options.rmdir(p, cb)
+ var errState
+ files.forEach(function (f) {
+ rimraf(path.join(p, f), options, function (er) {
+ if (errState)
+ return
+ if (er)
+ return cb(errState = er)
+ if (--n === 0)
+ options.rmdir(p, cb)
+ })
+ })
+ })
+}
+
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p, options) {
+ options = options || {}
+ defaults(options)
+
+ assert(p, 'rimraf: missing path')
+ assert.equal(typeof p, 'string', 'rimraf: path should be a string')
+ assert(options, 'rimraf: missing options')
+ assert.equal(typeof options, 'object', 'rimraf: options should be object')
+
+ var results
+
+ if (options.disableGlob || !glob.hasMagic(p)) {
+ results = [p]
+ } else {
+ try {
+ options.lstatSync(p)
+ results = [p]
+ } catch (er) {
+ results = glob.sync(p, options.glob)
+ }
+ }
+
+ if (!results.length)
+ return
+
+ for (var i = 0; i < results.length; i++) {
+ var p = results[i]
+
+ try {
+ var st = options.lstatSync(p)
+ } catch (er) {
+ if (er.code === "ENOENT")
+ return
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er.code === "EPERM" && isWindows)
+ fixWinEPERMSync(p, options, er)
+ }
+
+ try {
+ // sunos lets the root user unlink directories, which is... weird.
+ if (st && st.isDirectory())
+ rmdirSync(p, options, null)
+ else
+ options.unlinkSync(p)
+ } catch (er) {
+ if (er.code === "ENOENT")
+ return
+ if (er.code === "EPERM")
+ return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
+ if (er.code !== "EISDIR")
+ throw er
+
+ rmdirSync(p, options, er)
+ }
+ }
+}
+
+function rmdirSync (p, options, originalEr) {
+ assert(p)
+ assert(options)
+ if (originalEr)
+ assert(originalEr instanceof Error)
+
+ try {
+ options.rmdirSync(p)
+ } catch (er) {
+ if (er.code === "ENOENT")
+ return
+ if (er.code === "ENOTDIR")
+ throw originalEr
+ if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
+ rmkidsSync(p, options)
+ }
+}
+
+function rmkidsSync (p, options) {
+ assert(p)
+ assert(options)
+ options.readdirSync(p).forEach(function (f) {
+ rimrafSync(path.join(p, f), options)
+ })
+
+ // We only end up here once we got ENOTEMPTY at least once, and
+ // at this point, we are guaranteed to have removed all the kids.
+ // So, we know that it won't be ENOENT or ENOTDIR or anything else.
+ // try really hard to delete stuff on windows, because it has a
+ // PROFOUNDLY annoying habit of not closing handles promptly when
+ // files are deleted, resulting in spurious ENOTEMPTY errors.
+ var retries = isWindows ? 100 : 1
+ var i = 0
+ do {
+ var threw = true
+ try {
+ var ret = options.rmdirSync(p, options)
+ threw = false
+ return ret
+ } finally {
+ if (++i < retries && threw)
+ continue
+ }
+ } while (true)
+}
diff --git a/node_modules/copy-concurrently/package.json b/node_modules/copy-concurrently/package.json
new file mode 100644
index 0000000..7f635b8
--- /dev/null
+++ b/node_modules/copy-concurrently/package.json
@@ -0,0 +1,74 @@
+{
+ "_from": "copy-concurrently@^1.0.0",
+ "_id": "copy-concurrently@1.0.5",
+ "_inBundle": false,
+ "_integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "_location": "/copy-concurrently",
+ "_phantomChildren": {
+ "glob": "7.1.6"
+ },
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "copy-concurrently@^1.0.0",
+ "name": "copy-concurrently",
+ "escapedName": "copy-concurrently",
+ "rawSpec": "^1.0.0",
+ "saveSpec": null,
+ "fetchSpec": "^1.0.0"
+ },
+ "_requiredBy": [
+ "/move-concurrently"
+ ],
+ "_resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "_shasum": "92297398cae34937fcafd6ec8139c18051f0b5e0",
+ "_spec": "copy-concurrently@^1.0.0",
+ "_where": "/home/pruss/Dev/3-minute-website/node_modules/move-concurrently",
+ "author": {
+ "name": "Rebecca Turner",
+ "email": "me@re-becca.org",
+ "url": "http://re-becca.org/"
+ },
+ "bugs": {
+ "url": "https://github.com/npm/copy-concurrently/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ },
+ "deprecated": false,
+ "description": "Promises of copies of files, directories and symlinks, with concurrency controls and win32 junction fallback.",
+ "devDependencies": {
+ "standard": "^8.6.0",
+ "tacks": "^1.2.6",
+ "tap": "^10.1.1"
+ },
+ "directories": {
+ "test": "test"
+ },
+ "files": [
+ "copy.js",
+ "is-windows.js"
+ ],
+ "homepage": "https://www.npmjs.com/package/copy-concurrently",
+ "keywords": [
+ "copy",
+ "cpr"
+ ],
+ "license": "ISC",
+ "main": "copy.js",
+ "name": "copy-concurrently",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/copy-concurrently.git"
+ },
+ "scripts": {
+ "test": "standard && tap --coverage test"
+ },
+ "version": "1.0.5"
+}